MyException - 我的异常网
当前位置:我的异常网» 开源软件 » acegi自带例证学习

acegi自带例证学习

www.MyException.Cn  网友分享于:2013-06-28  浏览:10次
acegi自带例子学习
这是一个Acegi官方的例子。它以联系人的管理为例子,说明如何使用Acegi作权限控制。这个例子包含在acegi的包里面。下载地址:http://prdownloads.sourceforge.net/acegisecurity/acegi-security-0.8.3.zip?download

一 例子功能简介

联系人管理说明了下列中心的Acegi安全控制能力:
  • Role-based security(基于角色的安全)――每个责任人都是某个角色的一员。而角色被用来限制对某些安全对象的访问。
  • Domain object instance security(域对象实例安全)――合同,这个系统里的主要域对象,拥有一个访问控制列表(ACL),用来指明谁允许读、管理和删除对象。
  • Method invocation security(方法调用安全)――这个 ContactManager服务层对象 包含一些受保护的和公开的方法。
  • Web request securityWeb请求安全)――这个“/secureURI路径被使用Acegi安全保护,使得没有ROLE_USER 角色的用户无法访问。.
  • Security unaware application objects(保护未知的应用对象)――受保护的对象与Acegi之间没有明显的耦合或契约,所以它们没有察觉到安全是由Acegi 提供的。*
  • Security taglib usage(安全标签库使用)――所有的JSP使用Acegi 安全标签库来封装安全信息。*
  • Fully declarative security(完全声明式的安全)――每一个安全方面特性都是在application context里面使用标准的Acegi安全对象来配置的。 *
  • Database-sourced security data(支持数据库来源的安全数据)――所有的用户、角色和ACL信息都可以从一个兼容JDBC的内存数据库获得。
  • Integrated form-based and BASIC authentication(集成基于表单和BASIC验证)―― 任何BASIC验证头部被检测以及作为验证使用。默认使用基于表单的普通交互式验证。
  • Remember-me services(记住我的服务)―― Acegi安全的插件式的“remember-me 策略被演示。在登录表单里有一个相关的选择框与之对应。

 

联系人管理的业务功能描述:

1. 1. 每个用户登录后,可以看到一个联系人列表。例如,

marissa's Contacts

id

Name

Email

1

John Smith

john@somewhere.com

Del

Admin Permission

2

Michael Citizen

michael@xyz.com

 


 


3

Joe Bloggs

joe@demo.com

Del

 


4

Karen Sutherland

karen@sutherland.com

Del

Admin Permission

Add

说明:用户没有权限访问的联系人信息,将不会显示。

2. 2. 用户可以增加新的联系人信息。

3. 3. 如果有删除权限,用户可以看到在联系人后面有一个“Del”链接。用户可以点击这个链接来删除某个联系人信息。

4. 4. 如果有管理权限,用户可以看到在联系人后面有一个“Admin Permission”链接。用户可以点击这个链接来管理访问这个联系人的权限。例如,

Administer Permissions

sample.contact.Contact@26807f: Id: 1; Name: John Smith; Email: john@somewhere.com

-R--- [2] dianne

Del

-RW-D [22] peter

Del

A---- [1] marissa

Del

Add Permission Manage

说明:每一行记录包含有3列。

第一列表示权限,例如,“-RW-D”表示可读、可写、可删除。

第二列也表示权限,但它是以类似unix权限的数字表达。例如,“[22], 表示可读、可写、可删除。

第三列是用户名称。

每一行记录后面都有一个“Del”链接。点击这个链接,可以删除掉指定用户对这个联系人信息的权限。

5. 5. 用户可以为某个联系人信息添加权限。例如,

Add Permission

Contact:

sample.contact.Contact@1787005: Id: 1; Name: John Smith; Email: john@somewhere.com

 


Recipient:

-- please select -- dianne marissa peter scott ROLE_SUPERVISOR ROLE_USER

 


Permission:

None Administer Read Delete Read+Write+Delete

 


说明:权限是动态添加的。例如,上图中给用户scott增加了读联系人John的权限。那么scott马上就可以看到联系人John的信息了。
 

二 功能实现分析

这个例子使用了HSQL做数据库,spring的AOP作为基础,使用Acegi做安全控制组件。
联系人管理的web应用在启动时候,会做一系列初始化动作:

1. 读取web.xml文件,并解析文件里的内容。

