Spring Security
使用FilterSecurityInterceptor
过滤器来进行URL权限校验,实际使用流程大致如下:
- 通过数据库动态配置url资源权限
- 系统启动时,通过
FilterSecurityInterceptor
滤器到数据库加载系统资源权限列表 - 用户登陆时通过自定义的
UserDetailsService
加载当前用户的角色列表 - 当有请求访问时,通过
FilterSecurityInterceptor
对比系统资源权限列表和用户资源权限列表(在用户登录时添加到用户信息中)来判断用户是否有该url的访问权限。
自定义URL权限验证需要在FilterSecurityInterceptor
自定义的配置项
securityMetadataSource
:实现FilterInvocationSecurityMetadataSource
接口,在实现类中加载资源权限,并在filterSecurityInterceptor
中注入该实现类。accessDecisionManager
:通过实现AccessDecisionManager
接口自定义一个决策管理器,判断是否有访问权限。判断逻辑可以写在决策管理器的决策方法中,也可以通过投票器实现,除了框架提供的三种投票器还可以添加自定义投票器。自定义投票器通过实现AccessDecisionVoter
接口来实现。
下是Spring Security官方文档提供的一个图,其展示了与基于投票的AccessDecisionManager实现相关的类
权限校验异常需要在ExceptionTranslationFilter
自定义的配置项
1、AuthenticationEntryPoint
用来解决匿名用户访问无权限资源时的异常
2、AccessDeineHandler
用来解决登陆认证过的用户访问无权限资源时的异常
demo代码如下:
1、自定义securityMetadataSource
从数据库加载动态配置的角色url资源权限
@Component
public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
private Map<RequestMatcher, Collection<ConfigAttribute>> allRoleSource = new HashMap<>();
public MyFilterInvocationSecurityMetadataSource(){
//模拟从数据库加载角色URL权限信息
Map<String,String> urlRoleMap = new HashMap<String,String>(){
{
put("/open/**","ROLE_ANONYMOUS");
put("/home","ADMIN,USER");
put("/admin/**","ADMIN");
put("/user/**","ADMIN,USER");
}};
Map<RequestMatcher, Collection<ConfigAttribute>> loadRequestMap = new HashMap<>();
for(Map.Entry<String,String> entry:urlRoleMap.entrySet()