学习Acegi应用到实际项目中(11)- 切换用户
在某些应用场合中,可能需要用到切换用户的功能,从而以另一用户的身份进行相关操作。这一点类似于在Linux系统中,用su命令切换到另一用户进行相关操作。
既然实际应用中有这种场合,那么我们就有必要对其进行研究,以求在需要时把它加入到应用中。那么,接下来我们就来研究下如何在Acegi中实现切换用户的功能。
一般来说,切换用户功能是从高级用户切换到普通用户,从而以普通用户的身份来进行一些操作。相反,普通用户通常是不能切换为高级用户的,如果可以的话那就是越权了。
实现步骤:
1、 添加SwitchUserProcessingFilter过滤器
增加以下SwitchUserProcessingFilter的配置,并将switchUserProcessingFilter添加到FilterChainProxy过滤器链中。
<bean id="switchUserProcessingFilter" class="org.acegisecurity.ui.switchuser.SwitchUserProcessingFilter">
<property name="userDetailsService" ref="jdbcDaoImpl" />
<property name="switchUserUrl"><value>/j_acegi_switch_user</value></property>
<property name="exitUserUrl"><value>/j_acegi_exit_user</value></property>
<property name="targetUrl"><value>/index.jsp</value></property>
</bean>
属性说明:
userDetailsService:该属性与前面章节org.acegisecurity.providers.dao.DaoAuthenticationProvider 中的userDetailsService属性一样,用于暴露用户的相关信息,如:用户名、密码、权限等。
switchUserUrl:该属性用于指定切换到另一用户时的入口URL,此处为/j_acegi_switch_user。
exitUserUrl:该属性用于指定在切换用户后,退回到原来用户身份的入口URL,此处为/j_acegi_exit_user。
targetUrl:在用户成功切换用户或退回原来用户身份后,过滤器会将用户带到targetUrl所指定的URL中
2、增加切换用户页面switchUser.jsp
以下为核心代码:
<form action="<c:url value='j_acegi_switch_user'/>" method="POST">
<table>
<tr><td>User:</td><td><input type='text' name='j_username'></td></tr>
<tr><td colspan='2'><input name="switch" type="submit" value="Switch to User"></td></tr>
</table>
</form>
其中,j_username是我们必须提供的目标用户名。由于SwitchUserProcessingFilter中未暴露j_username这一属性,故我们不能自定义其名字。所以,我们只要提供了请求路径和目标用户名,就可以实现切换到指定用户的功能。
3、增加退回原来用户身份的页面exitUser.jsp
以下为核心代码:
<form action="<c:url value='j_acegi_exit_user'/>" method="POST">
<table>
<tr><td colspan='2'><input name="exit" type="submit" value="Exit"></td></tr>
</table>
</form>
这部分比较简单,只要提交请求路径j_acegi_exit_user,就可以实现退回原来用户身份的功能。
4、在filterInvocationInterceptor中增加安全授权配置
为了确保切换用户功能只能从高级用户切换到普通用户,我们必须在Web资源授权中增加相关配置:
<bean id="filterInvocationInterceptor"
class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager" ref="httpRequestAccessDecisionManager" />
<property name="objectDefinitionSource">
<value><![CDATA[
......
/switchuser.jsp=AUTH_SUPERUSER
/j_acegi_switch_user=AUTH_SUPERUSER
......
]]></value>
</property>
</bean>
这样,我们指定了只有超级用户才能访问切换用户页面和切换用户的URL。
5、例子说明
在例子中,只是简单的实现了切换功能。系统中有两个用户,分别是root和readonly,其中root拥有增、删、改、查功能,而readonly只有查看功能。当我们从root切换到readonly用户后,我们就只有查看数据,而不能进行增、删、改等操作。只有当我们退回root身份后,才能拥有全部操作功能
学习Acegi应用到实际项目中(11)- 切换用户的更多相关文章
- 菜鸟-手把手教你把Acegi应用到实际项目中(11)-切换用户
在某些应用场合中,我们可能需要用到切换用户的功能,从而以另一用户的身份进行相关操作.这一点类似于在Linux系统中,用su命令切换到另一用户进行相关操作. 既然实际应用中有这种场合,那么我们 ...
- 学习Acegi应用到实际项目中(10)- 保护业务方法
前面已经讲过关于保护Web资源的方式,其中包括直接在XML文件中配置和自定义实现FilterInvocationDefinitionSource接口两种方式.在实际企业应用中,保护Web资源非常重要, ...
- 学习Acegi应用到实际项目中(2)
Acegi应用到实际项目中(1)是基于BasicProcessingFilter的基本认证,这篇改用AuthenticationProcessingFilter基于表单的认证方式. 1.authent ...
- 学习Acegi应用到实际项目中(1)
在此,本人声明,我处于菜鸟阶段,文章的内容大部分摘自zhanjia的博客(http://zhanjia.iteye.com/category/43399),旨在学习,有很多地方,我理解不够透彻,可能存 ...
- 学习Acegi应用到实际项目中(3)
此节将要了解的是AnonymousProcessingFilter.RememberMeProcessingFilter和LogoutFilter三个过滤器 1.AnonymousProcessing ...
- 学习Acegi应用到实际项目中(7)- 缓存用户信息
在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-failsafe.xml文件所定制 ...
- 学习Acegi应用到实际项目中(12)- Run-As认证服务
有这样一些场合,系统用户必须以其他角色身份去操作某些资源.例如,用户A要访问资源B,而用户A拥有的角色为AUTH_USER,资源B访问的角色必须为AUTH_RUN_AS_DATE,那么此时就必须使用户 ...
- 学习Acegi应用到实际项目中(9)- 实现FilterInvocationDefinition
在实际应用中,开发者有时需要将Web资源授权信息(角色与授权资源之间的定义)存放在RDBMS中,以便更好的管理.事实上,一般的企业应用都应当如此,因为这样可以使角色和Web资源的管理更灵活,更自由.那 ...
- 学习Acegi应用到实际项目中(8)- 扩展UserDetailsService接口
一个能为DaoAuthenticationProvider提供存取认证库的的类,它必须要实现UserDetailsService接口: public UserDetails loadUserByUse ...
随机推荐
- 重建整个数据库的索引(Server2000)
declare @dbname varchar(50)select @dbname ='WebFZ' create table #tableT(tn sysname)insert into #tabl ...
- 使用IDEA的项目上传到GitHub
使用IDEA的项目上传到GitHub 前提条件: 1.配置好Git(https://jingyan.baidu.com/article/8275fc867b652046a03cf613.html) 2 ...
- Spring_Four -- 团队项目设计完善&编码测试
团队项目设计完善&编码测试 1.文档<软件设计方案说明书>github地址:https://github.com/gzyt/SRS 2.项目集成开发环境 数据库:Mysql 5.0 ...
- django-rest-framework配置json web token
安装jwt库,简单快速的生成我们所需要的token 1.安装djangorestframe pip install djangorestframe 2.在settings.py的INSTALLED_A ...
- Win10系统下,本地连接远程桌面(Win2016)图解
1.Win+R在运行框中输入mstsc,回车 2.在出现的远程登陆窗口中,计算机中输入远程桌面IP 3.点击显示选项按钮,在远程桌面窗口中,点击常规(默认),输入登陆的用户名: XXXXXX 4.点击 ...
- react rem
1 :安装 postcss-px2rem 2 在webpack.config.js 中添加 引入 const px2rem = require('postcss-px2rem'); 找到: lo ...
- Excel VBA 连接各种数据库(一) VBA连接MySQL数据库
本文参考[东围居士]的cnblog博文 Excel.VBA与MySQL交互 在自己机器上调试成功,把调试中遇到的问题一并写出了. 本文主要涉及: VBA中的MySQL环境配置 VBA连接MySQL ...
- Hackergame 2018的一道题目confused_flxg失败心得体会
分析了这道题,发现自己有如下缺陷需要: 1.要提升:C/C++代码的分析能力2.熟悉IDA的动态调试功能3.能练习使用python编程基本的逻辑功能代码
- requests+django+bs4实现一个web微信的功能
前言: 今天我们利用requests模块+django+bs4浏览器来实现一个web微信的基本功能,主要实现的功能如下 a.实现返回二维码 b.实现手机扫码后二维码变成变成头像 c.实现手机点击登陆成 ...
- webpack4.0
1. webpack 刚开始是js的模块打包,现在是一个任何模块打包工具 可以识别 CommonJS引入规范 CMD AMD 2. commonJS: module.exports r ...