﻿<?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-tomato2088-随笔分类-安全认证相关</title><link>http://www.blogjava.net/tomato2088/category/17990.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:35:03 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:35:03 GMT</pubDate><ttl>60</ttl><item><title>转：Acegi安全系统的配置</title><link>http://www.blogjava.net/tomato2088/archive/2007/02/02/97642.html</link><dc:creator>西红柿（tomato）</dc:creator><author>西红柿（tomato）</author><pubDate>Fri, 02 Feb 2007 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/tomato2088/archive/2007/02/02/97642.html</guid><wfw:comment>http://www.blogjava.net/tomato2088/comments/97642.html</wfw:comment><comments>http://www.blogjava.net/tomato2088/archive/2007/02/02/97642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tomato2088/comments/commentRss/97642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tomato2088/services/trackbacks/97642.html</trackback:ping><description><![CDATA[
		<font color="#000080"> Acegi安全系统的配置 </font>
		<div class="postText">
				<p>        <br />Acegi 的配置看起来非常复杂,但事实上在实际项目的安全应用中我们并不需要那么多功能,清楚的了解Acegi配置中各项的功能，有助于我们灵活的运用Acegi于实践中。</p>
		</div>
		<p>2.1 在Web.xml中的配置</p>
		<p>1)  <strong>FilterToBeanProxy</strong><br />　　Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet Filter的方式，它委托Spring中的Bean -- FilterChainProxy来完成过滤功能，这好处是简化了web.xml的配置，并且充分利用了Spring IOC的优势。FilterChainProxy包含了处理认证过程的filter列表，每个filter都有各自的功能。</p>
		<pre>    &lt;filter&gt;<br />        &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />        &lt;filter-class&gt;org.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;targetClass&lt;/param-name&gt;<br />            &lt;param-value&gt;org.acegisecurity.util.FilterChainProxy&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />    &lt;/filter&gt;</pre>
		<p>2) <strong>filter-mapping</strong><br />　　&lt;filter-mapping&gt;限定了FilterToBeanProxy的URL匹配模式,只有*.do和*.jsp和/j_acegi_security_check 的请求才会受到权限控制，对javascript,css等不限制。</p>
		<pre>   &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />      &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;<br />    <br />    &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />      &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;<br />    <br />    &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />      &lt;url-pattern&gt;/j_acegi_security_check&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;</pre>
		<p>3) <strong>HttpSessionEventPublisher</strong><br />　　&lt;listener&gt;的HttpSessionEventPublisher用于发布HttpSessionApplicationEvents和HttpSessionDestroyedEvent事件给spring的applicationcontext。</p>
		<pre>    &lt;listener&gt;<br />        &lt;listener-class&gt;org.acegisecurity.ui.session.HttpSessionEventPublisher&lt;/listener-class&gt;<br />    &lt;/listener&gt;<br /></pre>
		<h2>
				<br />2.2 在applicationContext-acegi-security.xml中</h2>
		<h3>2.2.1 FILTER CHAIN</h3>
		<p>　　FilterChainProxy会按顺序来调用这些filter,使这些filter能享用Spring ioc的功能, CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON定义了url比较前先转为小写， PATTERN_TYPE_APACHE_ANT定义了使用Apache ant的匹配模式 </p>
		<pre>    &lt;bean id="filterChainProxy" class="org.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,<br />basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,<br /> exceptionTranslationFilter,filterInvocationInterceptor<br />            &lt;/value&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;</pre>
		<h3>2.2.2 基础认证</h3>
		<p>1) <strong>authenticationManager</strong><br />　　起到认证管理的作用，它将验证的功能委托给多个Provider，并通过遍历Providers, 以保证获取不同来源的身份认证，若某个Provider能成功确认当前用户的身份，authenticate()方法会返回一个完整的包含用户授权信息的Authentication对象，否则会抛出一个AuthenticationException。<br />Acegi提供了不同的AuthenticationProvider的实现,如：<br />        DaoAuthenticationProvider 从数据库中读取用户信息验证身份<br />        AnonymousAuthenticationProvider 匿名用户身份认证<br />        RememberMeAuthenticationProvider 已存cookie中的用户信息身份认证<br />        AuthByAdapterProvider 使用容器的适配器验证身份<br />        CasAuthenticationProvider 根据Yale中心认证服务验证身份, 用于实现单点登陆<br />        JaasAuthenticationProvider 从JASS登陆配置中获取用户信息验证身份<br />        RemoteAuthenticationProvider 根据远程服务验证用户身份<br />        RunAsImplAuthenticationProvider 对身份已被管理器替换的用户进行验证<br />        X509AuthenticationProvider 从X509认证中获取用户信息验证身份<br />        TestingAuthenticationProvider 单元测试时使用</p>
		<p>        每个认证者会对自己指定的证明信息进行认证，如DaoAuthenticationProvider仅对UsernamePasswordAuthenticationToken这个证明信息进行认证。</p>
		<pre>&lt;bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"&gt;<br />        &lt;property name="providers"&gt;<br />            &lt;list&gt;<br />                &lt;ref local="daoAuthenticationProvider"/&gt;<br />                &lt;ref local="anonymousAuthenticationProvider"/&gt;<br />                &lt;ref local="rememberMeAuthenticationProvider"/&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />&lt;/bean&gt;</pre>
		<p>
				<br />2) <strong>daoAuthenticationProvider</strong><br />　　进行简单的基于数据库的身份验证。DaoAuthenticationProvider获取数据库中的账号密码并进行匹配，若成功则在通过用户身份的同时返回一个包含授权信息的Authentication对象，否则身份验证失败，抛出一个AuthenticatiionException。</p>
		<pre>    &lt;bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt;<br />        &lt;property name="userDetailsService" ref="jdbcDaoImpl"/&gt;<br />        &lt;property name="userCache" ref="userCache"/&gt;<br />        &lt;property name="passwordEncoder" ref="passwordEncoder"/&gt;<br />   &lt;/bean&gt;</pre>
		<p>
				<br />3) <strong>passwordEncoder</strong><br />　　使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:<br />PlaintextPasswordEncoder—默认，不加密，返回明文.<br />ShaPasswordEncoder—哈希算法(SHA)加密<br />Md5PasswordEncoder—消息摘要(MD5)加密</p>
		<pre>&lt;bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/&gt;</pre>
		<p>
				<br />4) <strong>jdbcDaoImpl</strong><br />　　用于在数据中获取用户信息。 acegi提供了用户及授权的表结构，但是您也可以自己来实现。通过usersByUsernameQuery这个SQL得到你的(用户ID,密码,状态信息);通过authoritiesByUsernameQuery这个SQL得到你的(用户ID,授权信息)</p>
		<pre> &lt;bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"&gt;<br />        &lt;property name="dataSource" ref="dataSource"/&gt;<br />        &lt;property name="usersByUsernameQuery"&gt;<br />            &lt;value&gt;select loginid,passwd,1 from users where loginid = ?&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="authoritiesByUsernameQuery"&gt;<br />            &lt;value&gt;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<br />                r.id=rp.role_id and p.status='1' and u.loginid=?&lt;/value&gt;<br />        &lt;/property&gt;<br />&lt;/bean&gt;</pre>
		<p>5) <strong>userCache　&amp;  resourceCache</strong><br />　　缓存用户和资源相对应的权限信息。每当请求一个受保护资源时，daoAuthenticationProvider就会被调用以获取用户授权信息。如果每次都从数据库获取的话，那代价很高，对于不常改变的用户和资源信息来说，最好是把相关授权信息缓存起来。(详见 <a href="http://www.springside.org.cn/docs/reference/Acegi4.htm">2.6.3 资源权限定义扩展</a> )<br />userCache提供了两种实现: NullUserCache和EhCacheBasedUserCache, NullUserCache实际上就是不进行任何缓存，EhCacheBasedUserCache是使用Ehcache来实现缓功能。</p>
		<pre>    &lt;bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;<br />        &lt;property name="cacheManager" ref="cacheManager"/&gt;<br />        &lt;property name="cacheName" value="userCache"/&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache" autowire="byName"&gt;<br />        &lt;property name="cache" ref="userCacheBackend"/&gt;<br />      &lt;/bean&gt;<br />    &lt;bean id="resourceCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;<br />        &lt;property name="cacheManager" ref="cacheManager"/&gt;<br />        &lt;property name="cacheName" value="resourceCache"/&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="resourceCache" class="org.springside.modules.security.service.acegi.cache.ResourceCache" autowire="byName"&gt;<br />        &lt;property name="cache" ref="resourceCacheBackend"/&gt;<br />    &lt;/bean&gt;</pre>
		<p>
				<br />6) <strong>basicProcessingFilter</strong><br />　　用于处理HTTP头的认证信息，如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如IE,Navigator的HTTP头中获取用户信息，将他们转交给通过authenticationManager属性装配的认证管理器。如果认证成功，会将一个Authentication对象放到会话中，否则，如果认证失败，会将控制转交给认证入口点(通过authenticationEntryPoint属性装配)</p>
		<pre>    &lt;bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/&gt;<br />    &lt;/bean&gt;</pre>
		<p>7) <strong>basicProcessingFilterEntryPoint</strong><br />　　通过向浏览器发送一个HTTP401(未授权)消息，提示用户登录。<br />处理基于HTTP的授权过程， 在当验证过程出现异常后的"去向"，通常实现转向、在response里加入error信息等功能。</p>
		<pre> &lt;bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint"&gt;<br />        &lt;property name="realmName" value="SpringSide Realm"/&gt;<br />&lt;/bean&gt;</pre>
		<p>8) <strong>authenticationProcessingFilterEntryPoint</strong><br />　　当抛出AccessDeniedException时，将用户重定向到登录界面。属性loginFormUrl配置了一个登录表单的URL,当需要用户登录时，authenticationProcessingFilterEntryPoint会将用户重定向到该URL</p>
		<pre> &lt;bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&gt;<br />        &lt;property name="loginFormUrl"&gt;<br />            &lt;value&gt;/security/login.jsp&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="forceHttps" value="false"/&gt;<br />&lt;/bean&gt;</pre>
		<h2>2.2.3 HTTP安全请求</h2>
		<p>1) <strong>httpSessionContextIntegrationFilter</strong><br />　　每次request前 HttpSessionContextIntegrationFilter从Session中获取Authentication对象，在request完后, 又把Authentication对象保存到Session中供下次request使用,此filter必须其他Acegi filter前使用，使之能跨越多个请求。</p>
		<pre>&lt;bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"&gt;&lt;/bean&gt;<br />    &lt;bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"&gt;<br />        &lt;property name="allowIfAllAbstainDecisions" value="false"/&gt;<br />        &lt;property name="decisionVoters"&gt;<br />            &lt;list&gt;<br />                &lt;ref bean="roleVoter"/&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />&lt;/bean&gt;</pre>
		<p>
				<br />2) <strong>httpRequestAccessDecisionManager</strong><br />　　经过投票机制来决定是否可以访问某一资源(URL或方法)。allowIfAllAbstainDecisions为false时如果有一个或以上的decisionVoters投票通过,则授权通过。可选的决策机制有ConsensusBased和UnanimousBased</p>
		<pre>    &lt;bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"&gt;<br />        &lt;property name="allowIfAllAbstainDecisions" value="false"/&gt;<br />        &lt;property name="decisionVoters"&gt;<br />            &lt;list&gt;<br />                &lt;ref bean="roleVoter"/&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;</pre>
		<p>
				<br />3) <strong>roleVoter</strong><br /> 　　必须是以rolePrefix设定的value开头的权限才能进行投票,如AUTH_ , ROLE_</p>
		<pre>    &lt;bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter"&gt;<br />        &lt;property name="rolePrefix" value="AUTH_"/&gt;<br />   &lt;/bean&gt;</pre>
		<p>4）<strong>exceptionTranslationFilter</strong><br />　　异常转换过滤器，主要是处理AccessDeniedException和AuthenticationException，将给每个异常找到合适的"去向" </p>
		<pre>   &lt;bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"&gt;<br />        &lt;property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"/&gt;<br />    &lt;/bean&gt;</pre>
		<p>5) <strong>authenticationProcessingFilter</strong><br />　　和servlet spec差不多,处理登陆请求.当身份验证成功时，AuthenticationProcessingFilter会在会话中放置一个Authentication对象，并且重定向到登录成功页面<br />         authenticationFailureUrl定义登陆失败时转向的页面<br />         defaultTargetUrl定义登陆成功时转向的页面<br />         filterProcessesUrl定义登陆请求的页面<br />         rememberMeServices用于在验证成功后添加cookie信息</p>
		<pre>    &lt;bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="authenticationFailureUrl"&gt;<br />            &lt;value&gt;/security/login.jsp?login_error=1&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="defaultTargetUrl"&gt;<br />            &lt;value&gt;/admin/index.jsp&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="filterProcessesUrl"&gt;<br />            &lt;value&gt;/j_acegi_security_check&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="rememberMeServices" ref="rememberMeServices"/&gt;<br />    &lt;/bean&gt;</pre>
		<p>6) <strong>filterInvocationInterceptor</strong><br />　　在执行转向url前检查objectDefinitionSource中设定的用户权限信息。首先，objectDefinitionSource中定义了访问URL需要的属性信息(这里的属性信息仅仅是标志，告诉accessDecisionManager要用哪些voter来投票)。然后，authenticationManager掉用自己的provider来对用户的认证信息进行校验。最后，有投票者根据用户持有认证和访问url需要的属性，调用自己的voter来投票，决定是否允许访问。</p>
		<pre>    &lt;bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/&gt;<br />        &lt;property name="objectDefinitionSource" ref="filterDefinitionSource"/&gt;<br />    &lt;/bean&gt;</pre>
		<p>
				<br />7) <strong>filterDefinitionSource </strong>(详见 <a href="http://www.springside.org.cn/docs/reference/Acegi4.htm">2.6.3 资源权限定义扩展</a>)<br />　　自定义DBFilterInvocationDefinitionSource从数据库和cache中读取保护资源及其需要的访问权限信息 </p>
		<pre>&lt;bean id="filterDefinitionSource" class="org.springside.modules.security.service.acegi.DBFilterInvocationDefinitionSource"&gt;<br />        &lt;property name="convertUrlToLowercaseBeforeComparison" value="true"/&gt;<br />        &lt;property name="useAntPath" value="true"/&gt;<br />        &lt;property name="acegiCacheManager" ref="acegiCacheManager"/&gt;<br />&lt;/bean&gt;</pre>
		<h2>2.2.4 方法调用安全控制</h2>
		<p>(详见 <a href="http://www.springside.org.cn/docs/reference/Acegi4.htm">2.6.3 资源权限定义扩展</a>)</p>
		<p>1) methodSecurityInterceptor<br />　　在执行方法前进行拦截，检查用户权限信息<br />2) methodDefinitionSource<br />　　自定义MethodDefinitionSource从cache中读取权限</p>
		<pre>   &lt;bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/&gt;<br />        &lt;property name="objectDefinitionSource" ref="methodDefinitionSource"/&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="methodDefinitionSource" class="org.springside.modules.security.service.acegi.DBMethodDefinitionSource"&gt;<br />        &lt;property name="acegiCacheManager" ref="acegiCacheManager"/&gt;<br />    &lt;/bean&gt;</pre>
		<h2>2.3 Jcaptcha验证码</h2>
		<p>采用 <a href="http://jcaptcha.sourceforge.net/">http://jcaptcha.sourceforge.net</a> 作为通用的验证码方案，请参考SpringSide中的例子，或网上的：<br /><a href="http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse">http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse</a>。</p>
		<p>差沙在此过程中又发现acegi logout filter的错误，进行了修正。</p>
		<p>另外它默认提供的图片比较难认，我们custom了一个美观一点的版本。</p>
