Spring Security提供了一种称为切换用户的机制,可以使管理员免于进过登录的操作,直接切换当前用户,从而改变当前的操作权限。因为按照责权分离的原则,系统内的超级管理员应该只有管理权限,而没有操作权限,所以为了在改变操作后可以测试系统的操作,需要降低权限才可以进入操作界面,这时就可以使用切换用户的功能。
在xml中添加SwitchUser的配置。
<beans:bean id="switchUserProcessingFilter" class="org.springframework.security.ui.switchuser.SwitchUserProcessingFilter"> <custom-filter position="SWITCH_USER_FILTER" /> <beans:property name="userDetailsService" ref="org.springframework.security.userdetails.memory.InMemoryDaoImpl" /> <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就可以还原到切换前的状态。
现在我们进入实例,通过登录页面进行登录。因为实现了权责分离,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。