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

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

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

    Java,J2EE,Weblogic,Oracle

    java項目隨筆
    隨筆 - 90, 文章 - 6, 評論 - 61, 引用 - 0
    數據加載中……

    Acegi 設計概述

    Acegi 設計概述

    關鍵詞acegi                                          

    作者: cac,轉自 springside

    1. 簡單敘述認證授權流程

    第一步, 認證(authentication)。Acegi調用AuthenticationManager(認證管理器)來對當前請求登陸系統用戶進行驗證,AuthenticationManager負責委托一個或多個Provider(認證提供者),并逐一遍歷每個Provider,直到某一個Provider能夠成功的驗證用戶的身份。Provider成功驗證用戶身份后,會返回一個Authentication(證明), Authentication中包括Principal(用戶名),Credentials(通常是密碼),Authorities(該用戶所擁有的權限)。這樣就完成了身份驗證的步驟。

    第二步,授權(authorization)。當Acegi獲得Authentication后,也就確定了用戶的身份。每當用戶請求訪問某受保護資源時,Acegi會調用AccessDecisionManager(訪問決策管理器)來決定用戶的Authentication是否有恰當的權限來訪問當前訪問的受保護資源,有則授權用戶通過,無則拋出錯誤信息,以達到訪問控制的目的。

     2. 安全保護方式

    • 保護Web應用程序
      當去保護Web應用程序時,Acegi使用Servlet Filter來攔截Servlet請求,并將這些請求轉給AuthenticationManager,AccessDecisionManager或其他管理器來處理。
      Acegi提供了多個各種功能的Filter, 這些Filter按照先后順序組成了一個 Filter Chain。當一個請求被提交道一個由Acegi所保護的Web應用程序時,該請求會按照如下順序逐一通過Filter Chain:
       
      第一步, 請求通過ChannelProcessingFilter(通道處理過濾器,可選)。該過濾器負責檢查當前請求的Channel,并判斷是否已滿足安全需要。如果不滿足,則由非安全的通道傳輸(Http)重定向于安全的通道傳輸(Https),以確保服務器與瀏覽器之間傳輸的數據加密。
       
      第二步,請求通過 AuthenticationProcessingFilter(認證處理過濾器)。該過濾器會判斷該請求是否是一個認證請求(通常是"/j_acegi_security_check")。如果是,則它會從請求中獲取用戶名和密碼,并轉交給AuthenticationManager來認證用戶身份。如果不是,則會直接轉到下一個Filter。
       
      第三步,請求通過HttpSessionContextIntegrationFilter(HttpSession安全上下文信息集成過濾器)。該過濾器負責將Authentication對象保存在HttpSession中,使其在下一個請求到來時仍可被獲取。故Authentication能跨越多個請求。
       
      第四步,請求通過FilterSecurityInterceptor(過濾器安全攔截器)。該過濾器會首先調用AuthenticationManager判斷用戶是否已登陸認證,如還沒認證成功,則重定向到登陸界面。認證成功,則并從Authentication中獲取用戶的權限。然后從objectDefinitionSource屬性獲取各種URL資源所對應的權限。最后調用AccessDecisionManager來判斷用戶所擁有的權限與當前受保華的URL資源所對應的權限是否相匹配。如果匹配失敗,則返回403錯誤(禁止訪問)給用戶。匹配成功則用戶可以訪問受保護的URL資源。
    •  保護方法調用
      當去保護方法調用時,Acegi使用Spring AOP,將"切面"應用于所代理的對象,以確保用戶只有在擁有恰當授權時才可以調用受保護的方法。
      MethodSecurityInterceptor(方法調用安全攔截器)同樣也是在調用方法之前,先調用AuthenticationManager判斷用戶身份是否已驗證,然后從objectDefinitionSource中獲取方法所對應的權限,再調用AccessDecisionManager來匹配用戶權限和方法對應的權限。如果用戶沒有足夠權限調用當前方法,則拋出AccessDeniedException使方法不能被調用。

     3.過濾器鏈代理

    Acegi的FilterChainProxy提供了一種很好的方式,使你不需要在web.xml配置Filters,而在Spring配置文件中加入, 從而能充分利用Spring IOC的優勢。

    FilterChainProxy其實也只是一個擴展后的Filter,它負責委托Spring中的各個實現了javax.servlet.Filter接口的Bean來執行過濾功能。 如httpSessionContextIntegrationFilter, authenticationProcessingFilter, filterInvocationInterceptor等。

    在web.xml中的配置FilterToBeanProxy:

    <filter>
            <filter-name>Acegi Filter Chain Proxy</filter-name>|
            <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
            <init-param>
                    <param-name>targetClass</param-name>
                    <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
            </init-param>
    </filter>
    <filter-mapping>
            <filter-name>Acegi Filter Chain Proxy</filter-name>
            <url-pattern>/*</url-pattern>
    </filter-mapping>

    在Spring配置文件中相應的FilterChainProxy Bean:

    <bean id="filterChainProxy"   class="org.acegisecurity.util.FilterChainProxy">
            <property name="filterInvocationDefinitionSource">
                    <value>
                            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                            PATTERN_TYPE_APACHE_ANT
                             /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter, rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
                    </value>
            </property>
    </bean>

    4. Acegi Exceptions 管理機制

    Acegi的異常管理機制做得不錯,基本上可以滿足權限管理需求。在其結構基礎上繼承實現自己的異常類也是很方便的。

    所有Acegi的異常都是在 AcegiSecurityException 上繼承而來的,其中最主要的是 AuthenticationException 和 AccessDeniedException。

    這里需要注意的是 AcegiSecurityException 繼承了Spring的 NestedRuntimeException,而NestedRuntimeException又是繼承RuntimeException的。
    所以拋出的時候不需要throws, 而捕捉的時候需要專門catch RuntimeException。

    AuthenticationException 是所有授權相關的異常的父類,當用戶身份驗證失敗時就會拋出這個異常。

    AccessDeniedException 是所有認證相關的異常的父類,當資源被拒絕訪問時就會拋出這個異常。

    在Acegi 中,通過ExceptionTranslationFilter(異常轉換過濾器)來對各種異常進行捕獲和處理,并重定向到不同的錯誤信息顯示頁面。

    如遇到AuthenticationException 就會重定向到登陸頁面,遇到AccessDeniedException 就會無權訪問資源頁面。你還可以繼承ExceptionTranslationFilter基礎上覆蓋handleException方法來實現你自己的系統中異常的處理。

    <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
            <property name="authenticationEntryPoint">
                    <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
            <property name="loginFormUrl" value="/login.jsp" />
            <property name="forceHttps" value="false" />
                    </bean>
            </property>
            <property name="accessDeniedHandler">
                    <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
            <property name="errorPage" value="/accessDenied.jsp" />
                    </bean>
            </property>
    </bean>

    posted on 2007-11-19 20:25 龔椿深 閱讀(667) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV无码一区二区乱子伦| 精品亚洲一区二区三区在线播放| 久久青青草原亚洲av无码app | 国产三级在线观看免费| 色拍自拍亚洲综合图区| 最近中文字幕免费完整| 亚洲精品日韩专区silk| 黄页网站免费在线观看| 亚洲国产精品一区二区三区在线观看| 免费v片在线观看视频网站| 亚洲一区中文字幕| 日本免费高清一本视频| 鲁啊鲁在线视频免费播放| 亚洲精品和日本精品| 国产精品免费久久| 久久青青成人亚洲精品| 亚洲精品在线免费看| 亚洲中文字幕无码中文| 国产一精品一aⅴ一免费| jizz免费观看| 亚洲黄色三级网站| 在线播放免费人成视频在线观看| 国产精品亚洲av色欲三区| 国产亚洲精品看片在线观看| 一级毛片免费不卡在线| 亚洲一久久久久久久久| 亚洲午夜精品第一区二区8050| 免费一级毛片无毒不卡| 国产精品亚洲四区在线观看| 亚洲国产一成久久精品国产成人综合 | free哆拍拍免费永久视频| 国产亚洲情侣一区二区无| 8x8x华人永久免费视频| 亚洲精品无码人妻无码| 永久亚洲成a人片777777| AV大片在线无码永久免费| 免费视频成人国产精品网站| 久久久久亚洲AV成人无码网站| 最近最好的中文字幕2019免费| 成年网在线观看免费观看网址| 亚洲国产精品婷婷久久|