1

我必须在我的应用程序中实现访问控制,并且我正在为此使用 spring ACL。我的模型有用户、组、权限。

我要解决的问题是为用户获取域对象的权限。我能够获取该用户的所有访问控制条目(主体 sid 和组 sid),并使用它通过对所有权限进行联合来获得最终的一组权限。假设组合掩码为 111,即按照 BasePermissions 中定义的权限的读取、写入和创建权限。
我现在面临的问题是我找不到任何方法来获取所有已定义基本权限的列表,以便我可以将掩码与单个权限进行比较。基本权限类似乎没有提供任何此类方法。我不想在 if-then 子句中硬编码案例,因为将来权限的数量可能会增加。

任何指针将不胜感激。谢谢。

4

3 回答 3

1

您可以使用AclPermissionEvaluator检查权限,方法是将 Permission 实例数组作为参数传递给 hasPermission 方法。检查给定链接中的源以进行实施。

@Autowired
private PermissionEvaluator permissionEvaluator ;

........

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

permissionEvaluator.hasPermission(authentication, oid, permission);

正如这个答案中提到的,不要忘记在你的 spring 上下文中注册 AclPermissionEvaluator 。

更新:要获得用户对域对象的所有权限——

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(忽略了第二个参数 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 回答