`
陈谏辉
  • 浏览: 49289 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

acegi"安全控制"的设置-2

阅读更多

acegi 的设置看起来非常复杂,但事实上在实际项目的安全应用中我们并不必那么多功能,清晰的了解acegi设置中各项的功能,有助于我们灵活的运用acegi于实践中。

2.1 在web.xml中的设置

1) filtertobeanproxy
  acegi通过实现了filter接口的filtertobeanproxy提供一种特别 的使用servlet filter的方式,他委托spring中的bean -- filterchainproxy来完成过滤功能,这好处是简化了web.xml的设置,并且充分利用了spring ioc的优势。filterchainproxy包含了处理认证过程的filter列表,每个filter都有各自的功能。

  <filter>
<filter-name>acegi filter chain proxy</filter-name>
<filter-class>org.acegisecurity.util.filtertobeanproxy</filter-class>
<init-param>
<param-name>targetclass</param-name>
<param-value>org.acegisecurity.util.filterchainproxy</param-value>
</init-param>
</filter>

2) filter-mapping
  <filter-mapping>限定了filtertobeanproxy的url匹配模式,只有*.do和*.jsp和/j_acegi_security_check 的请求才会受到权限控制,对javascript,css等不限制。

 <filter-mapping>
<filter-name>acegi filter chain proxy</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>acegi filter chain proxy</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>acegi filter chain proxy</filter-name>
<url-pattern>/j_acegi_security_check</url-pattern>
</filter-mapping>

3) httpsessioneventpublisher
  <listener>的 httpsessioneventpublisher用于发布httpsessionapplicationevents和 httpsessiondestroyedevent事件给spring的applicationcontext。

 <listener>
<listener-class>org.acegisecurity.ui.session.httpsessioneventpublisher</listener-class>
</listener>


2.2 在applicationcontext-acegi-security.xml中

2.2.1 filter chain

  filterchainproxy会按顺序来调用这些filter,使这些filter能享用spring ioc的功能, convert_url_to_lowercase_before_comparison定义了url比较前先转为小写, pattern_type_apache_ant定义了使用apache ant的匹配模式

    <bean id="filterchainproxy" class="org.acegisecurity.util.filterchainproxy">
<property name="filterinvocationdefinitionsource">
<value>
convert_url_to_lowercase_before_comparison
pattern_type_apache_ant
/**=httpsessioncontextintegrationfilter,authenticationprocessingfilter,
basicprocessingfilter,remembermeprocessingfilter,anonymousprocessingfilter,
exceptiontranslationfilter,filterinvocationinterceptor
</value>
</property>
</bean>

2.2.2 基础认证

1) authenticationmanager
  起到认证管理的作用,他将验证的功能委托给多个provider,并通过遍历 providers, 以确保获取不同来源的身份认证,若某个provider能成功确认当前用户的身份,authenticate()方法会返回一个完整的包含用户授权信息的 authentication对象,否则会抛出一个authenticationexception。
acegi提供了不同的authenticationprovider的实现,如:
daoauthenticationprovider 从数据库中读取用户信息验证身份
anonymousauthenticationprovider 匿名用户身份认证
remembermeauthenticationprovider 已存cookie中的用户信息身份认证
authbyadapterprovider 使用容器的适配器验证身份
casauthenticationprovider 根据yale中心认证服务验证身份, 用于实现单点登陆
jaasauthenticationprovider 从jass登陆设置中获取用户信息验证身份
remoteauthenticationprovider 根据远程服务验证用户身份
runasimplauthenticationprovider 对身份已被管理器替换的用户进行验证
x509authenticationprovider 从x509认证中获取用户信息验证身份
testingauthenticationprovider 单元测试时使用

每个认证者会对自己指定的证实信息进行认证,如daoauthenticationprovider仅对usernamepasswordauthenticationtoken这个证实信息进行认证。

<bean id="authenticationmanager" class="org.acegisecurity.providers.providermanager">
<property name="providers">
<list>
<ref local="daoauthenticationprovider"/>
<ref local="anonymousauthenticationprovider"/>
<ref local="remembermeauthenticationprovider"/>
</list>
</property>
</bean>


2) daoauthenticationprovider
  进行简单的基于数据库的身份验证。 daoauthenticationprovider获取数据库中的账号密码并进行匹配,若成功则在通过用户身份的同时返回一个包含授权信息的 authentication对象,否则身份验证失败,抛出一个authenticatiionexception。

 <bean id="daoauthenticationprovider" class="org.acegisecurity.providers.dao.daoauthenticationprovider">
<property name="userdetailsservice" ref="jdbcdaoimpl"/>
<property name="usercache" ref="usercache"/>
<property name="passwordencoder" ref="passwordencoder"/>
</bean>


3) passwordencoder
  使用加密器对用户输入的明文进行加密。acegi提供了三种加密器:
plaintextpasswordencoder?默认,不加密,返回明文.
shapasswordencoder?哈希算法(sha)加密
md5passwordencoder?消息摘要(md5)加密

<bean id="passwordencoder" class="org.acegisecurity.providers.encoding.md5passwordencoder"/>


4) jdbcdaoimpl
  用于在数据中获取用户信息。 acegi提供了用户及授权的表结构,不过你也能自己来实现。通过usersbyusernamequery这个sql得到你的(用户id,密码,状态信 息);通过authoritiesbyusernamequery这个sql得到你的(用户id,授权信息)

 
<bean id="jdbcdaoimpl"
class="org.acegisecurity.userdetails.jdbc.jdbcdaoimpl">

<property name="datasource"
ref="datasource"/>
<property
name="usersbyusernamequery">

<value>select loginid,passwd,1 from users where loginid =
?</value>

</property>
<property
name="authoritiesbyusernamequery">

<value>select u.loginid,p.name from users u,roles r,permissions
p,user_role ur,role_permis rp where u.id=ur.user_id and r.id=ur.role_id and
p.id=rp.permis_id
and

r.id=rp.role_id and p.status=1 and
u.loginid=?</value>

</property>
</bean>

5) usercache & resourcecache
  缓存用户和资源相对应的权限信息。每当请求一个受保护资源 时,daoauthenticationprovider就会被调用以获取用户授权信息。如果每次都从数据库获取的话,那代价非常高,对于不常改动的用户 和资源信息来说,最佳是把相关授权信息缓存起来。(详见 2.6.3 资源权限定义扩展 )
usercache提供了两种实现: nullusercache和ehcachebasedusercache, nullusercache实际上就是不进行所有缓存,ehcachebasedusercache是使用ehcache来实现缓功能。

 <bean id="usercachebackend" 
class="org.springframework.cache.ehcache.ehcachefactorybean">

<property name="cachemanager"
ref="cachemanager"/>

<property name="cachename" value="usercache"/>
</bean>
<bean id="usercache"
class="org.acegisecurity.providers.dao.cache.ehcachebasedusercache"
autowire="byname">
<property
name="cache" ref="usercachebackend"/>

</bean>
<bean id="resourcecachebackend"
class="org.springframework.cache.ehcache.ehcachefactorybean">

<property name="cachemanager"
ref="cachemanager"/>

<property name="cachename" value="resourcecache"/>
</bean>
<bean id="resourcecache"
class="org.springside.modules.security.service.acegi.cache.resourcecache"
autowire="byname">
<property
name="cache" ref="resourcecachebackend"/>
</bean>


6) basicprocessingfilter
  用于处理http头的认证信息,如从spring远程协议(如 hessian和burlap)或普通的浏览器如ie,navigator的http头中获取用户信息,将他们转交给通过 authenticationmanager属性装配的认证管理器。如果认证成功,会将一个authentication对象放到会话中,否则,如果认证 失败,会将控制转交给认证入口点(通过authenticationentrypoint属性装配)

 <bean id="basicprocessingfilter" class="org.acegisecurity.ui.basicauth.basicprocessingfilter">
<property name="authenticationmanager" ref="authenticationmanager"/>
<property name="authenticationentrypoint" ref="basicprocessingfilterentrypoint"/>
</bean>

7) basicprocessingfilterentrypoint
  通过向浏览器发送一个http401(未授权)消息,提示用户登录。
处理基于http的授权过程, 在当验证过程出现异常后的"去向",通常实现转向、在response里加入error信息等功能。

 <bean 
id="basicprocessingfilterentrypoint"
class="org.acegisecurity.ui.basicauth.basicprocessingfilterentrypoint">

<property name="realmname" value="springside realm"/>
</bean>

8) authenticationprocessingfilterentrypoint
  当抛出 accessdeniedexception时,将用户重定向到登录界面。属性loginformurl设置了一个登录表单的url,当需要用户登录 时,authenticationprocessingfilterentrypoint会将用户重定向到该url

 
<bean id="authenticationprocessingfilterentrypoint"
class="org.acegisecurity.ui.webapp.authenticationprocessingfilterentrypoint">

<property
name="loginformurl">

<value>/security/login.jsp</value>

</property>
<property
name="forcehttps" value="false"/>
</bean>

2.2.3 http安全请求

1) httpsessioncontextintegrationfilter
  每次request前 httpsessioncontextintegrationfilter从session中获取authentication对象,在request完 后, 又把authentication对象保存到session中供下次request使用,此filter必须其他acegi filter前使用,使之能跨越多个请求。

<bean id="httpsessioncontextintegrationfilter" class="org.acegisecurity.context.httpsessioncontextintegrationfilter"></bean>
<bean id="httprequestaccessdecisionmanager" class="org.acegisecurity.vote.affirmativebased">
<property name="allowifallabstaindecisions" value="false"/>
<property name="decisionvoters">
<list>
<ref bean="rolevoter"/>
</list>
</property>
</bean>


2) httprequestaccessdecisionmanager
  经过投票机制来决定是否能访问某一资源(url或方 法)。allowifallabstaindecisions为false时如果有一个或以上的decisionvoters投票通过,则授权通过。可选 的决策机制有consensusbased和unanimousbased

 <bean id="httprequestaccessdecisionmanager" class="org.acegisecurity.vote.affirmativebased">
<property name="allowifallabstaindecisions" value="false"/>
<property name="decisionvoters">
<list>
<ref bean="rolevoter"/>
</list>
</property>
</bean>


3) rolevoter
  必须是以roleprefix设定的value开头的权限才能进行投票,如auth_ , role_

 <bean id="rolevoter" class="org.acegisecurity.vote.rolevoter">
<property name="roleprefix" value="auth_"/>
</bean>

4)exceptiontranslationfilter
  异常转换过滤器,主要是处理accessdeniedexception和authenticationexception,将给每个异常找到合适的"去向"

 <bean id="exceptiontranslationfilter" class="org.acegisecurity.ui.exceptiontranslationfilter">
<property name="authenticationentrypoint" ref="authenticationprocessingfilterentrypoint"/>
</bean>

5) authenticationprocessingfilter
  和servlet spec差不多,处理登陆请求.当身份验证成功时,authenticationprocessingfilter会在会话中放置一个authentication对象,并且重定向到登录成功页面
authenticationfailureurl定义登陆失败时转向的页面
defaulttargeturl定义登陆成功时转向的页面
filterprocessesurl定义登陆请求的页面
remembermeservices用于在验证成功后添加cookie信息

 <bean id="authenticationprocessingfilter" class="org.acegisecurity.ui.webapp.authenticationprocessingfilter">
<property name="authenticationmanager" ref="authenticationmanager"/>
<property name="authenticationfailureurl">
<value>/security/login.jsp?login_error=1</value>
</property>
<property name="defaulttargeturl">
<value>/admin/index.jsp</value>
</property>
<property name="filterprocessesurl">
<value>/j_acegi_security_check</value>
</property>
<property name="remembermeservices" ref="remembermeservices"/>
</bean>

6) filterinvocationinterceptor
  在执行转向url前检查objectdefinitionsource 中设定的用户权限信息。首先,objectdefinitionsource中定义了访问url需要的属性信息(这里的属性信息仅仅是标志,告诉 accessdecisionmanager要用哪些voter来投票)。然后,authenticationmanager掉用自己的provider 来对用户的认证信息进行校验。最后,有投票者根据用户持有认证和访问url需要的属性,调用自己的voter来投票,决定是否允许访问。

 <bean id="filterinvocationinterceptor" class="org.acegisecurity.intercept.web.filtersecurityinterceptor">
<property name="authenticationmanager" ref="authenticationmanager"/>
<property name="accessdecisionmanager" ref="httprequestaccessdecisionmanager"/>
<property name="objectdefinitionsource" ref="filterdefinitionsource"/>
</bean>


7) filterdefinitionsource (详见 2.6.3 资源权限定义扩展)
  自定义dbfilterinvocationdefinitionsource从数据库和cache中读取保护资源及其需要的访问权限信息

<bean id="filterdefinitionsource" class="org.springside.modules.security.service.acegi.dbfilterinvocationdefinitionsource">
<property name="converturltolowercasebeforecomparison" value="true"/>
<property name="useantpath" value="true"/>
<property name="acegicachemanager" ref="acegicachemanager"/>
</bean>

2.2.4 方法调用安全控制

(详见 2.6.3 资源权限定义扩展)

1) methodsecurityinterceptor
  在执行方法前进行拦截,检查用户权限信息
2) methoddefinitionsource
  自定义methoddefinitionsource从cache中读取权限

 <bean id="methodsecurityinterceptor" class="org.acegisecurity.intercept.method.aopalliance.methodsecurityinterceptor">
<property name="authenticationmanager" ref="authenticationmanager"/>
<property name="accessdecisionmanager" ref="httprequestaccessdecisionmanager"/>
<property name="objectdefinitionsource" ref="methoddefinitionsource"/>
</bean>
<bean id="methoddefinitionsource" class="org.springside.modules.security.service.acegi.dbmethoddefinitionsource">
<property name="acegicachemanager" ref="acegicachemanager"/>
</bean>

2.3 jcaptcha验证码

采用 http://jcaptcha.sourceforge.net作为通用的验证码方案,请参考springside中的例子,或网上的:
http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse。

差沙在此过程中又发现acegi logout filter的错误,进行了修正。

另外他默认提供的图片比较难认,我们custom了一个美观一点的版本。

分享到:
评论

相关推荐

    acegi-security-tiger-1.0.0-RC2.jar.zip

    2. **授权**:支持基于角色的访问控制(RBAC),允许开发者定义用户角色及其可访问的权限,从而实现细粒度的访问控制。 3. **会话管理**:提供会话超时、会话固定和会话复制等安全功能,防止会话劫持和会话固定攻击...

    Acegi-security-samples-tutorial-1.0.7.zip 实例代码解析

    Acegi Security是一个经典的Java安全框架,它为Spring应用提供了全面的安全管理服务。在这个" Acegi-security-samples-tutorial-1.0.7.zip "压缩包中,包含了一个详细的教程实例,帮助开发者理解并掌握Acegi ...

    ldap与Acegi? ----Acegi配置文件解剖

    **LDAP与Acegi安全框架** 在Java Web开发中,安全是一个至关重要的方面,尤其是在企业级应用中。LDAP(轻量级目录访问协议)通常用于管理用户身份验证和授权,而Acegi Security是Spring Framework的一个扩展,它...

    acegi-security-tiger-1.0.7.jar

    这个版本的jar文件"acegi-security-tiger-1.0.7.jar"是该框架的核心库,包含了实现安全控制的所有类和接口,使得开发者能够更方便地管理用户的登录、权限分配以及访问控制。 Acegi Security的主要功能包括: 1. **...

    Acegi学习笔记--Acegi详解实战Acegi实例

    2. **Spring配置**:定义`&lt;security:global-method-security&gt;`来启用方法级别的安全控制。 3. **Bean配置**:配置`AuthenticationProvider`,如`DaoAuthenticationProvider`,并定义用户凭证的存储方式。 四、Acegi...

    acegi-security-jetty-0.8.3.jar.zip

    2. **访问控制**:该框架提供了细粒度的访问控制,可以基于URL、方法级别或者业务对象进行权限控制。它支持基于角色的访问控制(RBAC),并可以扩展到更复杂的策略。 3. **会话管理**:Acegi Security提供了会话...

    acegi-security-catalina-1.0.7.jar.zip

    Acegi Security的主要功能包括身份验证、授权、会话管理以及请求过滤,它通过与Spring框架的深度融合,使得开发者能够轻松地在应用中实现安全控制。1.0.7版本可能包含了当时已知的安全修复和性能优化。 "acegi-...

    acegi-security-resin-0.8.3.jar.zip

    Acegi Security Resin 0.8.3 是一个专门针对Java Web应用的安全框架,它为Spring框架提供了强大的安全控制和身份验证功能。这个版本的jar.zip包包含了Acegi Security与Resin服务器集成的特定实现,使得Resin用户可以...

    acegi-security-1.0.4.jar.zip

    2. **授权(Authorization)**:Acegi Security支持基于角色的访问控制(RBAC),允许开发者定义角色和权限,并将这些权限分配给特定用户或角色,以此来控制对应用程序资源的访问。 3. **会话管理(Session ...

    acegi-security-1.0.7-osgi.jar.zip

    它通过提供一系列可配置的拦截器和策略,使得安全控制能够无缝集成到Spring MVC和Spring事务管理中。 Acegi Security 1.0.7是该框架的一个特定版本,发布于2007年,包含了对当时已知问题的修复和改进。它支持多种...

    acegi-security-1.0.7.jar.zip

    总的来说,"acegi-security-1.0.7.jar.zip"包含了一个过时但曾经非常流行的Java安全框架,它的使用需要对Spring框架有一定的了解,同时也需要掌握声明式安全控制的概念和实践。尽管现在可能更多的是转向Spring ...

    acegi-security-resin-0.8.1.1.jar.zip

    1. Acegi Security是Spring生态中的一个安全框架,提供了强大的安全控制功能。 2. `acegi-security-resin-0.8.1.1.jar`是Acegi Security针对Resin应用服务器的特定版本实现,用于增强Resin的安全性。 3. Spring ...

    acegi-security-taglib-0.6.jar.zip

    Acegi Security Taglib是Acegi安全框架的一部分,它是一个用于Spring框架的安全解决方案,提供了一整套功能强大的安全特性。这个0.6版本的jar文件包含了用于Web应用的安全控制和访问控制的标签库,使得开发者能够...

    acegi-security-resin-1.0.7.jar.zip

    Acegi Security是一款在Java应用程序中实现安全控制的框架,它为Spring框架提供了强大的身份验证和授权功能。在Java世界中,安全通常是应用开发中的一个重要环节,Acegi Security为开发者提供了全面的安全解决方案,...

    acegi-security-0.8.3.jar.zip

    在这个压缩包中,`acegi-security-0.8.3.jar` 是核心的安全库,包含所有必要的类和资源,开发者可以将其引入项目中来实现安全控制。由于Acegi Security是基于Spring框架设计的,所以它与Spring有着紧密的集成,能够...

    acegi-security-catalina-server.jar.zip

    Acegi Security通过Spring的依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming)能力,使得安全控制能够轻松地融入到应用程序的各个层面。 Catalina是Apache Tomcat服务器的核心部分,...

    acegi-security-jboss-1.0.7.jar.zip

    同时,确保你的项目配置符合Acegi Security的要求,包括设置安全相关的bean和配置文件。如果你的项目已经使用了Spring,那么集成Acegi Security将相对容易,因为它们的设计理念和API有很好的契合性。 总的来说,...

    acegi-security-resin-lib-0.6.1.jar.zip

    它通过与Spring框架的紧密集成,使得开发者可以方便地在Spring应用中实现安全控制,而无需深入理解底层的复杂细节。0.6.1是Acegi Security的一个早期版本,可能包含了基本的身份验证机制、角色授权、基于表达式的...

    acegi-security-0.6.1.jar.zip

    在0.6.1版本中,可能包括了对HTTP基本认证、表单登录、方法级别安全控制、基于角色的访问控制(RBAC)等特性的支持。 "acegi-security-0.6.1.jar"是Acegi Security的主库文件,包含了所有必要的类和资源,使得...

Global site tag (gtag.js) - Google Analytics