前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springsecurity之SwitchUserFilter切换用户

Springsecurity之SwitchUserFilter切换用户

作者头像
克虏伯
发布2019-04-15 10:10:51
1.6K0
发布2019-04-15 10:10:51
举报

    使用的版本是Springsecurity的4.2.x版本。

    业务场景是这样的,系统中存在很多用户,超级管理员要有个功能,就是可以切换用户,比如超级管理员,可以切换为系统中的任何一个用户。Spingsecurity提供了一个SwitchUserFilter,我们就用这个来实现功能。

1、先来看怎么使用

List-1.1

代码语言:javascript
复制
<bean id="switchUserFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter">
    <property name="userDetailsService" ref="userService"/>
    <property name="usernameParameter" value="userNo"/>
    <property name="switchUserUrl" value="/switch/user"/>
</bean>
  1. 定义switchUserFilter这个bean,如下List-1所示。用过Springsecurity的,应该知道UserDetailsService,这里就不再细讲。
  2. usernameParameter的值是userNo,会从HttpServletRequest中获取key为userNo的值,之后用这个值从UserDetailsService中获得UserDetails。
  3. 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

代码语言:javascript
复制
<security:http >
    ...
    <security:custom-filter ref="switchUserFilter" after="FILTER_SECURITY_INTERCEPTOR"/>
    ...
</security:http>

2、SwitchUserFilter的源码

                                                                                        图2.1

    如2.1所示,SwitchUserFilter继承了GenericFilterBean,它是Springframework中的类。SwitchUserFilter的doFilte方法如下List-2.1所示

List-2.1

代码语言:javascript
复制
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
		throws IOException, ServletException {
	HttpServletRequest request = (HttpServletRequest) req;
	HttpServletResponse response = (HttpServletResponse) res;

	// check for switch or exit request
	if (requiresSwitchUser(request)) {
		// if set, attempt switch and store original
		try {
			Authentication targetUser = attemptSwitchUser(request);

			// update the current context to the new target user
			SecurityContextHolder.getContext().setAuthentication(targetUser);

			// redirect to target url
			this.successHandler.onAuthenticationSuccess(request, response,
					targetUser);
		}
		catch (AuthenticationException e) {
			this.logger.debug("Switch User failed", e);
			this.failureHandler.onAuthenticationFailure(request, response, e);
		}

		return;
	}
...
  1. List-2.1中,requiresSwitchUser会判断request是否是switchUserUrl对应的请求。
  2. 获取Authentication只会,会将其设置到SecurityContextHolder.getContext()。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/12/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、先来看怎么使用
  • 2、SwitchUserFilter的源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档