我必须在我的应用程序中实现访问控制,我正在使用弹簧ACL。我的模型有用户,组,权限。
我想解决的问题是为用户获取域对象的权限。我能够获得该用户的所有访问控制条目(主要sid和组sid),并且使用它可以通过获取所有权限的联合来获得最终的权限集。假设组合掩码是111,它将是BasePermissions中定义的权限的读取,写入和创建权限。
我现在面临的问题是我找不到任何方法来获取所有已定义的基本权限的列表,以便我可以将掩码与各个权限进行比较。基本权限类似乎不提供任何此类方法。我不想在if-then子句中对案例进行硬编码,因为将来权限的数量可能会增加。
任何指针都将不胜感激。谢谢。
答案 0 :(得分: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);
正如本answer所述,不要忘记在春天的上下文中注册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());
}
答案 1 :(得分:0)
正如@Ravi所说:如果使用BasicLookupStrategy.class,则使用类JdbcAclService中的readAclById方法将无效。 Becasuse LookupStrategy.readAclsById(忽略了第二个参数sid)。我建议你写自定义查找。
答案 2 :(得分:0)
您要做的是检查CumulativePermission是否具有特定权限。您可以使用此方法执行此操作:
public static boolean containsPermission(Permission cumulativePermission, Permission singlePermission) {
return (cumulativePermission.getMask() & singlePermission.getMask()) == singlePermission.getMask();
}