1

アプリケーションにアクセス制御を実装する必要があり、そのためにSpringACLを使用しています。私のモデルには、ユーザー、グループ、権限があります。

私が解決しようとしている問題は、ユーザーのドメインオブジェクトに対するアクセス許可を取得することです。そのユーザーのすべてのアクセス制御エントリ(プリンシパルsidとグループsid)を取得でき、それを使用して、すべてのアクセス許可を結合することにより、最終的なアクセス許可のセットを取得できました。結合されたマスクが111であるとしましょう。これは、BasePermissionsで定義されたアクセス許可に従って、読み取り、書き込み、および作成のアクセス許可になります。
私が現在直面している問題は、マスクを個々のアクセス許可と比較できるように、定義されているすべての基本アクセス許可のリストを取得する方法が見つからないことです。基本権限クラスはそのようなメソッドを提供していないようです。パーミッションの数は将来増える可能性があるため、if-then句でケースをハードコーディングしたくありません。

任意のポインタをいただければ幸いです。ありがとう。

4

3 に答える 3

1

Permission インスタンスの配列をパラメーターとして hasPermission メソッドに渡すことにより、 AclPermissionEvaluatorを使用して権限を確認できます。実装については、指定されたリンクのソースを確認してください。

@Autowired
private PermissionEvaluator permissionEvaluator ;

........

Object permission = new Permission[]{permissionFactory.buildFromName("READ"),permissionFactory.buildFromName("WRITE"), permissionFactory.buildFromName("CREATE")};

permissionEvaluator.hasPermission(authentication, oid, permission);

この回答で述べたように、春のコンテキストに AclPermissionEvaluator を登録することを忘れないでください。

UPDATE : ユーザーがドメイン オブジェクトに対して持っているすべての権限を取得するには --

private SidRetrievalStrategy sidRetrievalStrategy = new SidRetrievalStrategyImpl();

.......

List<Sid> sids = sidRetrievalStrategy.getSids(authentication);
// Lookup only ACLs for SIDs we're interested in
Acl acl = aclService.readAclById(oid, sids);
List<AccessControlEntry> aces = acl.getEntries();
List<String> permissionsList = new ArrayList<String>();
for (AccessControlEntry ace : aces ) {
    permissionsList.add(ace.getPermission().getPattern());
}
于 2012-10-23T07:12:32.527 に答える
0

@Ravi が言ったように: BasicLookupStrategy.class を使用する場合、クラス JdbcAclService からメソッド readAclById を使用しても機能しません。LookupStrategy.readAclsById を使用するためです (2 番目のパラメーター sids は無視されます)。カスタムのルックアップ戦略を作成することをお勧めします。

于 2016-02-25T09:17:58.700 に答える
0

あなたがやろうとしているのは、 CumulativePermission に特定の権限があるかどうかを確認することです。この方法を使用してそれを行うことができます:

public static boolean containsPermission(Permission cumulativePermission, Permission singlePermission) {
    return (cumulativePermission.getMask() & singlePermission.getMask()) == singlePermission.getMask();
}
于 2016-05-03T20:24:34.253 に答える