Java,J2EE,Weblogic,Oracle

          java項(xiàng)目隨筆
          隨筆 - 90, 文章 - 6, 評(píng)論 - 61, 引用 - 0
          數(shù)據(jù)加載中……

          Acegi 設(shè)計(jì)概述

          Acegi 設(shè)計(jì)概述

          關(guān)鍵詞acegi                                          

          作者: cac,轉(zhuǎn)自 springside

          1. 簡(jiǎn)單敘述認(rèn)證授權(quán)流程

          第一步, 認(rèn)證(authentication)。Acegi調(diào)用AuthenticationManager(認(rèn)證管理器)來對(duì)當(dāng)前請(qǐng)求登陸系統(tǒng)用戶進(jìn)行驗(yàn)證,AuthenticationManager負(fù)責(zé)委托一個(gè)或多個(gè)Provider(認(rèn)證提供者),并逐一遍歷每個(gè)Provider,直到某一個(gè)Provider能夠成功的驗(yàn)證用戶的身份。Provider成功驗(yàn)證用戶身份后,會(huì)返回一個(gè)Authentication(證明), Authentication中包括Principal(用戶名),Credentials(通常是密碼),Authorities(該用戶所擁有的權(quán)限)。這樣就完成了身份驗(yàn)證的步驟。

          第二步,授權(quán)(authorization)。當(dāng)Acegi獲得Authentication后,也就確定了用戶的身份。每當(dāng)用戶請(qǐng)求訪問某受保護(hù)資源時(shí),Acegi會(huì)調(diào)用AccessDecisionManager(訪問決策管理器)來決定用戶的Authentication是否有恰當(dāng)?shù)臋?quán)限來訪問當(dāng)前訪問的受保護(hù)資源,有則授權(quán)用戶通過,無則拋出錯(cuò)誤信息,以達(dá)到訪問控制的目的。

           2. 安全保護(hù)方式

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

           3.過濾器鏈代理

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

          FilterChainProxy其實(shí)也只是一個(gè)擴(kuò)展后的Filter,它負(fù)責(zé)委托Spring中的各個(gè)實(shí)現(xiàn)了javax.servlet.Filter接口的Bean來執(zhí)行過濾功能。 如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配置文件中相應(yīng)的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 管理機(jī)制

          Acegi的異常管理機(jī)制做得不錯(cuò),基本上可以滿足權(quán)限管理需求。在其結(jié)構(gòu)基礎(chǔ)上繼承實(shí)現(xiàn)自己的異常類也是很方便的。

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

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

          AuthenticationException 是所有授權(quán)相關(guān)的異常的父類,當(dāng)用戶身份驗(yàn)證失敗時(shí)就會(huì)拋出這個(gè)異常。

          AccessDeniedException 是所有認(rèn)證相關(guān)的異常的父類,當(dāng)資源被拒絕訪問時(shí)就會(huì)拋出這個(gè)異常。

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

          如遇到AuthenticationException 就會(huì)重定向到登陸頁面,遇到AccessDeniedException 就會(huì)無權(quán)訪問資源頁面。你還可以繼承ExceptionTranslationFilter基礎(chǔ)上覆蓋handleException方法來實(shí)現(xiàn)你自己的系統(tǒng)中異常的處理。

          <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 龔椿深 閱讀(669) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 东兰县| 广南县| 清河县| 万安县| 宁波市| 正镶白旗| 顺平县| 乐山市| 长宁区| 河南省| 太白县| 准格尔旗| 洛宁县| 新化县| 白玉县| 双桥区| 荥经县| 永兴县| 当阳市| 蕉岭县| 广元市| 柞水县| 高州市| 颍上县| 山东| 安宁市| 吉安县| 教育| 孝感市| 历史| 田林县| 宁安市| 呼图壁县| 夏津县| 河西区| 万载县| 安岳县| 尼勒克县| 嘉荫县| 邵武市| 盐津县|