acegi-security-0.9.0 学习笔记

acegi security 是基于spring framework 开源安全解决方案。按自己的理解,其功能主要是提供了一个WEB应用安全解决方案框架。并提供了一些缺省的实现。
所以,如果我们的应用中需要引入这套解决方案的话,可以根据自己的应用需求进行相应的扩充。
另外,由于acegi security 是基于spring framework 的,所以可以和现有的基于spring framework 比较容易集成。也可以和其他java web应用进行集成(关于如何在自己的系统中引入acegi security,会在后面说明自己的理解)。


自己的学习过程:
1、获取相应的acegi security 制品,包括编译后的制品、源码和例子。
2、阅读acegi security 提供的文档,进行简要的了解;
3、配置例子的运行环境,熟悉例子实现的功能;
4、结合例子,一步步的学习源代码的实现,
5、结合文档介绍,对acegi security 进行了解。
6、编写自己的例子,验证、加深自己对acegi security的理解。

关于acegi security 比较详细准确的理论介绍不再进行,这方面文档中已经有比较详细的介绍。

请求web资源时,acegi security 的作用过程:
首先,需要在web.xml中,引入acegi security 提供的filter

<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>net.sf.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这里定义的filter只是一个filter入口,真正会对请求进行处理的是 targetClass : net.sf.acegisecurity.util.FilterChainProxy,
其相关配置信息 在spring context的配置文件applicationContext-acegi-security.xml 中有配置:
<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,switchUserProcessingFilter
</value>
</property>
</bean>

然后,进入请求处理过程。关于这个bean的定义信息 我们主要是看filter链的定义。这些filter 链bean在同一个context 文件中都可以找到。

我们可以一个个去看相应filter的配置信息,以及参看源码实现,了解功能。
其中对web路径请求的认证中,我们需要了解一下securityEnforcementFilter
<bean id="securityEnforcementFilter" class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter">
<property name="filterSecurityInterceptor"><ref local="filterInvocationInterceptor"/></property>
<property name="authenticationEntryPoint"><ref local="authenticationProcessingFilterEntryPoint"/></property>
</bean>
这里,主要是filterInvocationInterceptor,
<bean id="filterInvocationInterceptor" class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager"><ref bean="authenticationManager"/></property>
<property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/wo.html=ROLE_ANONYMOUS,ROLE_USER
/index.jsp=ROLE_ANONYMOUS,ROLE_USER
/hello.htm=ROLE_ANONYMOUS,ROLE_USER
/logoff.jsp=ROLE_ANONYMOUS,ROLE_USER
/switchuser.jsp=ROLE_SUPERVISOR
/j_acegi_switch_user=ROLE_SUPERVISOR
/acegilogin.jsp*=ROLE_ANONYMOUS,ROLE_USER
/**=ROLE_USER
</value>
</property>
</bean>

在此,主要对objectDefinitionSource值进行处理。这里配置了很多path=role ,
其作用就是在请求指定的路径时,是需要当前用户具有对应的角色的,如果具有相应角色,则正常访问。否则跳转至登录页面,定义如下
<bean id="authenticationProcessingFilterEntryPoint" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl"><value>/acegilogin.jsp</value></property>
<property name="forceHttps"><value>false</value></property>
</bean>
loginFormUrl 即是 登录页面的路径。
authenticationProcessingFilter 定义了登录认证时出现的集中情况的处理。
<bean id="authenticationProcessingFilter" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager"><ref bean="authenticationManager"/></property>
<property name="authenticationFailureUrl"><value>/acegilogin.jsp?login_error=1</value></property>
<property name="defaultTargetUrl"><value>/</value></property>
<property name="filterProcessesUrl"><value>/j_acegi_security_check</value></property>
<property name="rememberMeServices"><ref local="rememberMeServices"/></property>
</bean>

登录成功之后,返回登录前最后一次请求的页面。

至此,web路径的请求处理过程主线完成。
这里需要说明的就是/index.jsp=ROLE_ANONYMOUS,ROLE_USER 这里的角色,ROLE_是标记,ANONYMOUS 是角色名称。ANONYMOUS是只可以匿名访问,
这个角色无需定义。而ROLE_USER 中的USER则是用户定义的,接下来我们介绍这部分:

用户角色管理:
acegi security提供了用户角色的获取接口,以及一个缺省的实现(包括对应的数据库表定义)
<bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
可参看这里的net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl,需要注意的是这个dao的实现是同acegi security提供的表定义一致的。
如果这个角色和用户处理模型不能满足自己的需要,自己可以提供自己的实现。只需要将<bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl">
修改成自己类实现即可。

从严格意义上来说,以下权限部分的介绍应该不在acegi security处理的范围之内,不过acegi security是提供了相应的机制的:
权限管理
权限在acegi security 主要以acl的概念出现:即 access control list
<bean id="basicAclExtendedDao" class="net.sf.acegisecurity.acl.basic.jdbc.JdbcExtendedDaoImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
这个类实现中有acl的产生,获取和删除操作

应用数据权限的处理:
如果我们应用数据的权限要借助于acegi security 来实现的话,那主要工作就是调用 basicAclExtendedDao 中的相关方法。阅读basicAclExtendedDao即可明白。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值