在我的应用程序中,我有一个名为组织的顶级实体。用户和组织之间是多对多的关系。
因此我可能会遇到以下情况:
- 用户 A 拥有组织 A 的 ROLE_ADMIN 角色
- 用户 A 拥有 OrganizationB 的角色 ROLE_USER
我需要确保当用户 A 访问 OrganizationB 的资源时,他不是以管理员身份执行此操作。因此,我需要额外检查用户在组织级别是否具有正确的角色。 Spring Security 中是否有内置的东西可以实现这一点?如果没有,有谁知道解决这个问题的最佳方法是什么?
更新:更多信息...
用户登录并选择他们想要合作的组织。这是存储在 session 中的。除此之外,URL 还通过安全注释进行锁定。这意味着,如果用户 A 登录并选择 OrgA,他们应该能够访问/admin/user/create,但是,如果他们登录并选择 OrgB,他们就不应访问该 URL。
长远的方法是在每个重要的方法中添加额外的检查。因此,调用一些服务方法,显示“好吧,您是 OrgA 的管理员,但不是 OrgB 的管理员,并且您使用 OrgB 登录,因此拒绝此请求”。
我希望有一种更多的 grails/spring-security 方式来处理这个问题。
最佳答案
您可以通过使用自定义 AccessDecisionVoter
来完成此操作。 vote
方法将为您提供资源(方法或 URL)的“配置属性”,通常是所需的角色,并且您可以直接从Authentication
对象,或者通过读取当前组织并为用户选择适当的角色。
我假设您有某种方法可以根据用户选择的组织来区分用户的角色。
本质上,您将编写标准 RoleVoter
的扩展版本,其中考虑了组织。
关于grails - 每个组织的 Spring Security 用户角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10875042/