Acegi : 使用SwitchUserProcessingFilter实现用户切换
2009-07-27 02:43
441 查看
最近我做的一个项目,需要拥有ROLE_ADMIN权限的管理员能快速切换到别的用户,不需要修改或知道该用户的密码. 比如说管理员甲拥有ROLE_ADMIN权限,那么他可以不必须知道用户乙的情况下,切换到乙的身份,以乙的身份执行超过,能执行的超过以乙的权限为准。通过Acegi是可以很容易实现的。Acegi里的SwitchUserProcessingFilter可以帮助完成这个功能。下面的步骤将展示,如果配置和使用它
1.
首先要配置filter chain, 应该包含SwitchUserProcessingFilter像下面
<!– ======================== FILTER CHAIN ======================= –>
<bean id=”filterChainProxy” class=”org.acegisecurity.util.FilterChainProxy”>
<property name=”filterInvocationDefinitionSource”>
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/images/**=#NONE#
/scripts/**=#NONE#
/styles/**=#NONE#
/
**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,
exceptionTranslationFilter,filterInvocationInterceptor,switchUserProcessingFilter
</value>
</property>
</bean>
必须注意这个过滤器必须放在filterInvocationInterceptor和FilterSecurityInterceptor的后面,不然任何角色都可以切换用户.
2.
给SwitchUserProcessingFilter定义一个bean
<bean id=”switchUserProcessingFilter” class=”org.acegisecurity.ui.switchuser.SwitchUserProcessingFilter”>
<property name=”userDetailsService” ref=”userDao” />
<property name=”switchUserUrl”><value>/j_acegi_switch_user</value></property>
<property name=”exitUserUrl”><value>/j_acegi_exit_user</value></property>
<property name=”targetUrl”><value>/mainMenu.html</value></property>
</bean>
在这里你只需要改的是targetUrl, 这个设置决定了,切换用户后将导向到那个页面.
userDao是一个一般的daoAuthenticationProvider
<bean id=”daoAuthenticationProvider” class=”org.acegisecurity.providers.dao.DaoAuthenticationProvider”>
<property name=”userDetailsService” ref=”userDao”/>
<property name=”userCache” ref=”userCache”/>
<property name=”passwordEncoder” ref=”passwordEncoder”/>
</bean>
3.
还需要在filterInvokationFilter里配置那个权限才能允许执行用户切换操作.
<bean id=”filterInvocationInterceptor” class=”org.acegisecurity.intercept.web.FilterSecurityInterceptor”>
<property name=”authenticationManager” ref=”authenticationManager”/>
<property name=”accessDecisionManager” ref=”accessDecisionManager”/>
<property name=”objectDefinitionSource”>
<value>
PATTERN_TYPE_APACHE_ANT
……
……
/j_acegi_switch_user*=ROLE_ADMIN
</value>
</property>
</bean>
4.
现在如果一个用户ROLE_ADMIN权限的管理员希望切换用户,他必须先以自己的用户名和密码登录系统。然后使用以下的连接地址
http://localhost:8080/j_acegi_switch_user?j_username=vikas
‘vikas’管理员希望切换的用户的用户名. 在这里还可以使用Acegi taglibs来确保只有拥有ROLE_ADMIN权限的用户才能使用这个地址
<authz:authorize ifAllGranted=”ROLE_ADMIN”>
<< Switch User Link Here>>
</authz:authorize>
如果用户切换成功, 当然的SecurityContextHolder将被更新和反射成被切换的用户, 此外securityContextHolder还将包含一个附件的SwitchUserGrantedAuthority, 在里面保存了原来用户的信息. 为了推出当前用户上下文并返回原来的用户身份, 可以使用下面的连接地址
http://localhost:8080/j_acegi_exit_user
这样就可以重新返回存在SwitchUserGrantedAUTHORITY的身份.
递归的切换是允许的,比如说,被切换的用户也拥有ROLE_ADMIN权限,就可以继续切换,退回用户身份是将遵循递归原则.
原文http://vikashazrati.wordpress.com
1.
首先要配置filter chain, 应该包含SwitchUserProcessingFilter像下面
<!– ======================== FILTER CHAIN ======================= –>
<bean id=”filterChainProxy” class=”org.acegisecurity.util.FilterChainProxy”>
<property name=”filterInvocationDefinitionSource”>
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/images/**=#NONE#
/scripts/**=#NONE#
/styles/**=#NONE#
/
**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,
exceptionTranslationFilter,filterInvocationInterceptor,switchUserProcessingFilter
</value>
</property>
</bean>
必须注意这个过滤器必须放在filterInvocationInterceptor和FilterSecurityInterceptor的后面,不然任何角色都可以切换用户.
2.
给SwitchUserProcessingFilter定义一个bean
<bean id=”switchUserProcessingFilter” class=”org.acegisecurity.ui.switchuser.SwitchUserProcessingFilter”>
<property name=”userDetailsService” ref=”userDao” />
<property name=”switchUserUrl”><value>/j_acegi_switch_user</value></property>
<property name=”exitUserUrl”><value>/j_acegi_exit_user</value></property>
<property name=”targetUrl”><value>/mainMenu.html</value></property>
</bean>
在这里你只需要改的是targetUrl, 这个设置决定了,切换用户后将导向到那个页面.
userDao是一个一般的daoAuthenticationProvider
<bean id=”daoAuthenticationProvider” class=”org.acegisecurity.providers.dao.DaoAuthenticationProvider”>
<property name=”userDetailsService” ref=”userDao”/>
<property name=”userCache” ref=”userCache”/>
<property name=”passwordEncoder” ref=”passwordEncoder”/>
</bean>
3.
还需要在filterInvokationFilter里配置那个权限才能允许执行用户切换操作.
<bean id=”filterInvocationInterceptor” class=”org.acegisecurity.intercept.web.FilterSecurityInterceptor”>
<property name=”authenticationManager” ref=”authenticationManager”/>
<property name=”accessDecisionManager” ref=”accessDecisionManager”/>
<property name=”objectDefinitionSource”>
<value>
PATTERN_TYPE_APACHE_ANT
……
……
/j_acegi_switch_user*=ROLE_ADMIN
</value>
</property>
</bean>
4.
现在如果一个用户ROLE_ADMIN权限的管理员希望切换用户,他必须先以自己的用户名和密码登录系统。然后使用以下的连接地址
http://localhost:8080/j_acegi_switch_user?j_username=vikas
‘vikas’管理员希望切换的用户的用户名. 在这里还可以使用Acegi taglibs来确保只有拥有ROLE_ADMIN权限的用户才能使用这个地址
<authz:authorize ifAllGranted=”ROLE_ADMIN”>
<< Switch User Link Here>>
</authz:authorize>
如果用户切换成功, 当然的SecurityContextHolder将被更新和反射成被切换的用户, 此外securityContextHolder还将包含一个附件的SwitchUserGrantedAuthority, 在里面保存了原来用户的信息. 为了推出当前用户上下文并返回原来的用户身份, 可以使用下面的连接地址
http://localhost:8080/j_acegi_exit_user
这样就可以重新返回存在SwitchUserGrantedAUTHORITY的身份.
递归的切换是允许的,比如说,被切换的用户也拥有ROLE_ADMIN权限,就可以继续切换,退回用户身份是将遵循递归原则.
原文http://vikashazrati.wordpress.com
相关文章推荐
- android 实现用户切换 am switch-user 0之代码实现
- 【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)
- Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signature,
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇[转载]
- 每天学习一个LINUX命令:su (switch user 切换用户)
- 使用product_user_profile来实现用户权限的设定
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext的User属性来实现用户验证[转载]
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext的User属性来实现用户身份验证
- 使用cookie,session,filter等技术实现用户自动登录
- 如何实现使用QtQuick循环轮播图,并支持用户滑动切换
- 使用product_user_profile来实现用户权限的设定
- 使用HttpContext的User属性来实现用户验证[转载]
- 修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
- 使用product_user_profile来实现用户权限的设定(轉)
- 【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)
- 使用HttpContext的User属性来实现用户身份验证