<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    Spring安全系統:Acegi Security(zhuan)

    Acegi簡介

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

    Acegi系統設計

      關鍵組件

          Acegi安全系統包含以下七個關鍵的功能組件:
             l Authentication對象,包含了Principal,Credential和Principal的授權信息。同時還可以包含關于發起認證請求的客戶的其他信息,如IP地址。
            2 ContextHolder對象,使用ThreadLocal儲存Authentication對象的地方。
            3 AuthenticationManager,用于認證ContextHolder中的Authentication對象。
            4 AccessDecissionManager,用于授權一個特定的操作。
            5 RunAsManager,當執行特定的操作時,用于選擇性地替換Authentication對象。
            6 Secure Object攔截器,用于協調AuthenticationManager,AccessDecissionManager,RunAsManager和特定操作的執行。
            7 ObjectDefinitionSource,包含了特定操作的授權定義。

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


      安全管理對象

           Acegi安全系統目前支持兩類安全管理對象。
           第一類的安全管理對象管理AOP Alliance的MethodInvocation,開發人員可以用它來保護Spring容器中的業務對象。為了使Spring管理的Bean可以作為MethodInvocation來使用,Bean可以通過ProxyFactoryBean和BeanNameAutoProxyCreator來管理,就像在Spring的事務管理一樣使用。
           第二類是FilterInvocation。它用過濾器(Filter)來創建,并簡單地包裝了HTTP的ServletRequest,ServletResponse和FilterChain。FilterInvocation可以用來保護HTTP資源。通常,開發人員并不需要了解它的工作機制,因為他們只需要將Filter加入web.xml,Acegi安全系統就可以工作了。

      安全配置參數

           每個安全管理對象都可以描述數量不限的各種安全認證請求。例如,MethodInvocation對象可以描述帶有任意參數的任意方法的調用,而FilterInvocation可以描述任意的HTTP URL。
           Acegi安全系統需要記錄應用于每個認證請求的安全配置參數。例如,對于BankManager.getBalance(int accountNumber)方法和BankManager.approveLoan(int applicationNumber)方法,它們需要的認證請求的安全配置很不相同。
           為了保存不同的認證請求的安全配置,需要使用配置參數。從實現的視角來看,配置參數使用ConfigAttribute接口來表示。Acegi安全系統提供了ConfigAttribute接口的一個實現,SecurityConfig,它把配置參數保存為一個字符串。
           ConfigAttributeDefinition類是ConfigAttribute對象的一個簡單的容器,它保存了和特定請求相關的ConfigAttribute的集合。
           當安全攔截器收到一個安全認證請求時,需要決定應用哪一個配置參數。換句話說,它需要找出應用于這個請求的ConfigAttributeDefinition對象。這個查找的過程是由ObjectDefinitionSource接口來處理的。這個接口的主要方法是public ConfigAttributeDefinition getAttributes(Object object),其中Object參數是一個安全管理對象。因為安全管理對象包含有認證請求的詳細信息,所以ObjectDefinitionSource接口的實現類可以從中獲得所需的詳細信息,以查找相關的ConfigAttributeDefiniton對象。

      Acegi如何工作

           為了說明Acegi安全系統如何工作,我們設想一個使用Acegi的例子。通常,一個安全系統需要發揮作用,它必須完成以下的工作:
           l 首先,系統從客戶端請求中獲得Principal和Credential;
          2 然后系統認證Principal和Credential信息;
          3 如果認證通過,系統取出Principal的授權信息;
          4 接下來,客戶端發起操作請求;
          5 系統根據預先配置的參數檢查Principal對于該操作的授權;
          6 如果授權檢查通過則執行操作,否則拒絕。

          那么,Acegi安全系統是如何完成這些工作的呢?首先,我們來看看Acegi安全系統的認證和授權的相關類圖:

     

           圖中綠色部分是安全攔截器的抽象基類,它包含有兩個管理類,AuthenticationManager和AccessDecisionManager,如圖中灰色部分。AuthenticationManager用于認證ContextHolder中的Authentication對象(包含了Principal,Credential和Principal的授權信息);AccessDecissionManager則用于授權一個特定的操作。
          下面來看一個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的一個實現類。它包含了兩個管理器,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>

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

      AccessDecisionVoter

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

    安全攔截器

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

    認證

      認證請求
      認證管理器
      Authentication Provider

    授權

      Access Decision Manager
      Voting Decision Manager
      授權管理推薦

    ContextHolder的用戶接口

      用戶接口目標
      HTTP會話認證
      HTTP Basic認證

     

    posted on 2006-02-24 11:02 都市淘沙者 閱讀(321) 評論(0)  編輯  收藏 所屬分類: Spring+Struts+Hibernate

    主站蜘蛛池模板: 亚洲中文字幕无码久久2020| 新最免费影视大全在线播放| 欧美好看的免费电影在线观看 | 337p日本欧洲亚洲大胆精品555588 | 18gay台湾男同亚洲男同| 成年人免费网站在线观看| 一区二区3区免费视频| 亚洲伦另类中文字幕| 国产精品黄页在线播放免费| 国产在线观看xxxx免费| 国产成人精品日本亚洲网址| 亚洲精品无码AV中文字幕电影网站| 特级无码毛片免费视频尤物| 中文字幕无码亚洲欧洲日韩| 亚洲美女又黄又爽在线观看| 妞干网在线免费观看| 日本亚洲欧洲免费天堂午夜看片女人员| 亚洲AV成人一区二区三区在线看| 精品国产亚洲男女在线线电影 | 天天拍拍天天爽免费视频 | 亚洲&#228;v永久无码精品天堂久久 | 久草福利资源网站免费| 色偷偷尼玛图亚洲综合| 666精品国产精品亚洲| 久久久久国产亚洲AV麻豆| 成年女人免费视频播放体验区| 在线毛片片免费观看| 国产成人亚洲综合a∨| 亚洲天堂福利视频| 国产亚洲精品va在线| 男人的天堂亚洲一区二区三区 | 无码欧精品亚洲日韩一区夜夜嗨 | 久久精品国产亚洲αv忘忧草| 在线观看亚洲精品国产| 国产裸模视频免费区无码| 国产精品久久免费| 久久精品无码专区免费青青| baoyu122.永久免费视频| 一级毛片试看60分钟免费播放| 亚洲精品国产高清在线观看| 亚洲国产成人精品久久|