﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-advancement-文章分类-Spring</title><link>http://www.blogjava.net/kjunch1129/category/18821.html</link><description>前进</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 15:35:38 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 15:35:38 GMT</pubDate><ttl>60</ttl><item><title>Acegi配置</title><link>http://www.blogjava.net/kjunch1129/articles/90959.html</link><dc:creator>navy</dc:creator><author>navy</author><pubDate>Sat, 30 Dec 2006 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/kjunch1129/articles/90959.html</guid><wfw:comment>http://www.blogjava.net/kjunch1129/comments/90959.html</wfw:comment><comments>http://www.blogjava.net/kjunch1129/articles/90959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kjunch1129/comments/commentRss/90959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kjunch1129/services/trackbacks/90959.html</trackback:ping><description><![CDATA[
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;<br />&lt;beans&gt;<br />   &lt;!-- ======================== FILTER CHAIN ======================= --&gt;<br /> &lt;!--  if you wish to use channel security, add "channelProcessingFilter," in front<br />       of "httpSessionContextIntegrationFilter" in the list below --&gt;<br />       <br /> &lt;!-- 首先是声明过滤器序列 --&gt;<br /> &lt;bean id="filterChainProxy" class="net.sf.acegisecurity.util.FilterChainProxy"&gt;<br />      &lt;property name="filterInvocationDefinitionSource"&gt;<br />         &lt;value&gt;<br />      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />      PATTERN_TYPE_APACHE_ANT<br />              /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter<br />         &lt;/value&gt;<br />      &lt;/property&gt;<br />    &lt;/bean&gt;</p>
		<p>&lt;!-- 根据session中存放的信息组装ContextHolder。ContextHolder主要用于存放SecureContext，包括用户的权限信息 --&gt;<br />  &lt;bean id="httpSessionContextIntegrationFilter" class="net.sf.acegisecurity.context.HttpSessionContextIntegrationFilter"&gt;<br />  &lt;!-- 说明： context属性指定context的实现类。 --&gt;<br />     &lt;property name="context"&gt;&lt;value&gt;net.sf.acegisecurity.context.security.SecureContextImpl&lt;/value&gt;&lt;/property&gt;<br />  &lt;/bean&gt;</p>
		<p>   &lt;!-- ======================== AUTHENTICATION ======================= --&gt;<br />   &lt;!-- <br />   （认证管理器）用于管理AuthenticationProvider（认证提供者）。它的作用是使你能够通过多个不同的认证管理源来对用户进行认证。<br />   认证管理器将依次调用认证提供者的认证方法，直到认证通过。本程序使用两种认证提供者。<br />    --&gt;<br />   &lt;bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager"&gt;<br />      &lt;property name="providers"&gt;<br />         &lt;list&gt;<br />            &lt;ref local="daoAuthenticationProvider"/&gt; &lt;!-- 基于数据库的认证提供者。 --&gt;<br />           &lt;ref local="anonymousAuthenticationProvider"/&gt; &lt;!-- 用于认证匿名用户。 --&gt;<br />         &lt;/list&gt;<br />      &lt;/property&gt;<br />   &lt;/bean&gt;</p>
		<p>&lt;!-- <br />是认证数据访问对象，它能够从默认的数据库结构中获取用户信息，由于Acegi默认的数据库结构和本程序的不同，<br />因此需要修改jdbcDaoImpl的默认sql。<br />注意，采用这种方式能够使Acegi很好的兼容旧的应用程序，因为它对底层的数据结构并没有强制要求。<br /> --&gt;<br />   &lt;bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl"&gt;<br />     &lt;property name="dataSource"&gt;&lt;ref bean="dataSource"/&gt;&lt;/property&gt; &lt;!-- 数据源bean --&gt;<br />     &lt;property name="usersByUsernameQuery"&gt; &lt;!-- 用户信息查询sql --&gt;<br />       &lt;value&gt;SELECT USERNAME, PASSWORD,ENABLED FROM USERINFO WHERE USERNAME=?&lt;/value&gt;<br />     &lt;/property&gt;<br />     &lt;property name="authoritiesByUsernameQuery"&gt; &lt;!-- 用户权限查询sql --&gt;<br />       &lt;value&gt;<br />         SELECT username,authority FROM `userinfo` u, `authorities` a,`user_auth` ua<br />         WHERE u.user_id=ua.user_id<br />         and a.auth_id=ua.auth_id<br />         and u.username = ?<br />       &lt;/value&gt;<br />     &lt;/property&gt;<br />   &lt;/bean&gt;</p>
		<p>  &lt;bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/&gt;</p>
		<p>  &lt;bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;<br />     &lt;property name="cacheManager"&gt; &lt;ref local="cacheManager"/&gt; &lt;/property&gt;<br />     &lt;property name="cacheName"&gt; &lt;value&gt;userCache&lt;/value&gt; &lt;/property&gt;<br />  &lt;/bean&gt;</p>
		<p>&lt;!-- 用于定义用户信息cache功能的提供者 --&gt;<br />&lt;!-- 本程序采用ehcache作为cache实现。由于认证管理器在每次对http请求进行认证之前都会查找用户信息，<br />通过使用cache就可以避免每次都重复访问数据库。 --&gt;<br />  &lt;bean id="userCache" class="net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"&gt;<br />     &lt;property name="cache"&gt;&lt;ref local="userCacheBackend"/&gt;&lt;/property&gt; &lt;!-- 定义ehcache工厂bean --&gt;<br />  &lt;/bean&gt;</p>
		<p>&lt;!-- <br />主要功能是从数据库取出用户名和密码，判断登录信息是否正确，如果是，则取出用户权限等用户信息，<br />并且存放到cache中，以便以后再次使用。具体流程可以参考：DaoAuthenticationProvider的authenticate方法。<br /> --&gt;<br />   &lt;bean id="daoAuthenticationProvider" class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt;<br />      &lt;property name="authenticationDao"&gt;&lt;ref local="jdbcDaoImpl"/&gt;&lt;/property&gt; &lt;!-- 认证数据访问对象，用于获取用户信息，包括：用户名，用户密码，用户状态和用户权限。 --&gt;<br />      &lt;property name="userCache"&gt;&lt;ref local="userCache"/&gt;&lt;/property&gt; &lt;!-- 用户信息cache实现bean --&gt;<br />   &lt;/bean&gt;</p>
		<p>   &lt;!-- Automatically receives AuthenticationEvent messages from DaoAuthenticationProvider --&gt;<br />   &lt;bean id="loggerListener" class="net.sf.acegisecurity.providers.dao.event.LoggerListener"/&gt;</p>
		<p>&lt;!-- 匿名用户处理。如果用户尚未登录，将生成一个匿名用户的Authentication存放到 ContextHolder中 --&gt;<br />&lt;!-- anonymousProcessingFilter的作用是判断ContextHolder中是否有Authentication对象，如果没有就创建一个Authentication对象，<br />其中包含的用户名是anonymousUser，用户权限是AUTH_ANONYMOUS。这使得没有登录的匿名用户能够自动的获得匿名的用户名和权限。 --&gt;<br />  &lt;bean id="anonymousProcessingFilter" class="net.sf.acegisecurity.providers.anonymous.AnonymousProcessingFilter"&gt;<br />     &lt;property name="key"&gt;&lt;value&gt;foobar&lt;/value&gt;&lt;/property&gt;<br />     &lt;property name="userAttribute"&gt;&lt;value&gt;anonymousUser,AUTH_ANONYMOUS&lt;/value&gt;&lt;/property&gt;<br />  &lt;/bean&gt;</p>
		<p>  &lt;bean id="anonymousAuthenticationProvider" class="net.sf.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider"&gt;<br />     &lt;property name="key"&gt;&lt;value&gt;foobar&lt;/value&gt;&lt;/property&gt;<br />  &lt;/bean&gt;</p>
		<p>   &lt;!-- ===================== HTTP REQUEST SECURITY ==================== --&gt;<br />   &lt;!-- 处理认证请求（通常是一个登录页面的表单请求） --&gt;<br />   &lt;bean id="authenticationProcessingFilter" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&gt;<br />      &lt;property name="authenticationManager"&gt;&lt;ref bean="authenticationManager"/&gt;&lt;/property&gt; &lt;!-- 认证管理器 --&gt;<br />      &lt;property name="authenticationFailureUrl"&gt;&lt;value&gt;/login.jsp?login_error=1&lt;/value&gt;&lt;/property&gt; &lt;!-- 认证失败后，重定向的url --&gt;<br />      &lt;property name="defaultTargetUrl"&gt;&lt;value&gt;/index.jsp&lt;/value&gt;&lt;/property&gt; &lt;!-- 认证成功后，重定向的url --&gt;<br />      &lt;property name="filterProcessesUrl"&gt;&lt;value&gt;/j_acegi_security_check&lt;/value&gt;&lt;/property&gt;<br />      &lt;!-- 该过滤器拦截的url，通常是/j_acegi_security_check，和登录页面（login.jsp）的登录表单的action相同 --&gt;<br />   &lt;/bean&gt;</p>
		<p>&lt;!-- 强制安全验证过滤器。验证所请求的url是否在用户的权限范围内。 --&gt;<br />  &lt;bean id="securityEnforcementFilter" class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter"&gt;<br />     &lt;property name="filterSecurityInterceptor"&gt;&lt;ref local="filterInvocationInterceptor"/&gt;&lt;/property&gt; &lt;!-- 实现对URL资源进行授权访问。 --&gt;<br />     &lt;property name="authenticationEntryPoint"&gt;&lt;ref local="authenticationProcessingFilterEntryPoint"/&gt;&lt;/property&gt;<br />     &lt;!-- 配置登录界面信息。 --&gt;<br />  &lt;/bean&gt;</p>
		<p>   &lt;bean id="authenticationProcessingFilterEntryPoint" class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&gt;<br />      &lt;property name="loginFormUrl"&gt;&lt;value&gt;/login.jsp&lt;/value&gt;&lt;/property&gt;<br />      &lt;property name="forceHttps"&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt;<br />   &lt;/bean&gt;</p>
		<p>   <br />   &lt;bean id="filterInvocationInterceptor" class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor"&gt;<br />      &lt;property name="authenticationManager"&gt;&lt;ref bean="authenticationManager"/&gt;&lt;/property&gt; &lt;!-- 认证管理器 --&gt;<br />      &lt;property name="accessDecisionManager"&gt;&lt;ref local="httpRequestAccessDecisionManager"/&gt;&lt;/property&gt; &lt;!-- 投票通过策略管理器 --&gt;<br />      &lt;!-- accessDecisionManager（访问决策管理器）首先通过authenticationManager判断用户是否通过认证（即是否已经登录），<br />      然后根据objectDefinitionSource的配置信息调用accessDecisionManager对用户权限进行投票。 --&gt;<br />      &lt;property name="objectDefinitionSource"&gt; &lt;!-- URL的权限配置信息。用于指定不同的URL资源对应的权限。 --&gt;<br />         &lt;value&gt;<br />       CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />       PATTERN_TYPE_APACHE_ANT<br />       /**/*.jpg=AUTH_ANONYMOUS,AUTH_USER<br />       /**/*.gif=AUTH_ANONYMOUS,AUTH_USER<br />       /**/*.png=AUTH_ANONYMOUS,AUTH_USER<br />       /login.jsp*=AUTH_ANONYMOUS,AUTH_USER<br />      /**=AUTH_USER<br />         &lt;/value&gt;<br />         &lt;!-- 以上配置指定AUTH_ANONYMOUS权限的用户（即匿名用户）只可以访问图片资源和登录页面，AUTH_USER权限的用户可以访问全部WEB资源。 --&gt;<br />      &lt;/property&gt;<br />   &lt;/bean&gt;</p>
		<p>&lt;!-- httpRequestAccessDecisionManager（投票通过策略管理器）用于管理投票通过策略。Acegi提供三种投票通过策略的实现：<br />AffirmativeBased（至少一个投票者同意方可通过），ConsensusBased（多数投票者同意方可通过），UnanimousBased（所有投票者同意方可通过）。<br />本程序采用AffirmativeBased策略，并且禁止“没人反对就通过”的投票策略。 --&gt;<br />  &lt;bean id="httpRequestAccessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased"&gt;<br />     &lt;property name="allowIfAllAbstainDecisions"&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt; &lt;!-- 设定是否允许：“没人反对就通过”的投票策略 --&gt;<br />     &lt;property name="decisionVoters"&gt; &lt;!-- 投票者 --&gt;<br />        &lt;list&gt;<br />           &lt;ref bean="roleVoter"/&gt;<br />        &lt;/list&gt;<br />     &lt;/property&gt;<br />  &lt;/bean&gt;</p>
		<p>  &lt;!-- 通过设定rolePrefix可以指定roleVoter所支持的权限范围 --&gt;<br />  &lt;bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"&gt;<br />  &lt;!-- 该投票者支持的权限前缀，默认是“ROLE_”，本程序所有的权限字符串均以“AUTH_”开头，故设为“AUTH_” --&gt;<br />    &lt;property name="rolePrefix"&gt;&lt;value&gt;AUTH_&lt;/value&gt;&lt;/property&gt;<br />  &lt;/bean&gt;<br />&lt;/beans&gt;<br /></p>
<img src ="http://www.blogjava.net/kjunch1129/aggbug/90959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kjunch1129/" target="_blank">navy</a> 2006-12-30 10:28 <a href="http://www.blogjava.net/kjunch1129/articles/90959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>