a) context-param元素。
i. contextConfigLocation属性。这个属性定义了spring所需要的3个属性文件。它们分别是:applicationContext -acegi-security.xml、applicationContext-common-business.xml、 applicationContext-common-authorization.xml
ii. log4jConfigLocation属性。这个属性定义了log4j配置文件。
b) filter元素。
这里定义了acegi的一个过滤器。Acegi的大部分过滤器都是这样配置的。使用FilterToBeanProxy组件,给它传递一个targetClass属性。这个targetClass必须实现javax.servlet.Filter接口。
这里配置的是FilterChainProxy。这个FilterChainProxy比较好用,可以为它定义一串filter属性。这些filter将会按照定义的顺序被调用。例如,
<bean id="filterChainProxy" class="net.sf.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
</value>
</property>
</bean>
这个过滤器的mapping是“/*”。

c) listener元素。
i. ContextLoaderListener。这个是Spring使用来加载根applicationcontext。并分别解析 applicationContext-acegi-security.xml、applicationContext-common- business.xml、applicationContext-common-authorization.xml等配置文件,把相关的对象初始化
iii. Log4jConfigListener。这个是spring用来初始化log4j组件的listener。
iv. HttpSessionEventPublisher。这个组件将发布HttpSessionCreatedEvent和HttpSessionDestroyedEvent事件给spring的applicationcontext。

d) servlet元素。
i. contacts。这里采用了spring的MVC框架, 所以这个servlet是spring MVC的一个核心控制器(org.springframework.web.servlet.DispatcherServlet)。这个servlet 启动时候,会从contacts-servlet.xml里面读取信息,并做相关的初始化。
v. remoting。也是spring MVC的一个核心控制器。与contacts不同,这个servlet主要是提供web services服务。这个servlet启动时候, 会从remoting-servlet.xml里面读取信息,并做相关的初始化。

e) taglib元素。这里定义了spring的标f) 签库。

3. 解析applicationContext-acegi-security.xml。

a) 过滤器链。定义了一个FilterChainProxy,并指定了一系列的过滤器链。httpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter

b) 认证管理器。这个管理器由acegi提供。这个管理器需要一个providers参数。这个providers参数包含了提供系统认证的对象。
i. daoAuthenticationProvider。一般用户认证。
ii. anonymousAuthenticationProvider。匿名用户认证。
iv. rememberMeAuthenticationProvider。记住我认证。
 
c) 密码加密。这里定义了一个acegi的Md5算法加密对象Md5PasswordEncoder。

d) 定义了一个jdbcDao实现类。这个类由acegi提供的net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl。这个对象需要一个dataSource的参数。

e) 定义daoAuthenticationProvider。这个对象由acegi提供。它有3个属性:
authenticationDao。这里指向前面定义的jdbcDao。
userCache。这里指向后面定义的user缓存对象。
passwordEncoder。这里指向前面定义的密码加密对象。

f) 用户缓存管理。
为了缓存user,这里使用spring的ehcache来缓存user。缓存机制:
i. 定义缓存管理器――CacheManager。这个对象是spring的EhCacheManagerFactoryBean对象
ii. 定义user缓存实际执行对象――UserCacheBackend。这个对象是spring的EhCacheFactoryBean。它有两个属性:
1. cacheManager。这里指向前面定义的缓存管理器。
2. cacheName。
iii. 定义user缓存――UserCache。它是acegi提供的EhCacheBasedUserCache对象。它有一个属性: cache。这里指向的是前面定义的userCacheBackend。
 
g) 定义接收来自DaoAuthenticationProvider的认证事件的listener――LoggerListener。

4. 解析applicationContext-common-business.xml。
a) dataSource.这里使用了spring的DriverManagerDataSource对象。这个对象是一个JDBC数据源的定义。

b) TransactionManager。这里使用spring的DataSourceTransactionManager对象。

c) 事务拦截器。这里使用spring的事务拦截器TransactionInterceptor。它有2个属性:
transactionManager。这个属性指向前面定义的TransactionManager。
transactionAttributeSource。这个属性里, 指定了ContactManager的各个方法的事务方面的要求。

d) DataSourcePopulator。
使用sample.contact.DataSourcePopulator对象,往HSQL里创建相关的表结构和数据。
实现原理:DataSourcePopulator 实现了接口 InitializingBean。其中afterPropertiesSet方法将在spring初始化DataSourcePopulator后被调用。

e) ContactDao。这里指向一个ContactDaoSpring对象。它继承spring的 JdbcDaoSupport,并实现ContactDao接口。它是真正实现JDBC操作的对象。

g) ContactManager。这里使用的是spring的ProxyFactoryBean。它有2个属性:
i. ProxyInterfaces。代理接口:sample.contact.ContactManager
ii. InterceptorNames。拦截器名称。可以有多个,这里包括:transactionInterceptor、contactManagerSecurity、contactManagerTarget。其中,v. transactionInterceptor是前面定义的事务拦截器。ContactManagerSecurity则是在 applicationContext-common-authorization.xml里定义的方法调用授权。
h) ContactManagerTarget。这里指向的是sample.contact.ContactManagerBackend对象。 ContactManagerBackend实现了ContactManager接口和InitializingBean接口。它有2个自定义属性: contactDao和basicAclExtendedDao。这里会调用ACL的API去做些创建权限和删除权限的工作。

文章评论

做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员必看的十大电影
程序员必看的十大电影
总结2014中国互联网十大段子
总结2014中国互联网十大段子
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我是如何打败拖延症的
我是如何打败拖延症的
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
中美印日四国程序员比较
中美印日四国程序员比较
程序员的鄙视链
程序员的鄙视链
旅行,写作,编程
旅行,写作,编程
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Java程序员必看电影
Java程序员必看电影
漫画:程序员的工作
漫画:程序员的工作
那些争议最大的编程观点
那些争议最大的编程观点
 程序员的样子
程序员的样子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
代码女神横空出世
代码女神横空出世
鲜为人知的编程真相
鲜为人知的编程真相
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
如何成为一名黑客
如何成为一名黑客
老程序员的下场
老程序员的下场
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
10个调试和排错的小建议
10个调试和排错的小建议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员都该阅读的书
程序员都该阅读的书
编程语言是女人
编程语言是女人
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有