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

2023-11-25

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

尽管如此,使用 ACL 来维护用户和实体之间的关系迫使我们依赖它在 UI 上呈现数据。

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

这个问题在这里描述 -SEC-2409- 但该功能还需要一些时间才能可用。因此,我试图找到一种使用 Spring Security ACL 但避免性能问题的解决方法。

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

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

Example: aclService.getObjectIdentityList(<sid>,<acl_class>)

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

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


UPDATE

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

List<ObjectIdentity> childObjects = aclService.findChildren(objectIdentity);
Map<ObjectIdentity, Acl> result = aclService.readAclsById(childObjects, sids);

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

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

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


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

@Query("select d from MyDomain d where d.owner = #{principal.name}")

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