<img src ="http://www.blogjava.net/tomato2088/aggbug/97642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tomato2088/" target="_blank">西红柿（tomato）</a> 2007-02-02 20:31 <a href="http://www.blogjava.net/tomato2088/archive/2007/02/02/97642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：CAS及客户端Acegi的安装配置指南 </title><link>http://www.blogjava.net/tomato2088/archive/2007/02/02/97639.html</link><dc:creator>西红柿（tomato）</dc:creator><author>西红柿（tomato）</author><pubDate>Fri, 02 Feb 2007 12:28:00 GMT</pubDate><guid>http://www.blogjava.net/tomato2088/archive/2007/02/02/97639.html</guid><wfw:comment>http://www.blogjava.net/tomato2088/comments/97639.html</wfw:comment><comments>http://www.blogjava.net/tomato2088/archive/2007/02/02/97639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tomato2088/comments/commentRss/97639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tomato2088/services/trackbacks/97639.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/tomato2088/archive/2007/02/02/97639.html'>阅读全文</a><img src ="http://www.blogjava.net/tomato2088/aggbug/97639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tomato2088/" target="_blank">西红柿（tomato）</a> 2007-02-02 20:28 <a href="http://www.blogjava.net/tomato2088/archive/2007/02/02/97639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi1.0.3 + Spring2.0.1 + Hibernate3.2 精解Demo </title><link>http://www.blogjava.net/tomato2088/archive/2006/12/11/86862.html</link><dc:creator>西红柿（tomato）</dc:creator><author>西红柿（tomato）</author><pubDate>Mon, 11 Dec 2006 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/tomato2088/archive/2006/12/11/86862.html</guid><wfw:comment>http://www.blogjava.net/tomato2088/comments/86862.html</wfw:comment><comments>http://www.blogjava.net/tomato2088/archive/2006/12/11/86862.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/tomato2088/comments/commentRss/86862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tomato2088/services/trackbacks/86862.html</trackback:ping><description><![CDATA[
		<p>Acegi1.0.3 使用的是Spring1.2.8<br />本人经过对Acegi1.0.3 的源代码进行删选，并引入到Spring2.0.1环境下，做了严格的测试。<br /><br />本demo 就是 在 Spring2.0.1 + Hibernate3.2 环境下，针对视图层使用 Struts 和 JSF 分别进行了集成，简单鲜明描述如何使用 Acegi1.0.3 进行基于用户角色的动态授权安全控制。</p>
		<p>本demo既适合于JSF + Spring2.0.1 + Hibernate3.2 项目也适合于Struts + Spring2.0.1 + Hibernate3.2项目．<br /><br />未列入特别说明没有授权的企业和个人都可以自由免费下载使用提供宝贵意见．<br /><br />本人不急功近利，正在做完整的文档编写，做最后严格的测试，近期在此免费发布，敬请关注．</p>
