第 20 章 切换用户

Spring Security提供了一种称为切换用户的机制,可以使管理员免于进过登录的操作,直接切换当前用户,从而改变当前的操作权限。因为按照责权分离的原则,系统内的超级管理员应该只有管理权限,而没有操作权限,所以为了在改变操作后可以测试系统的操作,需要降低权限才可以进入操作界面,这时就可以使用切换用户的功能。

20.1. 配置方式

在xml中添加SwitchUser的配置。

<http auto-config='true'>
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/user.jsp" access="ROLE_USER" />
    <intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
    <session-management session-fixation-protection="migrateSession"/>
    <custom-filter position="SWITCH_USER_FILTER" ref="switchUserProcessingFilter" />
</http>

<beans:bean id="switchUserProcessingFilter"
        class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter" autowire="byType">
    <beans:property name="targetUrl" value="/index.jsp"/>
</beans:bean>
        

它需要引用系统中的userDetailsService在切换用户时,根据对应的username获得切换后用户的信息和权限,我们还要使用custom-filter将该过滤器放到过滤器链中,注意必须放在用来验证权限的FilterSecurityInterceptor之后,这样可以控制当前用户是否拥有切换用户的权限。

现在,我们可以在系统中使用切换用户这一功能了,我们可以通过/j_spring_security_switch_user?j_username=user切换到j_username指定的用户,这样可以快捷的获得目标用户的信息和权限。当需要返回管理员用户时,只需要通过/j_spring_security_exit_user就可以还原到切换前的状态。

20.2. 实例演示

现在我们进入实例,通过登录页面进行登录。因为实现了权责分离,admin/admin用户只能访问管理页面admin.jsp,不能访问user.jsp,user/user用户只能访问操作页面user.jsp,不能访问admin.jsp。

如果我们以管理员身份登录后,希望切换到user/user用户,可以调用/j_spring_security_switch_user?j_username=user切换到user/user用户,然后就可以使用user的权限访问user.jsp了。

在切换用户后,我们可以看到当前登录用户的权限中多了一个ROLE_PREVIOUS_ADMINISTRATOR,这其中就保存着前用户的权限信息,当我们通过/j_spring_security_exit_user退出切换用户模式时,系统就会从ROLE_PREVIOUS_ADMINISTRATOR中获得原始用户信息,重新进行授权。

实例在ch110。