spring - 在春季安全中实现每组授权的最佳方法
问题描述
我正在尝试根据用户在组中的角色为用户授权某些操作的最佳方法。
例如,彼得在 A 组中具有管理员角色,因此他可以踢 A 组中的成员和 B 组中的成员角色,因此他只能读取 B 组中的内容。
这就是用户组关系模型的样子。
有没有比在 UserDetails 中加载组角色更好的方法来实现授权,如下所示:
(for (GroupUser groupuser: user.getGroupUsers()) {
authorities.add(new SimpleGrantedAuthority('Group_'+groupuser.getId().getGroupId()+'_'+groupuser.getRole()));}
解决方案
这是ABAC权限模型,其安全决策不仅取决于用户的信息,还取决于受保护资源的状态/属性。
就 spring security 而言,最好使用@PreAuthorize
//实现@PostAuthorize
,@PostFilter
它允许您使用 SpEL 表达式来声明性地定义安全逻辑,这是一个最终将评估为真/假的表达式。在 SpEL 中,您可以访问执行您想要应用安全性的用例的方法的输入参数和返回对象,甚至可以引用 spring bean 来调用其方法进行评估。
例如,您可以执行以下操作:
@PreAuthorize("@authzService.isAllowToKickMember(principal , #userToKick)")
public void kickMemeber(User userToKick){
}
@Service
public class AuthzService{
public boolean isAllowToKickMember(User currentUser , User userToKick){
//check if current user can kick a given user
}
}
对于指针,请查看此。
推荐阅读
- python - Python:AttributeError:“ApiClient”对象没有属性“configure_jwt_authorization_flow”
- angular - 使用 Jasmine 更改模拟服务成员的值
- javascript - 我从 Apiary 得到的这个奇怪的代码是什么?
- reverse-engineering - 来自蛮力脚本的 Z3Py 求解器
- python - 如何在 python 中将关于时间的字符串拆分为单独的变量(hr、min、sec)?
- machine-learning - 评估替代分类器时,RandomizedSearchCV 在管道中不起作用
- python-3.x - 运行 JupyterHub 的 validate_elements 中的 Python Traitlets 错误
- python-3.x - matplotlib 图形在不调用 plt.show() 的情况下显示,plt.show() 不会在 Jupyter Notebook 的单独单元格中显示图形
- php - Laravel API 只返回最新的记录,而不是数据库中显示的用户下的所有记录
- python - 使用python在包含混乱用户条目的巨大文本文件中拆分行