<img src ="http://www.blogjava.net/tomato2088/aggbug/86862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tomato2088/" target="_blank">西红柿（tomato）</a> 2006-12-11 12:21 <a href="http://www.blogjava.net/tomato2088/archive/2006/12/11/86862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi＋hibernate 动态实现基于角色的权限管理</title><link>http://www.blogjava.net/tomato2088/archive/2006/12/03/85190.html</link><dc:creator>西红柿（tomato）</dc:creator><author>西红柿（tomato）</author><pubDate>Sun, 03 Dec 2006 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/tomato2088/archive/2006/12/03/85190.html</guid><wfw:comment>http://www.blogjava.net/tomato2088/comments/85190.html</wfw:comment><comments>http://www.blogjava.net/tomato2088/archive/2006/12/03/85190.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tomato2088/comments/commentRss/85190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tomato2088/services/trackbacks/85190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自:http://www.cublog.cn/u/11905/showart_162625.html最近在做项目遇到了权限管理，用户要求可以自己建立不同的角色对系统的资源进行控制， 不同的用户有不同的角色，又恰恰框架中用到了struts＋spring＋hibernate，要求在web层调用 业务逻辑层 时不考虑权限，web层可以控制用户的显示界面，逻辑层处理用户权限问题。 想来想去好像只有spr...&nbsp;&nbsp;<a href='http://www.blogjava.net/tomato2088/archive/2006/12/03/85190.html'>阅读全文</a><img src ="http://www.blogjava.net/tomato2088/aggbug/85190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tomato2088/" target="_blank">西红柿（tomato）</a> 2006-12-03 16:04 <a href="http://www.blogjava.net/tomato2088/archive/2006/12/03/85190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>