使用的版本是Springsecurity的4.2.x版本。
业务场景是这样的,系统中存在很多用户,超级管理员要有个功能,就是可以切换用户,比如超级管理员,可以切换为系统中的任何一个用户。Spingsecurity提供了一个SwitchUserFilter,我们就用这个来实现功能。
1、先来看怎么使用
List-1.1
定义switchUserFilter这个bean,如下List-1所示。用过Springsecurity的,应该知道UserDetailsService,这里就不再细讲。
usernameParameter的值是userNo,会从HttpServletRequest中获取key为userNo的值,之后用这个值从UserDetailsService中获得UserDetails。
switchUserUrl,SwitchUserFilter是个Filter,会拦截请求,之后判断请求的url是否是switchUserUrl,如果是就执行SwitchUserFilter里面的逻辑,如果不是,就将请求转给后面的Filter。
List-1.1之后,将SwitchUserFilter放在FILTER_SECURITY_INTERCEPTOR之后,为什么呢?因为accessDecisionManager在FILTER_SECURITY_INTERCEPTOR中,即判断是否有访问资源的权限是在FILTER_SECURITY_INTERCEPTOR中,判断过权限之后才到SwitchUserFilter。
List-1.2
...
...
2、SwitchUserFilter的源