??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品日韩专区silk ,亚洲成A∨人片天堂网无码,亚洲国产成人私人影院http://www.tkk7.com/taochen1984/category/42643.htmlzh-cnWed, 27 Jan 2010 05:11:28 GMTWed, 27 Jan 2010 05:11:28 GMT60SpringSecurity使用记录Q六Q?- 本地配置?/title><link>http://www.tkk7.com/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.tkk7.com/taochen1984/articles/310744.html</guid><wfw:comment>http://www.tkk7.com/taochen1984/comments/310744.html</wfw:comment><comments>http://www.tkk7.com/taochen1984/articles/310744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/taochen1984/comments/commentRss/310744.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/taochen1984/services/trackbacks/310744.html</trackback:ping><description><![CDATA[接着来?br /> 2.qo器的配置Q?br />   我们已经配置了那些过滤器了,但是要跟spring context中的对象对应Q于是乎Q做了如下配|:<br />   <beans:bean id="securityContextPersistenceFilter" <br />           class="org.springframework.security.web.context.SecurityContextPersistenceFilter"><br />   </beans:bean><br />   <beans:bean id="logoutFilter" <br />           class="org.springframework.security.web.authentication.logout.LogoutFilter" ><br />           <beans:constructor-arg type="java.lang.String" value="/"/><br />           <beans:constructor-arg ref="securityContextLogoutHandler"/><br />   </beans:bean><br />   <beans:bean id="basicAuthenticationFilter" <br />           class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"><br />           <beans:property name="authenticationManager" ref="authenticationManager"></beans:property><br />           <beans:property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"></beans:property><br />   </beans:bean><br />   <beans:bean id="requestCacheAwareFilter" <br />           class="org.springframework.security.web.savedrequest.RequestCacheAwareFilter"><br />   </beans:bean><br />   <beans:bean id="securityContextHolderAwareRequestFilter" <br />           class="org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter"><br />   </beans:bean><br />   <beans:bean id="anonymousAuthenticationFilter" <br />           class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter"><br />           <beans:property name="userAttribute" ref="anonymousUserAttribute"></beans:property><br />           <beans:property name="key"      value="anonymousUser"/><br />   </beans:bean><br />   <beans:bean id="sessionManagementFilter" <br />           class="org.springframework.security.web.session.SessionManagementFilter"><br />           <beans:constructor-arg  type="org.springframework.security.web.context.SecurityContextRepository" ref="sessionSecurityContextRepository"/><br />   </beans:bean><br />   <beans:bean id="exceptionTranslationFilter" <br />           class="org.springframework.security.web.access.ExceptionTranslationFilter"><br />           <beans:property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"/><br />   </beans:bean><br />   <beans:bean id="filterSecurityInterceptor" <br />           class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"><br />           <beans:property name="authenticationManager"  ref="authenticationManager" /> <br />           <beans:property name="accessDecisionManager"  ref="accessDecisionManager" /> <br />           <beans:property name="securityMetadataSource" ref="securityMetadataSource" /><br />   </beans:bean><br />   <br />   <!-- The following beans are configured for the filters upstairs --><br />   <!-- ///////////////////////////////////////// --><br />   <!-- ////for LogoutFilter///////////////////// --><br />   <!-- ///////////////////////////////////////// --><br />   <beans:bean id="securityContextLogoutHandler" <br />           class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"><br />   </beans:bean><br />   <!-- ///////////////////////////////////////// --><br />   <!-- ////for AnonymousAuthenticationFilter//// --><br />   <!-- ///////////////////////////////////////// --><br />   <beans:bean id="anonymousUserAttribute" <br />           class="org.springframework.security.core.userdetails.memory.UserAttribute"><br />           <beans:property name="authorities"><br />             <beans:list><br />                <beans:ref  bean="anonymousUserGrantedAuthority" /><br />             </beans:list><br />           </beans:property><br />           <beans:property name="password" value="anonymousUser"/><br />   </beans:bean><br />   <beans:bean id="anonymousUserGrantedAuthority" <br />           class="org.springframework.security.core.authority.GrantedAuthorityImpl"><br />           <beans:constructor-arg type="java.lang.String" value="ROLE_ANONYMOUS"/><br />   </beans:bean><br />   <!-- ///////////////////////////////////////// --><br />   <!-- ////for SessionManagementFilter////////// --><br />   <!-- ///////////////////////////////////////// --><br />   <beans:bean id="sessionSecurityContextRepository" <br />           class="org.springframework.security.web.context.HttpSessionSecurityContextRepository"><br />   </beans:bean><br />   <!-- ///////////////////////////////////////// --><br />   <!-- ////for FilterSecurityInterceptor//////// --><br />   <!-- ///////////////////////////////////////// --><br />   <beans:bean id="accessDecisionManager" <br />           class="org.springframework.security.access.vote.AffirmativeBased"><br />           <beans:property name="decisionVoters"><br />             <beans:list><br />                <beans:ref bean="webExpressionVoter"/><br />             </beans:list><br />           </beans:property><br />   </beans:bean><br />   <beans:bean id="webExpressionVoter" <br />           class="com.saveworld.authentication.web.access.expression.MyWebExpressionVoter"><br />   </beans:bean><br />   <beans:bean id="securityMetadataSource" <br />           class="com.saveworld.authentication.web.access.intercept.MyFilterInvocationSecurityMetadataSource"><br />           <beans:constructor-arg type="org.springframework.security.web.util.UrlMatcher" ref="urlMatcher" /><br />           <beans:constructor-arg type="javax.sql.DataSource" ref="proxoolDataSource" /><br />           <beans:constructor-arg type="org.springframework.security.web.access.expression.WebSecurityExpressionHandler" <br />                                      ref="expressionHandler" /><br />   </beans:bean><br />   <beans:bean id="urlMatcher"<br />           class="org.springframework.security.web.util.AntUrlPathMatcher" ><br />           <beans:constructor-arg type="boolean" value="true" /><br />   </beans:bean><br />   <beans:bean id="expressionHandler" <br />           class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"><br />   </beans:bean><br /> q里做几点说明:<br />    (1) 数据库中的权限相关的表:<br />             ROLES<br />             AUTHORITIES<br />             USER_AUTHS<br />             ROLE_AUTHS<br />             USERS<br />        q里的表l构q不是最l的Q所以就不发上来误导兄弟姐妹们了?br />        关键是看我们如何加蝲q些持久化的东西?br />        q个p看看filterSecurityInterceptor了,它里面用了一个securityMetadataSourceQ本地的securityMetadataSource实现代码Q?br />       public class MyFilterInvocationSecurityMetadataSource extends DefaultFilterInvocationSecurityMetadataSource{<br />     private final static Log logger = LogFactory.getLog(ExpressionBasedFilterInvocationSecurityMetadataSource.class);<br />     private DataSource datasource;<br />     <br />     public MyFilterInvocationSecurityMetadataSource(UrlMatcher urlMatcher,<br />                                                     DataSource datasource,<br />                                                     WebSecurityExpressionHandler expressionHandler) {<br />         super(urlMatcher, processMap(initializeFromDb(datasource,null),expressionHandler.getExpressionParser()));<br />     }<br /> <br />     //This method is usefulless for now!<br />     //Because this method is used for parsing the expression kind<br />     private static LinkedHashMap<RequestKey, Collection<ConfigAttribute>> processMap(<br />             LinkedHashMap<RequestKey,Collection<ConfigAttribute>> requestMap, ExpressionParser parser) {<br />         Assert.notNull(parser, "SecurityExpressionHandler returned a null parser object");<br /> <br />         LinkedHashMap<RequestKey, Collection<ConfigAttribute>> requestToExpressionAttributesMap =<br />             new LinkedHashMap<RequestKey, Collection<ConfigAttribute>>(requestMap);<br /> <br />         for (Map.Entry<RequestKey, Collection<ConfigAttribute>> entry : requestMap.entrySet()) {<br />             RequestKey request = entry.getKey();<br />             Assert.isTrue(entry.getValue().size() == 1, "Expected a single expression attribute for " + request);<br />             ArrayList<ConfigAttribute> attributes = new ArrayList<ConfigAttribute>(1);<br />             String expression = entry.getValue().toArray(new ConfigAttribute[1])[0].getAttribute();<br />             logger.debug("Adding web access control expression '" + expression + "', for " + request);<br />             try {<br />                 //Replacing WebExpressionConfigAttribute with MyWebExpressionConfigAttribute <br />                 //which is defined locally!<br />                 attributes.add(new MyWebExpressionConfigAttribute(parser.parseExpression(expression)));<br />             } catch (ParseException e) {<br />                 throw new IllegalArgumentException("Failed to parse expression '" + expression + "'");<br />             }<br /> <br />             requestToExpressionAttributesMap.put(request, attributes);<br />         }<br /> <br />         return requestToExpressionAttributesMap;<br />     }<br /> <br />     private static LinkedHashMap<RequestKey,Collection<ConfigAttribute>> initializeFromDb(DataSource datasource,LinkedHashMap<RequestKey, Collection<ConfigAttribute>> configMap){<br />         LinkedHashMap<RequestKey,Collection<ConfigAttribute>> result = <br />             new LinkedHashMap<RequestKey, Collection<ConfigAttribute>>();<br />         Connection conn = null;<br />         Statement  stmt = null;<br />         ResultSet  rs   = null;<br />         try {<br />             conn = datasource.getConnection();<br />             stmt = conn.createStatement();<br />             StringBuilder sql = new StringBuilder("SELECT b.AUTHORITYPATTERN ,'hasRole('||chr(39)||a.ROLENAME||chr(39)||')' rolename ")<br />                                              .append(" FROM ROLES a,AUTHORITIES b,ROLE_AUTHS c ")<br />                                              .append(" WHERE a.rolename = c.rolename AND b.authorityname = c.authorityname");<br />             <br />             rs = stmt.executeQuery(sql.toString());<br />             String roles = "";<br />             RequestKey key = null;<br />             List<ConfigAttribute> value = null;<br />             while(rs != null && rs.next()){<br />                 key = new RequestKey(rs.getString(1));<br />                 roles = rs.getString(2);<br />                 String[] roleArray = roles.split(",|\\s+|;");<br />                 value = new ArrayList<ConfigAttribute>();<br />                 for(String role : roleArray){<br />                     ConfigAttribute config = new SecurityConfig(role);<br />                     value.add(config);<br />                 }<br />                 result.put(key, value);<br />             }<br />             //just for test<br />         } catch (SQLException e) {<br />             e.printStackTrace();<br />         } finally{<br />             try{<br />                 rs.close();<br />                 stmt.close();<br />                 conn.close();<br />             }catch(SQLException e){<br />                 e.printStackTrace();<br />             }<br />         }<br />         return result;<br />     }<br />     <br />     <br />     <br />     public boolean supports(Class<?> clazz) {<br />         return FilterInvocation.class.isAssignableFrom(clazz);<br />     }<br /> <br />     public DataSource getDatasource() {<br />         return datasource;<br />     }<br /> <br />     public void setDatasource(DataSource datasource) {<br />         this.datasource = datasource;<br />     }<br /> }<br />  (2) expressionHandler:<br />      q个东西要单独说_我这里用的是表达式来用戯色的Q所以,我用org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler来处理了Q还有其他的方式Q就是直接用角色q行判断Q那样会更好Q这里就不描qCQ?br /> <br /> <br /> <img src ="http://www.tkk7.com/taochen1984/aggbug/310744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/taochen1984/" target="_blank">taochen</a> 2010-01-25 16:29 <a href="http://www.tkk7.com/taochen1984/articles/310744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringSecurity使用记录Q六Q?- 本地配置一http://www.tkk7.com/taochen1984/articles/310221.htmltaochentaochenMon, 25 Jan 2010 07:56:00 GMThttp://www.tkk7.com/taochen1984/articles/310221.htmlhttp://www.tkk7.com/taochen1984/comments/310221.htmlhttp://www.tkk7.com/taochen1984/articles/310221.html#Feedback0http://www.tkk7.com/taochen1984/comments/commentRss/310221.htmlhttp://www.tkk7.com/taochen1984/services/trackbacks/310221.html 但是Q我们这里的需求有点蹊P是通过spring contextq行权限配置太不方便Q你x能让人家客户通过spring xml来配|权限吗Q不能,坚决不能Q所以,我就单步跟踪获取里面的东西(q种Ҏ比直接看代码快点Q而且可以知道里面的逻辑l构Q)
那就开始吧Q?br /> 1.配置FilterChainProxyQ?br />   SpringSecurity的验证过E是通过一pd的filter来实现的?br />   q种chain的设计模式比较经典,可以说相当经典!
  看看代码实现Q?br />   上篇中说q,默认的配|要?lt;filter-name>springSecurityFilterChain</filter-name>Q那q个springSecurityFilterChain是怎么来用的呢Q?br />   public class DelegatingFilterProxy extends GenericFilterBean {
  ... ... ...
  protected void initFilterBean() throws ServletException {
        // If no target bean name specified, use filter name.
        if (this.targetBeanName == null) {
            this.targetBeanName = getFilterName();
        }

        // Fetch Spring root application context and initialize the delegate early,
        // if possible. If the root application context will be started after this
        // filter proxy, we'll have to resort to lazy initialization.
        synchronized (this.delegateMonitor) {
            WebApplicationContext wac = findWebApplicationContext();
            if (wac != null) {
                this.delegate = initDelegate(wac);
            }
        }
    }
  .....
  }
  不用_你会猜到我们没有配置qtargetBeanNameq个属性,所以,有了this.targetBeanName = getFilterName();q样的话׃配置FilterChainProxy了,因ؓFilterChainProxy在springContext中id是springSecurityFilterChainQ所以我们要通过自己的数据库方式配置的话Q就要琢这个FilterChainProxy了!
  所以,首先做点q样的配|吧Q?br />   <beans:bean id="myFilterChain" class="org.springframework.security.web.FilterChainProxy" >
      <filter-chain-map path-type="ant">
          <filter-chain pattern="/login.jsp*" filters="none"/>
          <filter-chain pattern="/**" filters="securityContextPersistenceFilter,
                                               logoutFilter,
                                               myUsernamePasswordAuthenticationFilter,
                                               basicAuthenticationFilter,
                                               requestCacheAwareFilter,
                                               securityContextHolderAwareRequestFilter,
                                               anonymousAuthenticationFilter,
                                               sessionManagementFilter,
                                               exceptionTranslationFilter,
                                               filterSecurityInterceptor"/>
      </filter-chain-map>
  </beans:bean>
q个里面配置的id为myFilterChainQ所以要在web.xml里面做相应配|:
   <filter>
      <filter-name>myFilterChain</filter-name>
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>myFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
而且Q尤为重要的是要配置上这些过滤器Q?br /> filter-chain pattern="/**" filters="securityContextPersistenceFilter,logoutFilter,
                                               myUsernamePasswordAuthenticationFilter,
                                               basicAuthenticationFilter,
                                               requestCacheAwareFilter,
                                               securityContextHolderAwareRequestFilter,
                                               anonymousAuthenticationFilter,
                                               sessionManagementFilter,
                                               exceptionTranslationFilter,
                                               filterSecurityInterceptor"
针对q些qo器的用途,在spring security的文中有详l描qͼq里不多说了Q在文中的具体位置?.2 FilterChainProxyQ看看这一章就会有感觉了,不过l知此事要躬行啊Q?br /> 完成q些配置之后Q我们就是把入口给搭徏好了Q?br /> 鉴于文幅Q换C接着说?br />


taochen 2010-01-25 15:56 发表评论
]]>
SpringSecurity使用记录Q一Q?/title><link>http://www.tkk7.com/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.tkk7.com/taochen1984/articles/307203.html</guid><wfw:comment>http://www.tkk7.com/taochen1984/comments/307203.html</wfw:comment><comments>http://www.tkk7.com/taochen1984/articles/307203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/taochen1984/comments/commentRss/307203.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/taochen1984/services/trackbacks/307203.html</trackback:ping><description><![CDATA[W一ơ配|和使用SpringSecurityQL要碰很多ơ墙Q?br /> 先说说个人理解的它里面比较有意义的架构?br /> 里面有好多设计模式的影子Q策略模式,代理模式Q工厂模式,链条模式=====Q看到这些模式(除了工厂或单例)心里L会有些兴奋,ȝ是看C模式的真正练兵场Q跟兄弟们好好分享一?(才看了一天!有不对之处,q望各位斧正Q?<br /> {略模式QStrategy PatternQ?<br /> 主要说一下session相关的这个策略模式,以SessionAuthenticationStrategy接口的策略划分,Ҏ我们的session安全{略Q指定不同的{略Q现在看是这U布局Q?br /> <table border="0" cellpadding="2" cellspacing="2" width="853" height="280"> <tbody> <tr> <td> 层接口</td> <td> SessionAuthenticationStrategy</td> <td> </td> <td> </td> </tr> <tr> <td> 具体实现</td> <td> SessionFixationProtectionStrategy<br /> Q直接默认实玎ͼ</td> <td> NullAuthenticatedSessionStrategy<br /> Q空实现Q?br /> </td> <td> </td> </tr> <tr> <td> 二实现</td> <td> ConcurrentSessionControlStrategy</td> <td> </td> <td> </td> </tr> </tbody> </table> <br /> d比较ȝQ各位还是凑合着看吧Q说明一下:层接口被下?#8220;具体实现”两个cd玎ͼ?#8220;二实现”实现SessionFixationProtectionStrategy。具体采用哪U策略要看我们的配置了!<br /> 代理模式QProxyQ:<br /> 很明昄代理c,DelegatingFilterProxy和FilterChainProxyQ这两个cȝ着心里都痒痒的Q呵呵,q_L看代理模式呀什么的Q即时看着例子也不t实Q现在看到这两个东西Q心里突然有U^静的Ȁ动!<br /> q两个代理类以FilterChainProxyZ说明一下吧QFilterChainProxy代理了权限验证Filters的工作,通过它来讉K整个qo器串里面的过滤器?br /> Chain模式Q这个也应该以FilterChainProxyq个cd口来分析Q呵呵,有兴的各位通过q个来看看吧Q?br /> <img src ="http://www.tkk7.com/taochen1984/aggbug/307203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/taochen1984/" target="_blank">taochen</a> 2009-12-24 20:05 <a href="http://www.tkk7.com/taochen1984/articles/307203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www12kvkv.com" target="_blank">˳ۺ</a>| <a href="http://sxhengshan.com" target="_blank">վ߹ۿ</a>| <a href="http://www-135888.com" target="_blank">avһ</a>| <a href="http://liangdy.com" target="_blank">޻ɫƬѿ</a>| <a href="http://33sse.com" target="_blank">޺ݺady޾Ʒ</a>| <a href="http://zhuoyueyc.com" target="_blank">޹AV</a>| <a href="http://344zx.com" target="_blank">ĻѸ </a>| <a href="http://jpvv8.com" target="_blank">ŮɫëƬѿ</a>| <a href="http://av520av.com" target="_blank">ƷƬva</a>| <a href="http://727744.com" target="_blank">Ʒþ޾þþþûʿ </a>| <a href="http://0755haoma.com" target="_blank">޹ƷԲĵӰ</a>| <a href="http://directzx.com" target="_blank">Ƶ߹ۿƵ</a>| <a href="http://wwwdf221.com" target="_blank">ëƬ߿Ƭ˿Ƶ</a>| <a href="http://qianmiu.com" target="_blank">޸͵һ </a>| <a href="http://ccc321.com" target="_blank">޳aƬ߲һ</a>| <a href="http://www-c559.com" target="_blank">Ļwww˳</a>| <a href="http://bbby6.com" target="_blank">Ƶһѹۿ</a>| <a href="http://ettedia.com" target="_blank">һ߹ۿ</a>| <a href="http://by6216.com" target="_blank">޹Ʒ˿߹ۿ</a>| <a href="http://x3013.com" target="_blank">þ۲ӰԺѿҹɫ</a>| <a href="http://jybelt.com" target="_blank">ôͺˬƵ</a>| <a href="http://bixnu.com" target="_blank">޸߾Ʒ</a>| <a href="http://zbr555sina.com" target="_blank">ҹAVר߲</a>| <a href="http://zjtuhui.com" target="_blank">þ99Ʒһ</a>| <a href="http://www759696b.com" target="_blank">ձþþþĻ</a>| <a href="http://fzgjw.com" target="_blank">պһaƬѹۿ</a>| <a href="http://0939666.com" target="_blank">Ʒר벻</a>| <a href="http://mallmirror.com" target="_blank">޾ҹþþþþ</a>| <a href="http://jdwx58.com" target="_blank">þƵ</a>| <a href="http://zzdyzj.com" target="_blank">޾Ʒ͵Բ</a>| <a href="http://koukoub.com" target="_blank">ĻӰԺww4164h</a>| <a href="http://326h.com" target="_blank">GVGVͬ</a>| <a href="http://58rjz.com" target="_blank">ȸAV߲</a>| <a href="http://3atv66.com" target="_blank">ww4545Ļѵַ</a>| <a href="http://scdsrq.com" target="_blank">˾Ʒŷ</a>| <a href="http://tccqdy.com" target="_blank">޹Ʒר</a>| <a href="http://sxhnyl.com" target="_blank">һ2342021ѹۿ</a>| <a href="http://blzcn.com" target="_blank">av츾߲</a>| <a href="http://vvww-3499.com" target="_blank">eeussӰԺwww</a>| <a href="http://www-13696.com" target="_blank">ƵѲ</a>| <a href="http://dukane1688.com" target="_blank">߲Ѳ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>