国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Spring安全系統(tǒng):Acegi Security

Acegi簡(jiǎn)介

       Acegi安全系統(tǒng),是一個(gè)用于Spring Framework的安全框架,能夠和目前流行的Web容器無(wú)縫集成。它使用了Spring的方式提供了安全和認(rèn)證安全服務(wù),包括使用Bean Context,攔截器和面向接口的編程方式。因此,Acegi安全系統(tǒng)能夠輕松地適用于復(fù)雜的安全需求。
       安全涉及到兩個(gè)不同的概念,認(rèn)證和授權(quán)。前者是關(guān)于確認(rèn)用戶是否確實(shí)是他們所宣稱(chēng)的身份。授權(quán)則是關(guān)于確認(rèn)用戶是否有允許執(zhí)行一個(gè)特定的操作。
       在Acegi安全系統(tǒng)中,需要被認(rèn)證的用戶,系統(tǒng)或代理稱(chēng)為"Principal"。Acegi安全系統(tǒng)和其他的安全系統(tǒng)不同,它并沒(méi)有角色和用戶組的概念。

Acegi系統(tǒng)設(shè)計(jì)

  關(guān)鍵組件

      Acegi安全系統(tǒng)包含以下七個(gè)關(guān)鍵的功能組件:
         l Authentication對(duì)象,包含了Principal,Credential和Principal的授權(quán)信息。同時(shí)還可以包含關(guān)于發(fā)起認(rèn)證請(qǐng)求的客戶的其他信息,如IP地址。
        2 ContextHolder對(duì)象,使用ThreadLocal儲(chǔ)存Authentication對(duì)象的地方。
        3 AuthenticationManager,用于認(rèn)證ContextHolder中的Authentication對(duì)象。
        4 AccessDecissionManager,用于授權(quán)一個(gè)特定的操作。
        5 RunAsManager,當(dāng)執(zhí)行特定的操作時(shí),用于選擇性地替換Authentication對(duì)象。
        6 Secure Object攔截器,用于協(xié)調(diào)AuthenticationManager,AccessDecissionManager,RunAsManager和特定操作的執(zhí)行。
        7 ObjectDefinitionSource,包含了特定操作的授權(quán)定義。

      這七個(gè)關(guān)鍵的功能組件的關(guān)系如下圖所示(圖中灰色部分是關(guān)鍵組件):


  安全管理對(duì)象

       Acegi安全系統(tǒng)目前支持兩類(lèi)安全管理對(duì)象。
       第一類(lèi)的安全管理對(duì)象管理AOP Alliance的MethodInvocation,開(kāi)發(fā)人員可以用它來(lái)保護(hù)Spring容器中的業(yè)務(wù)對(duì)象。為了使Spring管理的Bean可以作為MethodInvocation來(lái)使用,Bean可以通過(guò)ProxyFactoryBean和BeanNameAutoProxyCreator來(lái)管理,就像在Spring的事務(wù)管理一樣使用。
       第二類(lèi)是FilterInvocation。它用過(guò)濾器(Filter)來(lái)創(chuàng)建,并簡(jiǎn)單地包裝了HTTP的ServletRequest,ServletResponse和FilterChain。FilterInvocation可以用來(lái)保護(hù)HTTP資源。通常,開(kāi)發(fā)人員并不需要了解它的工作機(jī)制,因?yàn)樗麄冎恍枰獙ilter加入web.xml,Acegi安全系統(tǒng)就可以工作了。

  安全配置參數(shù)

       每個(gè)安全管理對(duì)象都可以描述數(shù)量不限的各種安全認(rèn)證請(qǐng)求。例如,MethodInvocation對(duì)象可以描述帶有任意參數(shù)的任意方法的調(diào)用,而FilterInvocation可以描述任意的HTTP URL。
       Acegi安全系統(tǒng)需要記錄應(yīng)用于每個(gè)認(rèn)證請(qǐng)求的安全配置參數(shù)。例如,對(duì)于BankManager.getBalance(int accountNumber)方法和BankManager.approveLoan(int applicationNumber)方法,它們需要的認(rèn)證請(qǐng)求的安全配置很不相同。
       為了保存不同的認(rèn)證請(qǐng)求的安全配置,需要使用配置參數(shù)。從實(shí)現(xiàn)的視角來(lái)看,配置參數(shù)使用ConfigAttribute接口來(lái)表示。Acegi安全系統(tǒng)提供了ConfigAttribute接口的一個(gè)實(shí)現(xiàn),SecurityConfig,它把配置參數(shù)保存為一個(gè)字符串。
       ConfigAttributeDefinition類(lèi)是ConfigAttribute對(duì)象的一個(gè)簡(jiǎn)單的容器,它保存了和特定請(qǐng)求相關(guān)的ConfigAttribute的集合。
       當(dāng)安全攔截器收到一個(gè)安全認(rèn)證請(qǐng)求時(shí),需要決定應(yīng)用哪一個(gè)配置參數(shù)。換句話說(shuō),它需要找出應(yīng)用于這個(gè)請(qǐng)求的ConfigAttributeDefinition對(duì)象。這個(gè)查找的過(guò)程是由ObjectDefinitionSource接口來(lái)處理的。這個(gè)接口的主要方法是public ConfigAttributeDefinition getAttributes(Object object),其中Object參數(shù)是一個(gè)安全管理對(duì)象。因?yàn)榘踩芾韺?duì)象包含有認(rèn)證請(qǐng)求的詳細(xì)信息,所以O(shè)bjectDefinitionSource接口的實(shí)現(xiàn)類(lèi)可以從中獲得所需的詳細(xì)信息,以查找相關(guān)的ConfigAttributeDefiniton對(duì)象。

  Acegi如何工作

       為了說(shuō)明Acegi安全系統(tǒng)如何工作,我們?cè)O(shè)想一個(gè)使用Acegi的例子。通常,一個(gè)安全系統(tǒng)需要發(fā)揮作用,它必須完成以下的工作:
       l 首先,系統(tǒng)從客戶端請(qǐng)求中獲得Principal和Credential;
      2 然后系統(tǒng)認(rèn)證Principal和Credential信息;
      3 如果認(rèn)證通過(guò),系統(tǒng)取出Principal的授權(quán)信息;
      4 接下來(lái),客戶端發(fā)起操作請(qǐng)求;
      5 系統(tǒng)根據(jù)預(yù)先配置的參數(shù)檢查Principal對(duì)于該操作的授權(quán);
      6 如果授權(quán)檢查通過(guò)則執(zhí)行操作,否則拒絕。

      那么,Acegi安全系統(tǒng)是如何完成這些工作的呢?首先,我們來(lái)看看Acegi安全系統(tǒng)的認(rèn)證和授權(quán)的相關(guān)類(lèi)圖:

 

       圖中綠色部分是安全攔截器的抽象基類(lèi),它包含有兩個(gè)管理類(lèi),AuthenticationManager和AccessDecisionManager,如圖中灰色部分。AuthenticationManager用于認(rèn)證ContextHolder中的Authentication對(duì)象(包含了Principal,Credential和Principal的授權(quán)信息);AccessDecissionManager則用于授權(quán)一個(gè)特定的操作。
      下面來(lái)看一個(gè)MethodSecurityInterceptor的例子:
      <bean id="bankManagerSecurity"
                     class="net.sf.acegisecurity.intercept.method.MethodSecurityInterceptor">
             <property name="validateConfigAttributes">
                    <value>true</value>
            </property>
            <property name="authenticationManager">
                   <ref bean="authenticationManager"/>
            </property>
            <property name="accessDecisionManager">
                  <ref bean="accessDecisionManager"/>
            </property>
            <property name="objectDefinitionSource">
                  <value>
                     net.sf.acegisecurity.context.BankManager.delete*=
                             ROLE_SUPERVISOR,RUN_AS_SERVER
                     net.sf.acegisecurity.context.BankManager.getBalance=
                             ROLE_TELLER,ROLE_SUPERVISOR,BANKSECURITY_CUSTOMER,RUN_
                  </value>
            </property>
      </bean>

 

      上面的配置文件中,MethodSecurityInterceptor是AbstractSecurityInterceptor的一個(gè)實(shí)現(xiàn)類(lèi)。它包含了兩個(gè)管理器,authenticationManager和accessDecisionManager。這兩者的配置如下:

      <bean id="authenticationDao" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl">
               <property name="dataSource"><ref bean="dataSource"/></property>
      </bean>
      <bean id="daoAuthenticationProvider"
                     class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider">
               <property name="authenticationDao"><ref bean="authenticationDao"/></property>
      </bean>
      <bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager">
               <property name="providers">
                      <list><ref bean="daoAuthenticationProvider"/></list>
               </property>
      </bean>

      <bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/>
      <bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased">
               <property name="allowIfAllAbstainDecisions"><value>false</value></property>
               <property name="decisionVoters">
                      <list><ref bean="roleVoter"/></list>
               </property>
      </bean>

       準(zhǔn)備工作做好了,現(xiàn)在我們來(lái)看看Acegi安全系統(tǒng)是如何實(shí)現(xiàn)認(rèn)證和授權(quán)機(jī)制的。以使用HTTP BASIC認(rèn)證的應(yīng)用為例子,它包括下面的步驟:
       1. 用戶登錄系統(tǒng),Acegi從acegisecurity.ui子系統(tǒng)的安全攔截器(如BasicProcessingFilter)中得到用戶的登錄信息(包括Principal和Credential)并放入Authentication對(duì)象,并保存在ContextHolder對(duì)象中;
       2. 安全攔截器將Authentication對(duì)象交給AuthenticationManager進(jìn)行身份認(rèn)證,如果認(rèn)證通過(guò),返回帶有Principal授權(quán)信息的Authentication對(duì)象。此時(shí)ContextHolder對(duì)象的Authentication對(duì)象已擁有Principal的詳細(xì)信息;
       3. 用戶登錄成功后,繼續(xù)進(jìn)行業(yè)務(wù)操作;
       4. 安全攔截器(bankManagerSecurity)收到客戶端操作請(qǐng)求后,將操作請(qǐng)求的數(shù)據(jù)包裝成安全管理對(duì)象(FilterInvocation或MethodInvocation對(duì)象);
       5. 然后,從配置文件(ObjectDefinitionSource)中讀出相關(guān)的安全配置參數(shù)ConfigAttributeDefinition;
       6. 接著,安全攔截器取出ContextHolder中的Authentication對(duì)象,把它傳遞給AuthenticationManager進(jìn)行身份認(rèn)證,并用返回值更新ContextHolder的Authentication對(duì)象;
       7. 將Authentication對(duì)象,ConfigAttributeDefinition對(duì)象和安全管理對(duì)象(secure Object)交給AccessDecisionManager,檢查Principal的操作授權(quán);
       8. 如果授權(quán)檢查通過(guò)則執(zhí)行客戶端請(qǐng)求的操作,否則拒絕;

  AccessDecisionVoter

       注意上節(jié)的accessDecisionManager是一個(gè)AffirmativeBased類(lèi),它對(duì)于用戶授權(quán)的投票策略是,只要通過(guò)其中的一個(gè)授權(quán)投票檢查,即可通過(guò);它的allowIfAllAbstainDecisions屬性值是false,意思是如果所有的授權(quán)投票是都是棄權(quán),則通不過(guò)授權(quán)檢查。
       Acegi安全系統(tǒng)包括了幾個(gè)基于投票策略的AccessDecisionManager,上節(jié)的RoleVoter就是其中的一個(gè)投票策略實(shí)現(xiàn),它是AccessDecisionVoter的一個(gè)子類(lèi)。AccessDecisionVoter的具體實(shí)現(xiàn)類(lèi)通過(guò)投票來(lái)進(jìn)行授權(quán)決策,AccessDecisionManager則根據(jù)投票結(jié)果來(lái)決定是通過(guò)授權(quán)檢查,還是拋出AccessDeniedException例外。
       AccessDecisionVoter接口共有三個(gè)方法:
