菜鸟-手把手教你把Acegi应用到实际项目中(12)-Run-As认证服务
有这样一些场合,系统用户必须以其他角色身份去操作某些资源。例如,用户A要访问资源B,而用户A拥有的角色为AUTH_USER,资源B访问的角色必须为AUTH_RUN_AS_DATE,那么此时就必须使用户A拥有角色AUTH_RUN_AS_DATE才能访问资源B。尽管这种场合相对较少,但存在即合理,总会有需要的时候,要学会未雨绸缪。
为了实现这一需求,Acegi为我们提供了Run-As认证服务。下面我们举例说明如何应用Run-As认证服务。
1、用于配置Run-As认证服务的接口与实现类
- public interface IRunAsDate {
- public void showDate();
- }
- public class RunAsDate implements IRunAsDate {
- private static final Log log = LogFactory.getLog(RunAsDate.class);
- /* (non-Javadoc)
- * @see sample.service.IRunAsDate#showDate()
- */
- public void showDate() {
- log.info("当前日期: " + new Date());
- }
- }
public interface IRunAsDate {
public void showDate();
}
public class RunAsDate implements IRunAsDate {
private static final Log log = LogFactory.getLog(RunAsDate.class);
/* (non-Javadoc)
* @see sample.service.IRunAsDate#showDate()
*/
public void showDate() {
log.info("当前日期: " + new Date());
}
}
2、对showDate方法进行授权
设置访问showDate方法必须拥有AUTH_RUN_AS_DATE角色,同时暴露IRunAsDate接口。
- <bean id="runAsDateImpl"
- class="org.springframework.aop.framework.ProxyFactoryBean">
- <property name="proxyInterfaces">
- <value>sample.service.IRunAsDate</value>
- </property>
- <property name="interceptorNames">
- <list>
- <idref local="runAsDateSecurity" />
- <idref local="runAsDateTarget" />
- </list>
- </property>
- </bean>
- <bean id="runAsDateTarget" class="sample.service.impl.RunAsDate"></bean>
- <bean id="runAsDateSecurity"
- class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
- <property name="alwaysReauthenticate" value="true" />
- <property name="authenticationManager" ref="authenticationManager" />
- <property name="accessDecisionManager"
- ref="httpRequestAccessDecisionManager" />
- <property name="objectDefinitionSource">
- <value>
- sample.service.IRunAsDate.showDate=AUTH_RUN_AS_DATE
- </value>
- </property>
- </bean>
<bean id="runAsDateImpl"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>sample.service.IRunAsDate</value>
</property>
<property name="interceptorNames">
<list>
<idref local="runAsDateSecurity" />
<idref local="runAsDateTarget" />
</list>
</property>
</bean> <bean id="runAsDateTarget" class="sample.service.impl.RunAsDate"></bean> <bean id="runAsDateSecurity"
class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="alwaysReauthenticate" value="true" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager"
ref="httpRequestAccessDecisionManager" />
<property name="objectDefinitionSource">
<value>
sample.service.IRunAsDate.showDate=AUTH_RUN_AS_DATE
</value>
</property>
</bean>
其中,alwaysReauthenticate为true表示每次操作都需要进行身份的验证。在默认情况下,RunAsManagerImpl构建的RunAsUserToken认证对象都是已认证状态。因此,只有设置alwaysReauthenticate为true时,才会触发RunAsImplAuthenticationProvider的认证操作。
3、配置RunAsImplAuthenticationProvider
RunAsManagerImpl实例会基于现有的的已认证对象创建新的RunAsUserToken认证类型,而RunAsImplAuthenticationProvider要负责这一认证类型的认证工作。与其他认证提供者一样,必须将其加入authenticationManager中。
- <bean id="runAsImplAuthenticationProvider"
- class="org.acegisecurity.runas.RunAsImplAuthenticationProvider">
- <property name="key" value="javaee" />
- </bean>
- <bean id="authenticationManager"
- class="org.acegisecurity.providers.ProviderManager">
- <property name="providers">
- <list>
- ……
- <!-- 配置与daoAuthenticationProvider类似 -->
- <ref bean="runAsImplAuthenticationProvider" />
- </list>
- </property>
- </bean>
<bean id="runAsImplAuthenticationProvider"
class="org.acegisecurity.runas.RunAsImplAuthenticationProvider">
<property name="key" value="javaee" />
</bean> <bean id="authenticationManager"
class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
……
<!-- 配置与daoAuthenticationProvider类似 -->
<ref bean="runAsImplAuthenticationProvider" />
</list>
</property>
</bean>
4、配置RunAsManagerImpl
RunAsManagerImpl中的key必须与RunAsImplAuthenticationProvider中的key一致,从而保证RunAsManagerImpl 与RunAsImplAuthenticationProvider协同工作。在前面章节中,对于匿名认证与Remember-Me认证中也需要提供类似的key属性值。
RunAsManagerImpl的rolePrefix属性默认值为ROLE_。由于我们配置的资源需要的角色为AUTH_RUN_AS_DATE,故在此我们将前缀设置为AUTH_。
- <bean id="runAsManagerImpl"
- class="org.acegisecurity.runas.RunAsManagerImpl">
- <property name="key" value="javaee" />
- <property name="rolePrefix" value="AUTH_" />
- </bean>
- <bean id="contactManagerSecurity"
- class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
- <property name="authenticationManager" ref="authenticationManager" />
- <property name="accessDecisionManager"
- ref="httpRequestAccessDecisionManager" />
- <property name="runAsManager" ref="runAsManagerImpl" />
- <property name="objectDefinitionSource">
- <value>
- ……
- sample.service.IContactManager.getAll=AUTH_FUNC_ContactManager.getAll,RUN_AS_DATE
- ……
- </value>
- </property>
- </bean>
<bean id="runAsManagerImpl"
class="org.acegisecurity.runas.RunAsManagerImpl">
<property name="key" value="javaee" />
<property name="rolePrefix" value="AUTH_" />
</bean> <bean id="contactManagerSecurity"
class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager"
ref="httpRequestAccessDecisionManager" />
<property name="runAsManager" ref="runAsManagerImpl" />
<property name="objectDefinitionSource">
<value>
……
sample.service.IContactManager.getAll=AUTH_FUNC_ContactManager.getAll,RUN_AS_DATE
……
</value>
</property>
</bean>
我们对getAll方法配置了RUN_AS_DATE角色,默认时RunAsManagerImpl会从授权信息中获得前缀为”RUN_AS”的角色,同时构建新的授权信息,将rolePrefix添加到角色中,即组成类似AUTH_RUN_AS_DATE的角色。
注意,Run-As认证服务只是临时性替换了现有用户的身份,这一点要比较重视。
5、数据库脚本
本例采用了MySQL数据库,脚本在WebRoot/db目录下。
6、其他说明
开发环境:
MyEclipse 5.0GA
Eclipse3.2.1
JDK1.5.0_10
tomcat5.5.23
acegi-security-1.0.7
Spring2.0
Jar包:
acegi-security-1.0.7.jar
commons-codec.jar
jstl.jar(1.1)
spring.jar(2.0.8)
standard.jar
commons-logging.jar(1.0)
c3p0-0.9.0.jar
log4j-1.2.13.jar
mysql-connector-java-3.1.10-bin.jar
- 例子源码_12_Acegi11.rar (22.7 KB)
- 下载次数: 447
菜鸟-手把手教你把Acegi应用到实际项目中(12)-Run-As认证服务的更多相关文章
- 菜鸟-手把手教你把Acegi应用到实际项目中(8)-扩展UserDetailsService接口
一个能为DaoAuthenticationProvider提供存取认证库的的类,它必须要实现UserDetailsService接口: public UserDetails loadUserByUse ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(10)-保护业务方法
前面已经讲过关于保护Web资源的方式,其中包括直接在XML文件中配置和自定义实现FilterInvocationDefinitionSource接口两种方式.在实际企业应用中,保护Web资源显得非常重 ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(1.1)
相信不少朋友们对于学习Acegi的过程是比较痛苦的,而且可能最初一个例子都没能真正运行起来.即使能运行起来,对于里面那么多的配置,更搞不清楚为什么要那么配,多配一个和少配一个究竟有什么区别? 最终头都 ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(11)-切换用户
在某些应用场合中,我们可能需要用到切换用户的功能,从而以另一用户的身份进行相关操作.这一点类似于在Linux系统中,用su命令切换到另一用户进行相关操作. 既然实际应用中有这种场合,那么我们 ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息
首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(5)
在实际企业应用中,用户密码一般都会进行加密处理,这样才能使企业应用更加安全.既然密码的加密如此之重要,那么Acegi(Spring Security)作为成熟的安全框架,当然也我们提供了相应的处理方式 ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(4)
今天就讲个ConcurrentSessionFilter. 在Acegi 1.x版本中,控制并发HttpSession和Remember-Me认证服务不能够同时启用,它们之间存在冲突问题,这是该版本的 ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(6)
在企业应用中,用户的用户名.密码和角色等信息一般存放在RDBMS(关系数据库)中.前面几节我们采用的是InMemoryDaoImpl,即基于内存的存放方式.这节我们将采用RDBMS存储用户信息. Us ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(1.2)
7) daoAuthenticationProvider 进行简单的基于数据库的身份验证.DaoAuthenticationProvider获取数据库中的账号密码并进行匹配,若成功则在通过用户身份的同 ...
随机推荐
- DataRow[] 转为数组
DataRow[] rows = dt.Select("1=1"); ].ToString()).ToArray();
- [linux] linux 破解版confluence安装
OS centos 6.5 需要的安装包如下: jre-7u67-linux-x64.rpm atlassian-confluence-5.4.4-x64.bin mysql-connector- ...
- bzojj1764: [Baltic2009]monument
Description 给一个p*q*r的立方体,它由p*q*r个1*1*1的小立方体构成.每个立方体要么被虫蛀,要么不被.现在郑爽要选出一个a*a*b的立方体(方向任意),使得它没有被虫蛀过,并且4 ...
- bzoj1006 神奇的国度
Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系 ...
- 已跳过 'cache' -- 节点处于冲突状态
svn resolved ./cache ./cache 为冲突文件路径“cache”的冲突状态已解决
- visual studio 2013 中常用的一些快捷键
在编辑代码或者复制网上的代码段到VS2013中时,代码会显示的非常乱,这里便可以通过 vs2013中的快捷键进行自动对齐操作[ctrl+k+f],类似的快捷操作还有很多,在这里给大家总结一下,以提高编 ...
- solace
最近做了一个关于solace的项目,有时间来总结一下 1>. solace 介绍 2>. solace 应用(C#)
- 网页爬虫--scrapy入门
本篇从实际出发,展示如何用网页爬虫.并介绍一个流行的爬虫框架~ 1. 网页爬虫的过程 所谓网页爬虫,就是模拟浏览器的行为访问网站,从而获得网页信息的程序.正因为是程序,所以获得网页的速度可以轻易超过单 ...
- NeHe OpenGL教程 第三十四课:地形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- VMware和CentOS7安装和配置
准备工作: 下载: 1.VMware-workstation-full-10.0.0-1295980 2.CentOS-7-x86_64-DVD-1511.iso 安装: 1.VMware-works ...