【发布时间】:2019-03-13 05:39:53
【问题描述】:
我需要某种@preFilter(或者,如果不可能,则比@postFilter)来过滤我的REST API 的结果。我不能使用preFilterannotation,因为我需要考虑用户角色。我有三个不同的角色:
user普通用户,只能访问自己拥有的数据teamleader这个角色应该访问他团队的所有数据admin可以访问所有数据。
因为我们的数据库结构非常复杂,所以在我决定用户是否可以访问请求的数据或请求的部分数据之前,有必要访问一些其他数据。
sn-p 仅适用于角色user 和admin。对于teamleader来说会更复杂,然后会有一堆masterDataId必须和or连接。
这是一些伪代码,希望它不会混淆:
public class RoleFilter {
DimensionAttributeValueRepository dimensionAttributeValueRepository;
public void doFilter(Collection<AllDatas> data) {
if (user.getRole() != "admin") {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
DimensionAttributeValue tmpValue = dimensionAttributeValueRepository.findByChrValue(auth.getUsername());
MasterData masterData = tmpValue.getMasterData();
data.filter(data.masterDataId == masterData.getMasterDataID());
}
}
}
更新:示例
假设我有两个用户,用户 A 是角色“用户”的普通用户。用户 B 是具有“admin”角色的管理员。
有一个数据库表,其中存储了userData。该表如下所示。
| ID | username | name | email |
他们都向/userData发送了一个简单的认证GET请求。
现在我的后端根据authentication 标头检测用户并添加角色。
根据角色,用户 A 应该只得到一个包含他的个人数据的答案,用户 B 应该得到所有可以通过/userData 访问的数据。
用户 A 的响应:
{
"res":[
{
"id":1,
"username":"userA",
"name":"A",
"email":"userA@mail.com"
}
]
}
用户 B 的响应:
{
"res":[
{
"id":1,
"username":"userA",
"name":"A",
"email":"userA@mail.com"
},
{
"id":2,
"username":"userB",
"name":"B",
"email":"userB@mail.com"
},
{
"id":3,
"username":"userC",
"name":"C",
"email":"userC@mail.com"
}
]
}
【问题讨论】:
标签: rest security spring-boot filter user-roles