在某些应用场合中,可能需要用到切换用户的功能,从而以另一用户的身份进行相关操作。这一点类似于在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)- 切换用户的更多相关文章

  1. 菜鸟-手把手教你把Acegi应用到实际项目中(11)-切换用户

    在某些应用场合中,我们可能需要用到切换用户的功能,从而以另一用户的身份进行相关操作.这一点类似于在Linux系统中,用su命令切换到另一用户进行相关操作.      既然实际应用中有这种场合,那么我们 ...

  2. 学习Acegi应用到实际项目中(10)- 保护业务方法

    前面已经讲过关于保护Web资源的方式,其中包括直接在XML文件中配置和自定义实现FilterInvocationDefinitionSource接口两种方式.在实际企业应用中,保护Web资源非常重要, ...

  3. 学习Acegi应用到实际项目中(2)

    Acegi应用到实际项目中(1)是基于BasicProcessingFilter的基本认证,这篇改用AuthenticationProcessingFilter基于表单的认证方式. 1.authent ...

  4. 学习Acegi应用到实际项目中(1)

    在此,本人声明,我处于菜鸟阶段,文章的内容大部分摘自zhanjia的博客(http://zhanjia.iteye.com/category/43399),旨在学习,有很多地方,我理解不够透彻,可能存 ...

  5. 学习Acegi应用到实际项目中(3)

    此节将要了解的是AnonymousProcessingFilter.RememberMeProcessingFilter和LogoutFilter三个过滤器 1.AnonymousProcessing ...

  6. 学习Acegi应用到实际项目中(7)- 缓存用户信息

    在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-failsafe.xml文件所定制 ...

  7. 学习Acegi应用到实际项目中(12)- Run-As认证服务

    有这样一些场合,系统用户必须以其他角色身份去操作某些资源.例如,用户A要访问资源B,而用户A拥有的角色为AUTH_USER,资源B访问的角色必须为AUTH_RUN_AS_DATE,那么此时就必须使用户 ...

  8. 学习Acegi应用到实际项目中(9)- 实现FilterInvocationDefinition

    在实际应用中,开发者有时需要将Web资源授权信息(角色与授权资源之间的定义)存放在RDBMS中,以便更好的管理.事实上,一般的企业应用都应当如此,因为这样可以使角色和Web资源的管理更灵活,更自由.那 ...

  9. 学习Acegi应用到实际项目中(8)- 扩展UserDetailsService接口

    一个能为DaoAuthenticationProvider提供存取认证库的的类,它必须要实现UserDetailsService接口: public UserDetails loadUserByUse ...

随机推荐

  1. Navicat Premium 12激活教程

    Navicat Premium 12激活教程 1.软件包的下载 百度云地址链接: 注册机:https://pan.baidu.com/s/1KzmCbVYcVoXt_t4osXk3Kw  提取码: q ...

  2. Spring 获取bean 几种方式

    转载自: http://www.cnblogs.com/luoluoshidafu/p/5659574.html 1.读取xml文件的方式,这种在初学入门的时候比较适用 . ApplicationCo ...

  3. 吴裕雄 python 机器学习——线性判断分析LinearDiscriminantAnalysis

    import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...

  4. 并发系列2:Java并发的基石,volatile关键字、synchronized关键字、乐观锁CAS操作

    由并发大师Doug Lea操刀的并发包Concurrent是并发编程的重要包,而并发包的基石又是volatile关键字.synchronized关键字.乐观锁CAS操作这些基础.因此了解他们的原理对我 ...

  5. spring项目启动时执行任务

    https://www.jianshu.com/p/745868a34379

  6. 【相关网站 - 01】- Java 相关网站

    一.官方网站 1. Java 官方网站 https://www.java.com/zh_CN/ 2. Spring 官方网站 http://spring.io/ 1. Spring Framework ...

  7. java程序启动redis报错ERR Client sent AUTH, but no password is set

    配置文件中注释掉password一句 重启程序即可

  8. Scrapy中集成selenium

    面对众多动态网站比如说淘宝等,一般情况下用selenium最好 那么如何集成selenium到scrapy中呢? 因为每一次request的请求都要经过中间件,所以写在中间件中最为合适 from se ...

  9. Find out where to contain the smartforms

    Go to table E071 and give smarforms name and it will give the transport req for that. Run SE03, choo ...

  10. centos7 安装部署gitlab

    Gitlab官网地址:https://about.gitlab.com/downloads/ Linux系统环境: Centos7 gitlab服务安装之前需要安装一些依赖包:yum install ...