对于Spring Security我也是针对公司的系统才接触到的,最近用个需求是可以在管理员登录以后可以进行切换用户(无感状态下)。
要实现这个功能,其实原理我们应该都知道的:
无非就是先将现有的用户从我们系统中退出,然后将选择切换的用户无密码登录。
所以我就找了一下Security的有关资料,发现其实大体的方法就那么几种,其他的方法咱们这篇博客就不叙述了,咱们重点说一下Security自带的过滤器SwitchUserFilter,这个是目前我觉得实现这个功能比较好的一个方式,它可以做到切换时无需输入密码可以直接切换到对应的用户。
说到SwitchUserFilter,我们可以看一下Spring Security里Filter介绍
不难发现,SwitchUserFilter是提供的filter里头顺序在最后的一个,它的功能应该就是当时设计者为了迎合这种切换用户的需求设计的。
使用SwitchUserFilter实现切换用户的功能流程执行顺序是:
begin:
用户正常登录
=======》选择切换用户
=======》Spring Security获取请求地址验证是否和设置的拦截地址(switchUserUrl)一致,如果是则执行切换用户操作(如果不是,则不执行)
=======》无感切换用户
end:
其他的话就不多说了,前面一串就是为了说明一下Spring Security用SwitchUserFilter实现用户切换其实其实是比较好的。
使用它其实挺简单的,我们来看一下怎么使用(我们系统是SSM系统)
先在Security的配置文件(xml文件)里将SwitchUserFilter配置一下
<bean id="switchUserFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter">
<!-- 这里是我们实现用户验证的实现类 -->
<property name="userDetailsService" ref="userDetails"/>
<!-- 这里是请求参数,可以是用户的ID或者userId这个可以自定义的,默认是j_username-->
<property name="usernameParameter" value="j_username"/>
<!-- 这里是我们请求的关于切换用户的请求地址 默认就是 /j_spring_security_switch_user 可以自己定义成需要的哦 -->
<property name="switchUserUrl" value="/j_spring_security_switch_user" />
<!-- 这里是我们切换成功之后需要跳转的地址 这个和登录成功地址一致就可以了-->
<property name="targetUrl" value="/success.jsp"/>
</bean>
除了bean我们需要配置以外,还需要在同一个xml文件里配置一下filter,网上文章说需要配置成
<security:http >
<security:custom-filter ref="switchUserFilter" after="FILTER_SECURITY_INTERCEPTOR"/>
</security:http>
我配置为上面这种是不成功的,我配置为如下参数是可以成功的
<security:http >
<security:custom-filter ref="switchUserFilter" position="SWITCH_USER_FILTER"/>
</security:http>
这个是可以成功的实现用户切换的,那么这样是不是就可以说可以了呢?
如果是Springboot系统,到此为止是可以成功的。
因为我们是SSM架构的系统,所以我们还需要做一步,就是在web.xml文件里配置一下我们配置的SwitchUserFilter拦截的switchUserUrl地址,这里是为了让Spring Security知道你请求的是切换用的请求,所以我们得配置一下请求路径。