如何获取用户可以使用ACL相关表访问的对象列表

pVi*_*aca 5 acl spring-security spring-security-acl

我正在设计一个对用户管理/权限有很多要求的系统,因此我决定使用Spring Security ACL来管理Domain Objects级别的权限.

虽然,使用ACL来维护用户和实体之间的关系迫使我们依赖它来在UI上呈现数据.

Spring Security提供的PostFilter解决方案很好地过滤了用户可以/看不到的对象,但是当我们处理具有数百/数千个条目的实体时,它有很大的性能问题,因为我们需要从数据库加载所有内容,然后丢弃不允许用户"查看"的对象.

这个问题在这里描述 - SEC-2409 - 但是这个功能可用还需要一些时间.所以,我正在尝试找到一种使用Spring Security ACL的解决方法,但避免了性能问题.

我考虑实现一些代码来检索用户可以访问的对象(在身份验证过程之后)并保持该信息可用于每个请求,以允许开发人员使用该信息来执行查询而不依赖于PostFilter .

为了实现这一点,我试图找到一种方法来检索给定主体/授权权限的权限列表,但我无法找到使用可用的AclService实现的方法.

示例:aclService.getObjectIdentityList(<sid>,<acl_class>)

注意:该方法应使用继承结构并包括从父条目继承的所有ObjectIdentities

有任何建议来获取数据或其他方法来解决这个问题吗?


UPDATE

我已经找到了一种方法来检索用户可以访问的对象列表.

List<ObjectIdentity> childObjects = aclService.findChildren(objectIdentity);
Map<ObjectIdentity, Acl> result = aclService.readAclsById(childObjects, sids);
Run Code Online (Sandbox Code Playgroud)

这种方法对我们有用,因为我们只有几个实体,访问权限由ACL控制,因此我们可以构造User具有访问权限的ObjectsIdentities列表.

虽然,正在返回的Map正在返回正在传递的ObjectIdentities的所有ACL,然后我需要检查用户是否有权访问正在返回的每个ObjectIdentity.

你有一个简单的方法来做到这一点或简化所有这些逻辑吗?

Rob*_*nch 2

当前处理较大数据集的方法是更新查询以在查询中包含当前登录的用户。例如,您可以使用 Spring Security 和 Spring Data 集成来更新查询以引用当前用户:

@Query("select d from MyDomain d where d.owner = #{principal.name}")
Run Code Online (Sandbox Code Playgroud)

显然这并不理想,因为您需要手动管理权限。一旦我们解决了SEC-2409 Spring 就可以自动为您完成许多繁重的工作。