使用 Spring Security的时候怎么切换用户(SwitchUserFilter的使用)

龙星辰
2023-12-01

对于Spring Security我也是针对公司的系统才接触到的,最近用个需求是可以在管理员登录以后可以进行切换用户(无感状态下)。

要实现这个功能,其实原理我们应该都知道的:

无非就是先将现有的用户从我们系统中退出,然后将选择切换的用户无密码登录。 

所以我就找了一下Security的有关资料,发现其实大体的方法就那么几种,其他的方法咱们这篇博客就不叙述了,咱们重点说一下Security自带的过滤器SwitchUserFilter,这个是目前我觉得实现这个功能比较好的一个方式,它可以做到切换时无需输入密码可以直接切换到对应的用户

说到SwitchUserFilter,我们可以看一下Spring Security里Filter介绍

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知道你请求的是切换用的请求,所以我们得配置一下请求路径。

 类似资料: