﻿<?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-无极，无际，无迹-文章分类-设计模式</title><link>http://www.blogjava.net/taochen1984/category/42643.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 27 Jan 2010 05:11:28 GMT</lastBuildDate><pubDate>Wed, 27 Jan 2010 05:11:28 GMT</pubDate><ttl>60</ttl><item><title>SpringSecurity使用记录（六）-- 本地配置二</title><link>http://www.blogjava.net/taochen1984/articles/310744.html</link><dc:creator>taochen</dc:creator><author>taochen</author><pubDate>Mon, 25 Jan 2010 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/taochen1984/articles/310744.html</guid><wfw:comment>http://www.blogjava.net/taochen1984/comments/310744.html</wfw:comment><comments>http://www.blogjava.net/taochen1984/articles/310744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/taochen1984/comments/commentRss/310744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/taochen1984/services/trackbacks/310744.html</trackback:ping><description><![CDATA[接着来。<br />
2.过滤器的配置：<br />
&nbsp; 我们已经配置了那些过滤器了，但是要跟spring context中的对象对应，于是乎，做了如下配置：<br />
&nbsp; &lt;beans:bean id="securityContextPersistenceFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.context.SecurityContextPersistenceFilter"&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="logoutFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.authentication.logout.LogoutFilter" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg type="java.lang.String" value="/"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg ref="securityContextLogoutHandler"/&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="basicAuthenticationFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="authenticationManager" ref="authenticationManager"&gt;&lt;/beans:property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"&gt;&lt;/beans:property&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="requestCacheAwareFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.savedrequest.RequestCacheAwareFilter"&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="securityContextHolderAwareRequestFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter"&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="anonymousAuthenticationFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="userAttribute" ref="anonymousUserAttribute"&gt;&lt;/beans:property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="key"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="anonymousUser"/&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="sessionManagementFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.session.SessionManagementFilter"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg&nbsp; type="org.springframework.security.web.context.SecurityContextRepository" ref="sessionSecurityContextRepository"/&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="exceptionTranslationFilter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.access.ExceptionTranslationFilter"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"/&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="filterSecurityInterceptor" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="authenticationManager"&nbsp; ref="authenticationManager" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="accessDecisionManager"&nbsp; ref="accessDecisionManager" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="securityMetadataSource" ref="securityMetadataSource" /&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; <br />
&nbsp; &lt;!-- The following beans are configured for the filters upstairs --&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;!-- ////for LogoutFilter///////////////////// --&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;beans:bean id="securityContextLogoutHandler" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;!-- ////for AnonymousAuthenticationFilter//// --&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;beans:bean id="anonymousUserAttribute" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.core.userdetails.memory.UserAttribute"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="authorities"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:ref&nbsp; bean="anonymousUserGrantedAuthority" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/beans:list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/beans:property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="password" value="anonymousUser"/&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="anonymousUserGrantedAuthority" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.core.authority.GrantedAuthorityImpl"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg type="java.lang.String" value="ROLE_ANONYMOUS"/&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;!-- ////for SessionManagementFilter////////// --&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;beans:bean id="sessionSecurityContextRepository" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.context.HttpSessionSecurityContextRepository"&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;!-- ////for FilterSecurityInterceptor//////// --&gt;<br />
&nbsp; &lt;!-- ///////////////////////////////////////// --&gt;<br />
&nbsp; &lt;beans:bean id="accessDecisionManager" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.access.vote.AffirmativeBased"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:property name="decisionVoters"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:ref bean="webExpressionVoter"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/beans:list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/beans:property&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="webExpressionVoter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.saveworld.authentication.web.access.expression.MyWebExpressionVoter"&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="securityMetadataSource" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.saveworld.authentication.web.access.intercept.MyFilterInvocationSecurityMetadataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg type="org.springframework.security.web.util.UrlMatcher" ref="urlMatcher" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg type="javax.sql.DataSource" ref="proxoolDataSource" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg type="org.springframework.security.web.access.expression.WebSecurityExpressionHandler" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ref="expressionHandler" /&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="urlMatcher"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.util.AntUrlPathMatcher" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beans:constructor-arg type="boolean" value="true" /&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
&nbsp; &lt;beans:bean id="expressionHandler" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
这里做几点说明：<br />
&nbsp;&nbsp; (1) 数据库中的权限相关的表：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLES<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; AUTHORITIES<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USER_AUTHS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLE_AUTHS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USERS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里的表结构还不是最终的，所以就不发上来误导兄弟姐妹们了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键是看我们如何加载这些持久化的东西。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个就要看看filterSecurityInterceptor了，它里面使用了一个securityMetadataSource，本地的securityMetadataSource实现代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class MyFilterInvocationSecurityMetadataSource extends DefaultFilterInvocationSecurityMetadataSource{<br />
&nbsp;&nbsp;&nbsp; private final static Log logger = LogFactory.getLog(ExpressionBasedFilterInvocationSecurityMetadataSource.class);<br />
&nbsp;&nbsp;&nbsp; private DataSource datasource;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public MyFilterInvocationSecurityMetadataSource(UrlMatcher urlMatcher,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSource datasource,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WebSecurityExpressionHandler expressionHandler) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; super(urlMatcher, processMap(initializeFromDb(datasource,null),expressionHandler.getExpressionParser()));<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; //This method is usefulless for now!<br />
&nbsp;&nbsp;&nbsp; //Because this method is used for parsing the expression kind<br />
&nbsp;&nbsp;&nbsp; private static LinkedHashMap&lt;RequestKey, Collection&lt;ConfigAttribute&gt;&gt; processMap(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkedHashMap&lt;RequestKey,Collection&lt;ConfigAttribute&gt;&gt; requestMap, ExpressionParser parser) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.notNull(parser, "SecurityExpressionHandler returned a null parser object");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkedHashMap&lt;RequestKey, Collection&lt;ConfigAttribute&gt;&gt; requestToExpressionAttributesMap =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new LinkedHashMap&lt;RequestKey, Collection&lt;ConfigAttribute&gt;&gt;(requestMap);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Map.Entry&lt;RequestKey, Collection&lt;ConfigAttribute&gt;&gt; entry : requestMap.entrySet()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestKey request = entry.getKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.isTrue(entry.getValue().size() == 1, "Expected a single expression attribute for " + request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList&lt;ConfigAttribute&gt; attributes = new ArrayList&lt;ConfigAttribute&gt;(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String expression = entry.getValue().toArray(new ConfigAttribute[1])[0].getAttribute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug("Adding web access control expression '" + expression + "', for " + request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Replacing WebExpressionConfigAttribute with MyWebExpressionConfigAttribute <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //which is defined locally!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attributes.add(new MyWebExpressionConfigAttribute(parser.parseExpression(expression)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ParseException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("Failed to parse expression '" + expression + "'");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; requestToExpressionAttributesMap.put(request, attributes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return requestToExpressionAttributesMap;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; private static LinkedHashMap&lt;RequestKey,Collection&lt;ConfigAttribute&gt;&gt; initializeFromDb(DataSource datasource,LinkedHashMap&lt;RequestKey, Collection&lt;ConfigAttribute&gt;&gt; configMap){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LinkedHashMap&lt;RequestKey,Collection&lt;ConfigAttribute&gt;&gt; result = <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new LinkedHashMap&lt;RequestKey, Collection&lt;ConfigAttribute&gt;&gt;();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Connection conn = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Statement&nbsp; stmt = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSet&nbsp; rs&nbsp;&nbsp; = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn = datasource.getConnection();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stmt = conn.createStatement();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; StringBuilder sql = new StringBuilder("SELECT b.AUTHORITYPATTERN ,'hasRole('||chr(39)||a.ROLENAME||chr(39)||')' rolename ")<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(" FROM ROLES a,AUTHORITIES b,ROLE_AUTHS c ")<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(" WHERE a.rolename = c.rolename AND b.authorityname = c.authorityname");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rs = stmt.executeQuery(sql.toString());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String roles = "";<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; RequestKey key = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; List&lt;ConfigAttribute&gt; value = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(rs != null &amp;&amp; rs.next()){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; key = new RequestKey(rs.getString(1));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; roles = rs.getString(2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String[] roleArray = roles.split(",|\\s+|;");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value = new ArrayList&lt;ConfigAttribute&gt;();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(String role : roleArray){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ConfigAttribute config = new SecurityConfig(role);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value.add(config);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result.put(key, value);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //just for test<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } finally{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rs.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stmt.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public boolean supports(Class&lt;?&gt; clazz) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return FilterInvocation.class.isAssignableFrom(clazz);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public DataSource getDatasource() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return datasource;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setDatasource(DataSource datasource) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.datasource = datasource;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;(2) expressionHandler:<br />
&nbsp;&nbsp;&nbsp;&nbsp; 这个东西要单独说说，我这里用的是表达式来检测用户角色的，所以，我用org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler来处理了，还有其他的方式，就是直接用角色进行判断，那样会更好，这里就不描述了！<br />
<br />
<br />
<img src ="http://www.blogjava.net/taochen1984/aggbug/310744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/taochen1984/" target="_blank">taochen</a> 2010-01-25 16:29 <a href="http://www.blogjava.net/taochen1984/articles/310744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringSecurity使用记录（六）-- 本地配置一</title><link>http://www.blogjava.net/taochen1984/articles/310221.html</link><dc:creator>taochen</dc:creator><author>taochen</author><pubDate>Mon, 25 Jan 2010 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/taochen1984/articles/310221.html</guid><wfw:comment>http://www.blogjava.net/taochen1984/comments/310221.html</wfw:comment><comments>http://www.blogjava.net/taochen1984/articles/310221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/taochen1984/comments/commentRss/310221.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/taochen1984/services/trackbacks/310221.html</trackback:ping><description><![CDATA[按照SpringSecurity的文档，我们可以使用namespace的配置方式（前篇中已经说明）。<br />
但是，我们这里的需求有点蹊跷，就是通过spring context进行权限配置太不方便，你想想能让人家客户通过spring xml来配置权限吗？不能，坚决不能！所以，我就单步跟踪获取里面的东西（这种方法比直接看代码快点，而且可以知道里面的逻辑结构！）<br />
那就开始吧：<br />
1.配置FilterChainProxy：<br />
&nbsp; SpringSecurity的验证过程是通过一系列的filter来实现的。<br />
&nbsp; 这种chain的设计模式比较经典，可以说相当经典！<br />
&nbsp; 看看代码实现：<br />
&nbsp; 上篇中说过，默认的配置要求&lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;，那这个springSecurityFilterChain是怎么来用的呢？<br />
&nbsp; public class DelegatingFilterProxy extends GenericFilterBean {<br />
&nbsp; ... ... ...<br />
&nbsp; protected void initFilterBean() throws ServletException {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // If no target bean name specified, use filter name.<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (this.targetBeanName == null) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.targetBeanName = getFilterName();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Fetch Spring root application context and initialize the delegate early,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // if possible. If the root application context will be started after this<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // filter proxy, we'll have to resort to lazy initialization.<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; synchronized (this.delegateMonitor) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WebApplicationContext wac = findWebApplicationContext();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (wac != null) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.delegate = initDelegate(wac);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; .....<br />
&nbsp; }<br />
&nbsp; 不用说，你会猜到我们没有配置过targetBeanName这个属性，所以，就有了this.targetBeanName = getFilterName();这样的话就会配置FilterChainProxy了，因为FilterChainProxy在springContext中id是springSecurityFilterChain，所以我们要通过自己的数据库方式配置的话，就要琢磨这个FilterChainProxy了！<br />
&nbsp; 所以，首先做点这样的配置吧：<br />
&nbsp; &lt;beans:bean id="myFilterChain" class="org.springframework.security.web.FilterChainProxy" &gt;<br />
&nbsp; &nbsp;&nbsp;&nbsp; &lt;filter-chain-map path-type="ant"&gt;<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;filter-chain pattern="/login.jsp*" filters="none"/&gt;<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;filter-chain pattern="/**" filters="securityContextPersistenceFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logoutFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myUsernamePasswordAuthenticationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basicAuthenticationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; requestCacheAwareFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; securityContextHolderAwareRequestFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anonymousAuthenticationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionManagementFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exceptionTranslationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterSecurityInterceptor"/&gt;<br />
&nbsp; &nbsp;&nbsp;&nbsp; &lt;/filter-chain-map&gt;<br />
&nbsp; &lt;/beans:bean&gt;<br />
这个里面配置的id为myFilterChain，所以要在web.xml里面做相应配置：<br />
&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;myFilterChain&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;<br />
&nbsp; &lt;/filter&gt;<br />
&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;myFilterChain&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp; &lt;/filter-mapping&gt;<br />
而且，尤为重要的是要配置上这些过滤器：<br />
filter-chain pattern="/**" filters="securityContextPersistenceFilter,logoutFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myUsernamePasswordAuthenticationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basicAuthenticationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; requestCacheAwareFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; securityContextHolderAwareRequestFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anonymousAuthenticationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionManagementFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exceptionTranslationFilter,<br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterSecurityInterceptor"<br />
针对这些过滤器的用途，在spring security的文档中有详细描述，这里不多说了，在文档中的具体位置是7.2 FilterChainProxy，看看这一章就会有感觉了，不过绝知此事要躬行啊！<br />
完成这些配置之后，我们就算是把入口给搭建好了！<br />
鉴于文档篇幅，换到下篇接着说。<br />
<br />
<img src ="http://www.blogjava.net/taochen1984/aggbug/310221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/taochen1984/" target="_blank">taochen</a> 2010-01-25 15:56 <a href="http://www.blogjava.net/taochen1984/articles/310221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringSecurity使用记录（一）</title><link>http://www.blogjava.net/taochen1984/articles/307203.html</link><dc:creator>taochen</dc:creator><author>taochen</author><pubDate>Thu, 24 Dec 2009 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/taochen1984/articles/307203.html</guid><wfw:comment>http://www.blogjava.net/taochen1984/comments/307203.html</wfw:comment><comments>http://www.blogjava.net/taochen1984/articles/307203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/taochen1984/comments/commentRss/307203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/taochen1984/services/trackbacks/307203.html</trackback:ping><description><![CDATA[第一次配置和使用SpringSecurity，总是要碰很多次墙！<br />
先说说个人理解的它里面比较有意义的架构。<br />
里面有好多设计模式的影子：策略模式，代理模式，工厂模式，链条模式=====，看到这些模式（除了工厂或单例）心里总是会有些兴奋，总算是看到了模式的真正练兵场！跟兄弟们好好分享一下!(才看了一天！有不对之处，还望各位斧正！)<br />
策略模式（Strategy Pattern）:<br />
主要说一下session相关的这个策略模式，以SessionAuthenticationStrategy接口的策略划分，根据我们的session安全策略，指定不同的策略，现在看是这种布局：<br />
<table border="0" cellpadding="2" cellspacing="2" width="853" height="280">
    <tbody>
        <tr>
            <td>&nbsp;顶层接口</td>
            <td>&nbsp;SessionAuthenticationStrategy</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;具体实现</td>
            <td>&nbsp;SessionFixationProtectionStrategy<br />
            （直接默认实现）</td>
            <td>&nbsp;NullAuthenticatedSessionStrategy<br />
            （空实现）<br />
            </td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;二级实现</td>
            <td>&nbsp;ConcurrentSessionControlStrategy</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<br />
画图比较麻烦，各位还是凑合着看吧！说明一下：顶层接口被下面&#8220;具体实现&#8221;两个类实现，而&#8220;二级实现&#8221;实现SessionFixationProtectionStrategy。具体采用哪种策略要看我们的配置了！<br />
代理模式（Proxy）：<br />
很明显的代理类，DelegatingFilterProxy和FilterChainProxy，这两个类看着心里都痒痒的，呵呵，平常总是看代理模式呀什么的，即时看着例子也不踏实，现在看到这两个东西，心里突然有种平静的激动！<br />
这两个代理类以FilterChainProxy为例说明一下吧，FilterChainProxy代理了权限验证Filters的工作，通过它来访问整个过滤器串里面的过滤器。<br />
Chain模式：这个也应该以FilterChainProxy这个类入口来分析，呵呵，有兴趣的各位就通过这个来看看吧！<br />
<img src ="http://www.blogjava.net/taochen1984/aggbug/307203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/taochen1984/" target="_blank">taochen</a> 2009-12-24 20:05 <a href="http://www.blogjava.net/taochen1984/articles/307203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>