构建基于maven的综合项目(四)--自定义spring security过滤器
一、spring security--自定义过滤器
1、在上一篇的基础上,我们修改springSecuritySimple-config.xml文件
首先,我们要理解一个过滤器是怎么工作的,它主要依赖于下面三个部分:
AuthenticationManager认证管理器,实现用户认证入口
AccessDecisionManager:访问控制策略管理器,决策某个用户拥有的角色
securityMetadataSource:资源源数据定义,定义某一资源能被什么角色访问
我们使用的其实依旧是默认过滤器链中org.springframework.security.web.access.intercept.FilterSecurityInterceptor过滤器,只不过我们将其中重要的认证管理和资源源数据定义换成自己的东西,在AuthenticationManager中,我们不再采用以前获取数据的三种方式,而是用自定义的UserDetailService获取登陆用户信息,并赋值给认证管理器,在securityMetadataSource中,我们将url资源库中所有的url以及其匹配的角色进行了初始化,然后将每一个url请求和初始化数据比对,以判断是否授权用户。
2、MyUserDetailServiceImpl
我抽取了一个接口MyUserDetailService,接口继承org.springframework.security.core.userdetails.UserDetailsService
3、MySecurityMetadataSource
4、这样,我们以hj@163.com为例,实现用户角色和资源绑定的效果
eg.hj@163.com用户拥有ROLE_ADMIN角色,在登录访问"/securityLogin.do"url时,如果resource资源库中"/securityLogin.do"没有ROLE_ADMIN角色,该用户没有权限权限,应跳转到403页面,
用户角色:ROLE_ADMIN
用户角色:ROLE_GUEST
请求url:/securityLogin.do
请求url匹配角色:nobody
如果resource资源库中"/securityLogin.do"有ROLE_ADMIN角色,该用户才能访问
用户角色:ROLE_ADMIN
用户角色:ROLE_GUEST
请求url:/securityLogin.do
请求url匹配角色:ROLE_ADMIN
5、有了上面的基础,下面来设计用户权限管理
首先是在无用户状态下需要访问的url,不需要过滤器验证
其次设计一些公共url资源,并赋予给每个角色public void loadPublicResources(){List<Role> roles = roleService.getAllRoles();for(PublicResourceEnum publicResourceEnum : PublicResourceEnum.values()){Collection<ConfigAttribute> configAttributes = new ArrayList<ConfigAttribute>();for(Role role : roles){ConfigAttribute configAttribute = new SecurityConfig(role.getRoleName());configAttributes.add(configAttribute);}resourceMap.put(publicResourceEnum.getPublicResourcePath(), configAttributes);}}
这样一来,每个注册用户可以访问/*一级资源和"/owner/**二级地址下所有资源,其他二级资源就可以在resource表中指定,并指派给相应的role了