acegi-security-sample-contacts-filter例子学习(0.8.3版)
2006-12-07 15:36
337 查看
联系人管理说明了下列中心的Acegi安全控制能力:
Role-based security(基于角色的安全)――每个责任人都是某个角色的一员。而角色被用来限制对某些安全对象的访问。
Domain object instance security(域对象实例安全)――合同,这个系统里的主要域对象,拥有一个访问控制列表(ACL),用来指明谁允许读、管理和删除对象。
Method invocation security(方法调用安全)――这个
Web request security(Web请求安全)――这个“
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. 每个用户登录后,可以看到一个联系人列表。例如,
Add
说明:用户没有权限访问的联系人信息,将不会显示。
2. 2. 用户可以增加新的联系人信息。
3. 3. 如果有删除权限,用户可以看到在联系人后面有一个“Del”链接。用户可以点击这个链接来删除某个联系人信息。
4. 4. 如果有管理权限,用户可以看到在联系人后面有一个“Admin Permission”链接。用户可以点击这个链接来管理访问这个联系人的权限。例如,
Add Permission Manage
说明:每一行记录包含有3列。
第一列表示权限,例如,“
第二列也表示权限,但它是以类似unix权限的数字表达。例如,“[22]”, 表示可读、可写、可删除。
第三列是用户名称。
每一行记录后面都有一个“Del”链接。点击这个链接,可以删除掉指定用户对这个联系人信息的权限。
5. 5. 用户可以为某个联系人信息添加权限。例如,
说明:权限是动态添加的。例如,上图中给用户scott增加了读联系人John的权限。那么scott马上就可以看到联系人John的信息了。
功能实现分析
这个例子使用了HSQL做数据库,spring的AOP作为基础,使用Acegi做安全控制组件。
联系人管理的web应用在启动时候,会做一系列初始化动作:
1. 读取web.xml文件,
2. 并解析文件里的内容。
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,b) 并指c) 定了一系列的过滤器链。httpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
d) 认证管理器。这个管理器由acegi提供。这个管理器需要一个providers参数。这个providers参数包含了提供系统认证的对象。
i. daoAuthenticationProvider。一般用户认证。
ii. anonymousAuthenticationProvider。匿名用户认证。
iv. rememberMeAuthenticationProvider。记住我认证。
e) 密码加密。这里定义了一个acegi的Md5算法加密对象Md5PasswordEncoder。
f) 定义了一个jdbcDao实现类。这个类由acegi提供的net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl。这个对象需要一个dataSource的参数。
g) 定义daoAuthenticationProvider。这个对象由acegi提供。它有3个属性:
authenticationDao。这里指向前面定义的jdbcDao。
userCache。这里指向后面定义的user缓存对象。
passwordEncoder。这里指向前面定义的密码加密对象。
h) 用户缓存管理。
为了缓存user,这里使用spring的ehcache来缓存user。缓存机制:
i. 定义缓存管理器――CacheManager。这个对象是spring的EhCacheManagerFactoryBean对象
ii. 定义user缓存实际执行对象――UserCacheBackend。这个对象是spring的EhCacheFactoryBean。它有两个属性:
1. cacheManager。这里指向前面定义的缓存管理器。
2. cacheName。
iii. 定义user缓存――UserCache。它是acegi提供的EhCacheBasedUserCache对象。它有一个属性:
1. cache。这里指向的是前面定义的userCacheBackend。
i) 定义接收来自DaoAuthenticationProvider的认证事件的listener――LoggerListener。
j)
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,g) 并实现ContactDao接口。它是真正实现JDBC操作的对象。
h) ContactManager。这里使用的是spring的ProxyFactoryBean。它有2个属性:
i. ProxyInterfaces。代理接口:sample.contact.ContactManager
ii. InterceptorNames。拦截器名称。可以有多个,iv. 这里包括:transactionInterceptor、contactManagerSecurity、contactManagerTarget。其中,v. transactionInterceptor是前面定义的事务拦截器。ContactManagerSecurity则是在 applicationContext-common-authorization.xml里定义的方法调用授权。
i) ContactManagerTarget。这里指向的是sample.contact.ContactManagerBackend对象。 ContactManagerBackend实现了ContactManager接口和InitializingBean接口。它有2个自定义属性: contactDao和basicAclExtendedDao。这里会调用ACL的API去做些创建权限和删除权限的工作。
Role-based security(基于角色的安全)――每个责任人都是某个角色的一员。而角色被用来限制对某些安全对象的访问。
Domain object instance security(域对象实例安全)――合同,这个系统里的主要域对象,拥有一个访问控制列表(ACL),用来指明谁允许读、管理和删除对象。
Method invocation security(方法调用安全)――这个
ContactManager服务层对象 包含一些受保护的和公开的方法。
Web request security(Web请求安全)――这个“
/secure”URI路径被使用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 |
说明:用户没有权限访问的联系人信息,将不会显示。
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 |
说明:每一行记录包含有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 |
功能实现分析
这个例子使用了HSQL做数据库,spring的AOP作为基础,使用Acegi做安全控制组件。
联系人管理的web应用在启动时候,会做一系列初始化动作:
1. 读取web.xml文件,
2. 并解析文件里的内容。
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,b) 并指c) 定了一系列的过滤器链。httpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
d) 认证管理器。这个管理器由acegi提供。这个管理器需要一个providers参数。这个providers参数包含了提供系统认证的对象。
i. daoAuthenticationProvider。一般用户认证。
ii. anonymousAuthenticationProvider。匿名用户认证。
iv. rememberMeAuthenticationProvider。记住我认证。
e) 密码加密。这里定义了一个acegi的Md5算法加密对象Md5PasswordEncoder。
f) 定义了一个jdbcDao实现类。这个类由acegi提供的net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl。这个对象需要一个dataSource的参数。
g) 定义daoAuthenticationProvider。这个对象由acegi提供。它有3个属性:
authenticationDao。这里指向前面定义的jdbcDao。
userCache。这里指向后面定义的user缓存对象。
passwordEncoder。这里指向前面定义的密码加密对象。
h) 用户缓存管理。
为了缓存user,这里使用spring的ehcache来缓存user。缓存机制:
i. 定义缓存管理器――CacheManager。这个对象是spring的EhCacheManagerFactoryBean对象
ii. 定义user缓存实际执行对象――UserCacheBackend。这个对象是spring的EhCacheFactoryBean。它有两个属性:
1. cacheManager。这里指向前面定义的缓存管理器。
2. cacheName。
iii. 定义user缓存――UserCache。它是acegi提供的EhCacheBasedUserCache对象。它有一个属性:
1. cache。这里指向的是前面定义的userCacheBackend。
i) 定义接收来自DaoAuthenticationProvider的认证事件的listener――LoggerListener。
j)
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,g) 并实现ContactDao接口。它是真正实现JDBC操作的对象。
h) ContactManager。这里使用的是spring的ProxyFactoryBean。它有2个属性:
i. ProxyInterfaces。代理接口:sample.contact.ContactManager
ii. InterceptorNames。拦截器名称。可以有多个,iv. 这里包括:transactionInterceptor、contactManagerSecurity、contactManagerTarget。其中,v. transactionInterceptor是前面定义的事务拦截器。ContactManagerSecurity则是在 applicationContext-common-authorization.xml里定义的方法调用授权。
i) ContactManagerTarget。这里指向的是sample.contact.ContactManagerBackend对象。 ContactManagerBackend实现了ContactManager接口和InitializingBean接口。它有2个自定义属性: contactDao和basicAclExtendedDao。这里会调用ACL的API去做些创建权限和删除权限的工作。
相关文章推荐
- acegi学习心得:httpSessionContextIntegrationFilter
- Acegi-security-samples-tutorial-1.0.7.zip 实例学习笔记
- amcap sample code 分析初步 --学习通用filter graph的构建技术
- acegi-security-samples-contacts分析
- ⑧javaWeb之在例子中学习(过滤器Filter)
- Acegi Security System学习
- Spring-Security (学习记录七)--实现FilterInvocationSecurityMetadataSource的类将无法切入声明式事物
- Acegi Security System使用 LDAP 目录服务器学习
- acegi-security 学习笔记
- Ctx Minifilter Sample 实例上下文例子
- acegi-security-0.9.0 学习笔记
- acegi自带例子学习
- javaWeb之在例子中学习(过滤器Filter)
- Filter--过滤器学习笔记
- Struts2 源码学习 一 StrutsPrepareAndExecuteFilter
- MDX语法学习--filter与iif的使用
- 权限控制:spring 3.0 security配置例子
- 正则表达式入门经典(学习笔记八)——几个例子及解释汇总
- dojo小例子(31)dgrid增加filter搜索功能
- 【原创】ObjectARX SDK samples Table 例子学习笔记