因此,这些至少是两个问题:
如何使授予的权限/特权/角色动态化?
如何使URL的访问限制动态化?
1)如何使授予的权限/特权/角色动态化?
我不会详细回答这个问题,因为我相信这个主题经常被讨论。
最简单的方法是将完整的用户信息(登录名,密码和角色)存储在数据库(3个表:User,Roles,User2Roles)中并使用
JdbcDetailService。您可以在xml配置中很好地配置两个SQL语句(用于身份验证和授予角色)。
但是随后,用户需要注销并登录以获取这些新角色。如果这是不可接受的,那么您还必须操纵当前登录用户的角色。它们存储在用户会话中。我想最简单的方法是在spring安全过滤器链中添加一个过滤器,以更新每个请求的角色(如果需要更改)。
2)如何使URL的访问限制动态化?
在这里,您最后有两种方法:
入侵
FilterSecurityInterceptor
和更新securitymetadataSource
,所需的角色应存储在此处。至少您必须操纵方法的输出DefaultFilterInvocationSecuritymetadataSource#lookupAttributes(String url, String method)
另一种方法是对
access
属性使用其他表达式,而不是access="hasRole('ROLE_USER')"。范例:access="isAllowdForUserPages1To3"
。当然,您必须创建该方法。这被称为“自定义SpEL表达式处理程序”(如果您有Spring Security 3 Book,则在第210页左右。希望他们有章号!)。因此,您现在需要做的是继承WebSecurityexpressionRoot
并引入一个新方法isAllowdForUserPages1To3
。然后,您需要对方法进行子类化DefaultWebSecurityexpressionHandler
和修改,createevaluationContext
以便其第一个请求StandartevaluationContext
调用super
(您需要将结果转换为StandartevaluationContext
)。然后,使用您的新实现替换rootObject中的。那是困难的部分!然后,你需要更换的属性(StandartevaluationContextCustomWebSecurityexpressionRootexpressionHandlerexpressionVoterWebexpressionVoter)
,并在xml配置中添加新的子类DefaultWebSecurityexpressionHandler
。(这很烂,因为您首先需要明确地编写许多安全配置,因为您不能直接从安全名称空间访问它们。)