public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config);
public boolean supports(ConfigAttribute attribute);
public boolean supports(Class clazz);
       其中的vote方法返回int返回值,它們是AccessDecisionVoter的三個(gè)靜態(tài)成員屬性:ACCESS_ABSTAIN,,ACCESS_DENIED和ACCESS_GRANTED,它們分別是棄權(quán),否決和贊成。
       Acegi安全系統(tǒng)中,使用投票策略的AccessDecisionManager共有三個(gè)具體實(shí)現(xiàn)類(lèi):AffirmativeBased、ConsensusBased和UnanimousBased。它們的投票策略是,AffirmativeBased類(lèi)只需有一個(gè)投票贊成即可通過(guò);ConsensusBased類(lèi)需要大多數(shù)投票贊成即可通過(guò);而UnanimousBased類(lèi)需要所有的投票贊成才能通過(guò)。
       RoleVoter類(lèi)是一個(gè)Acegi安全系統(tǒng)AccessDecisionVoter接口的實(shí)現(xiàn)。如果ConfigAttribute以ROLE_開(kāi)頭,RoleVoter則進(jìn)行投票。如果GrantedAuthority的getAutority方法的String返回值匹配一個(gè)或多個(gè)以ROLE_開(kāi)頭的ConfigAttribute,則投票通過(guò),否則不通過(guò)。如果沒(méi)有以ROLE_開(kāi)頭的ConfigAttribute,RoleVoter則棄權(quán)。

安全攔截器

  攔截器如何工作
  MethodInvocation攔截器
  FilterInvocation攔截器

認(rèn)證

  認(rèn)證請(qǐng)求
  認(rèn)證管理器
  Authentication Provider

授權(quán)

  Access Decision Manager
  Voting Decision Manager
  授權(quán)管理推薦

ContextHolder的用戶接口

  用戶接口目標(biāo)
  HTTP會(huì)話認(rèn)證
  HTTP Basic認(rèn)證
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Spring Acegi Tutorial
spring security
學(xué)習(xí)acegi-security - bulain - ITeye技術(shù)網(wǎng)站
acegi源碼學(xué)習(xí)之用戶登錄篇
Spring Security,沒(méi)有看起來(lái)那么復(fù)雜(附源碼)
acegi-security 初探一 - 麥田守望者 - JavaEye技術(shù)網(wǎng)站
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服