3

Spring Security と ACL サポートを既存の GWT アプリケーションに統合しようとしていますが、役に立たない別のリンクをクリックすると、新しいマウスとキーボードが必要になると断言できます。Spring を使用して LDAP を介して Active Directory に対して認証を行うために必要なものを検討し、AD 属性 (つまり、グループ メンバーシップ) に基づいてカスタム アクセス許可を割り当てる方法を検討しました。カスタム ACL スキーマを使用してアクセス許可に対してカスタム チェックを実行する (真のビットマスク操作)。私が把握していないのは、ACL テーブルに何が入るかだけです。

ACL_SID

id:bigint (pk)
principal:boolean (ak)
sid:varchar (ak)

この表は一目瞭然です。ここでは主要でないエントリのみを使用します。

ACL_CLASS

id:bigint (pk)
class:varchar (ak)

この表も一目瞭然です。私が理解しているように、保護したいすべてのクラス/インターフェースのエントリを作成するだけです。

ACL_ENTRY

id:bigint (pk)
acl_object_identity:bigint (fak)
ace_order:int (ak)
sid:bigint (fk)
mask:bigint
granting:boolean
audit_success:boolean
audit_failure:boolean

この表もほとんど自明です。maskフィールドにbigint/longを使用してスキーマをカスタマイズしましたが、問題acl_object_identityは参照しているものから生じます。明らかに、それは のフィールドを指していますACL_OBJECT_IDENTITYが...

ACL_OBJECT_IDENTITY

id:bigint (pk)
object_id_class:bigint (fak)
object_id_identity:bigint (ak)
parent_object_identity:bigint (fk)
owner_sid:bigint (fk)
entries_inheriting:boolean

object_id_identity、なに?方法?Spring Security のアノテーションを介してどのように参照されますか?

MyClass.java

@PreAuthorize("hasPermission(#someInput, 'READ')")
public boolean myMethod(String someInput) {
    return true;
}

おそらく、どういうわけかフィールド#someInputを指しますが、どのように?ACL_OBJECT_IDENTITY.object_id_identity

4

3 に答える 3

1

まず、データを格納するための何らかのドメイン オブジェクト クラスが必要です。このクラスにはgetId()メソッドが必要です。例えば:

public class DomainObject {
    private Long id;
    private String data;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
}

安全な方法を次のように変更します。

@PreAuthorize("hasPermission(#someInput, 'READ')")
public boolean myMethod(DomainObject someInput) {
    return true;
}

今、someInput.getId()と同じACL_OBJECT_IDENTITY.object_id_identityです。

于 2013-05-08T13:14:58.933 に答える
0

Grails Spring Security ACL Plugin Documentation をご覧ください。特定のプラグインに使用されるドメイン クラスについて説明していますが、参考になるかもしれません。AclObjectIdentity と AbstractAclObjectIdentity を探します。

ACL_OBJECT_IDENTITY.object_id_identity フィールドはインスタンス ID であり、インスタンスを一意に識別します (object_id_class と共に)

あなたの例では、「someInput」がそのインスタンスになります。このコードは、前述のドキュメントから取得したものです。

@PreAuthorize("hasPermission(#report, delete) or hasPermission(#report, admin)")
void deleteReport(Report report) {
    report.delete()
}

それは自分自身を説明します。現在認証されているユーザーが、特定のレポート インスタンスの「管理者」または「削除」権限を持っている場合、レポートは削除されます。Report は、コード スニペットの someInput です。

お役に立てれば。

于 2013-05-08T12:33:50.787 に答える