Spring security 使用具有上下文特定权限的Spring安全授权

Spring security 使用具有上下文特定权限的Spring安全授权,spring-security,Spring Security,我们需要向应用程序添加访问控制,确保每个命令都由对给定域对象具有适当权限的用户执行。我们已经在使用SpringSecurity4.0进行身份验证,并打算将其用于授权 使这种情况变得复杂的是授予给定用户权限的方式。在我们的问题空间中,一个用户可以找到几家公司并雇佣其他用户,使他们成为员工。每个用户可以是多个公司的员工。某些权限可以直接授予用户(如canResetOtherUserPassword);公司还可以根据员工在公司中的角色向其授予其他权限(如canOpenProject、canRename

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

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

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

long openProject(long companyId, String title)
void renameProject(long projectId, String title)
为了控制对第一种方法的访问,授权组件可以通过线程本地SecurityContext.authentication检索代理用户,使用companyId参数检索公司,检索与当前用户对应的员工,然后将员工特定权限与所需的项目权限进行匹配

为了控制对第二种方法的访问,授权组件可以再次通过线程local SecurityContext.authentication检索代理用户,使用projectId检索项目,通过Project.ownerCompanyId检索所有者公司,检索与当前用户对应的员工,然后根据所需的canRenameProject匹配员工特定的权限

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

有什么想法吗


提前谢谢

您可以实现UserDetails(org.springframework.security.core.UserDetails.UserDetails)或只是扩展UserDetails的默认实现,比如User(org.springframework.security.core.UserDetails.User)--->CustomUserDetails和其他属性,比如company(带有getter)

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

参考:第10章(您需要返回第3章了解UserDetails实现)
这对我很有用

感谢您提供参考文档的指针。问题是有时我没有companyId参数,比如在renameProject方法中。我想我将不得不求助于实现定制的PermissionEvaluator。