随笔-112  评论-73  文章-0  trackbacks-0

看了一段时间Acegi的文档和例子,今天终于把这个难缠的家伙给搞定了.其实就是一些概念的理解的差别,搞得晕头转向的.

在网上找了一些文章和例子,同一个内容却有不同的说法.有的说acegi没有角色的概念,有的说在认证通过后将用户对就在角色保存在Session中.搞得很晕.

经过几天看源码和例子,我觉得acegi是没有角色的概念的.它只是判断一个用户有没有操作或访问某一个资源的权限,如果有权限就可以访问,没有权限就抛出异常。这个中间没有涉及到的角色,但是我们可以通过扩展原有的类加入角色的概念,毕竟大多数的权限控制都有角色。(扩展方法后面有介绍)

基本原理(我写得比较简单,个人也只是简单应用的程度)

1、用户请求登录,根据配置校验用户名和密码,用户名和密码acegi默认是在xml文件中配置,可以通过数据库来保存,主要是实现UserDetailsService.loadUserByUsername方法。这个方法返回一个org.acegisecurity.userdetails .UserDetails。org.acegisecurity.userdetails.User实现了UserDetails。它的构造方法是:

User(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, GrantedAuthority[] authorities)
Construct the User with the details required by DaoAuthenticationProvider


2、Logout处理

acegi 的logout的地址是j_acegi_logout。例如:<a href="/j_acegi_logout">logout</a>。如果有web.xml的fitler-mapping中配置的不是/*,则要加入这样代码:

<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/j_acegi_logout</url-pattern>
</filter-mapping>
在acegi配置中:

<bean id="filterChainProxy"
class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=concurrentSessionFilter,httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
</value>
</property>
</bean>

<!-- 认证管理器 -->
<bean id="authenticationManager"
class="org.acegisecurity.providers.ProviderManager">
<property name="providers"><!-- 可有多个认证提供器,其中一个证通过就可以了 -->
<list>
<ref local="daoAuthenticationProvider" />
<!-- 匿名认证 -->
<!-- ref local="anonymousAuthenticationProvider"/-->
<!-- ref local="rememberMeAuthenticationProvider" /-->
</list>
</property>
<property name="sessionController"
ref="concurrentSessionController" />
</bean>
<!-- 可以限制同一个用户名在同一时刻成功登录同一个应用的次数 -->
<bean id="concurrentSessionController"
class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">
<!-- 每个用户同时登陆一位 -->
<property name="maximumSessions">
<value>1</value>
</property>
<property name="sessionRegistry" ref="sessionRegistry" />
<property name="exceptionIfMaximumExceeded" value="true" />
<!-- 默认是false,即如果超出最大登陆用户限制,你这个登陆还是允许的。但是其他已经用这个用户登陆的会有一个给强制OUT的。
只有是true时,才会不让你这个用户登陆 -->
</bean>
<bean id="sessionRegistry"
class="org.acegisecurity.concurrent.SessionRegistryImpl" />
<bean id="concurrentSessionFilter"
class="org.acegisecurity.concurrent.ConcurrentSessionFilter">
<property name="sessionRegistry" ref="sessionRegistry" />
<property name="expiredUrl">
<value>/</value>
</property>
</bean>

其中:concurrentSessionFilter,建议放在httpSessionContextIntegrationFilter的前面。这样就可以logout了。

Technorati :

posted on 2007-11-19 12:33 Libo 阅读(864) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: