将Spring Security授权与特定于上下文的权限一起使用

时间:2015-03-15 03:30:49

标签: spring-security

我们需要向应用程序添加访问控制,确保每个命令都由具有给定域对象的适当权限的用户执行。我们已经使用Spring Security 4.0进行身份验证,并打算将其用于授权。

这种复杂性的原因在于授予给定用户权限的方式。在我们的问题空间中,用户可以找到几家公司并聘请其他用户,使他们成为员工。每个用户都可以是多家公司的员工。有些权限可以直接授予用户(例如canResetOtherUserPassword);其他权限也可以由公司根据其在公司中的角色授予员工(例如canOpenProject,canRenameProject)。执行与公司无关的命令时,必须由服务层检查用户特定的权限。执行公司特定命令(例如,为公司打开项目,重命名现有项目)时,必须检查特定于员工的权限。

现在让我们考虑最后两个命令,它们将具有以下服务签名:

long openProject(long companyId, String title)
void renameProject(long projectId, String title)

要控制第一种方法的访问权限,授权组件可以通过线程本地SecurityContext.authentication检索代理用户,使用companyId参数检索公司,检索与当前用户对应的Employee,然后匹配Employee特定的当局反对所需的canOpenProject权限。

要控制第二种方法的访问权限,授权组件可以再次通过线程本地SecurityContext.authentication检索代理用户,使用projectId检索项目,通过project.ownerCompanyId检索所有者公司,检索对应的Employee然后,当前用户将针对所需的canRenameProject的Employee特定权限进行匹配。

显然,这可以使用程序代码来完成,正如我刚才所描述的那样。我们宁愿使用类似于Spring Security已经提供的@PreAuthorize拦截器的声明性方法,显然要尽可能少地编写代码。我们只是不知道从哪里开始。

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以实现UserDetails(org.springframework.security.core.userdetails.UserDetails)或仅扩展UserDetails的默认实现,例如User(org.springframework.security.core.userdetails.User)---> CustomUserDetails具有其他属性,如company(带有getter)。

最后:简单地使用@PreAuthorize(“principal.company.companyId == #companyId”)

参考:Spring Security 3.1第10章(你需要回到第3章,了解UserDetails的实现) 这个对我很有帮助 !