信息软件中非常重要的问题之一是存在具有不同职责和访问级别的不同角色的用户。例如,考虑一个具有如下结构(层次结构)的组织:
[Organization Role ] [Organization ID]
CEO org01
Financial Assistant org0101
personnel 1
Software Assistant org0102
personnel 2
Commercial Assistant org0103
personnel 3
想象一下,这个组织有一个管理人员信息的系统。本系统显示人员信息的规则是每个用户都可以看到他所访问的组织的人员信息;例如,“user1”可以访问“财务助理”和“商务助理”级别,所以他只能看到“人员 1”和“人员 3”的信息。同样,'user2'只有'Commercial Assistant'级别的权限,所以他只能看到'personnel 3'的信息。因此,该系统中的每个用户都有特定的访问级别。现在考虑在这个系统中,每个用户在登录后只能看到他可以访问的人员信息。那么这个系统的表结构是这样的:
[Organization]
id
code
name
[Employee]
id
first_name
last_name
organization_id
[User]
id
user_name
password
[UserOrganization]
user_id
organization_id
以下查询足以为每个用户获取正确的人员信息结果:
select *
from employee e
where e.organization_id in
(select uo.organization_id
from user_organization uo
where uo.user_id=:authenticatedUserId)
如我们所见,以下条件定义了显示正确数据的访问逻辑:
e.organization_id in
(select uo.organization_id
from user_organization uo
where uo.user_id=:authenticatedUserId)
这种访问级别也称为“行级别安全性”(RLS)。另一方面,相应的存储库类可能有几个负责读取数据的方法,所有这些方法都必须满足适当的访问级别条件。在这种情况下,访问级别条件将在某些地方(方法)重复。似乎使用“休眠过滤器”将是解决此问题的正确方法。唯一需要的是一个过滤器,它获取经过身份验证的用户的 id 并在每个读取方法之前执行“启用过滤器”命令。
@Filters( {
@Filter(name=“EmployeeAuthorize", condition="(organization_id in (select uo.organization_id from user_organization uo where uo.user_id=:authenticatedUserId) ) ")
} )
现在的问题是,建议的解决方案是否正确?如果是,如何在spring数据中使用这种方法?PS:鉴于我们不想依赖数据库,数据库端的实现不可能是一个候选的解决方案,因此我们有义务在应用端(级别)实现它。