欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

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

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

開(kāi)通VIP
Spring Security3源碼分析-CAS的支持

Spring Security3對CAS的支持主要在這個(gè)spring-security-cas-client-3.0.2.RELEASE.jar包中

Spring Security和CAS集成的配置資料很多。這里講解的比較詳細

http://lengyun3566.iteye.com/blog/1358323

配置方面,主要為下面的部分:

Java代碼
 
  1. <security:http auto-config="true" entry-point-ref="casAuthEntryPoint" access-denied-page="/error/403.jsp">  
  2.     <security:custom-filter ref="casAuthenticationFilter" position="CAS_FILTER"/>  
  3.     <security:form-login login-page="/login.jsp"/>  
  4.     <security:logout logout-success-url="/login.jsp"/>  
  5.     <security:intercept-url pattern="/admin.jsp*" access="ROLE_ADMIN"/>  
  6.     <security:intercept-url pattern="/index.jsp*" access="ROLE_USER,ROLE_ADMIN"/>  
  7.     <security:intercept-url pattern="/home.jsp*" access="ROLE_USER,ROLE_ADMIN"/>  
  8.     <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>   
  9. </security:http>  
  10.   
  11. <security:authentication-manager alias="authenticationmanager">  
  12.     <security:authentication-provider ref="casAuthenticationProvider"/>  
  13. </security:authentication-manager>  
  14.   
  15. <bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider">  
  16.         <property name="ticketValidator" ref="casTicketValidator"/>  
  17.         <property name="serviceProperties" ref="casService"/>  
  18.         <property name="key" value="docms"/>  
  19.         <property name="authenticationUserDetailsService" ref="authenticationUserDetailsService"/>  
  20. </bean>  
  21.   
  22. <bean id="casAuthEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">  
  23.         <property name="loginUrl" value="https://server:8443/cas/login"/>  
  24.         <property name="serviceProperties" ref="casService"/>  
  25. </bean>     
  26.   
  27. <bean id="casService" class="org.springframework.security.cas.ServiceProperties">  
  28.     <property name="service" value="http://localhost:8888/docms/j_spring_cas_security_check"/>  
  29. </bean>     
  30.   
  31. <bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">  
  32.         <property name="authenticationManager" ref="authenticationmanager"/>  
  33. </bean>  
  34.   
  35. <bean id="casTicketValidator" class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">  
  36.         <constructor-arg value="https://server:8443/cas/"/>  
  37. </bean>  
  38.   
  39. <bean id="authenticationUserDetailsService" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">  
  40.         <property name="userDetailsService" ref="userDetailsManager"/>  
  41. </bean>     

 

這里需要強調一下http標簽的entry-point-ref屬性,因為之前沒(méi)有著(zhù)重的介紹,英文的意思是入口點(diǎn)引用。為什么需要這個(gè)入口點(diǎn)呢。這個(gè)入口點(diǎn)其實(shí)僅僅是被ExceptionTranslationFilter引用的。前面已經(jīng)介紹過(guò)ExceptionTranslationFilter過(guò)濾器的作用是異常翻譯,在出現認證異常、訪(fǎng)問(wèn)異常時(shí),通過(guò)入口點(diǎn)決定redirect、forward的操作。比如現在是form-login的認證方式,如果沒(méi)有通過(guò)UsernamePasswordAuthenticationFilter的認證就直接訪(fǎng)問(wèn)某個(gè)被保護的url,那么經(jīng)過(guò)ExceptionTranslationFilter過(guò)濾器處理后,先捕獲到訪(fǎng)問(wèn)拒絕異常,并把跳轉動(dòng)作交給入口點(diǎn)來(lái)處理。form-login的對應入口點(diǎn)類(lèi)為L(cháng)oginUrlAuthenticationEntryPoint,這個(gè)入口點(diǎn)類(lèi)的commence方法會(huì )redirect或forward到指定的url(form-login標簽的login-page屬性)


清楚了entry-point-ref屬性的意義。那么與CAS集成時(shí),如果訪(fǎng)問(wèn)一個(gè)受保護的url,就通過(guò)CAS認證對應的入口點(diǎn)org.springframework.security.cas.web.CasAuthenticationEntryPoint類(lèi)redirect到loginUrl屬性所配置的url中,即一般為CAS的認證頁(yè)面(比如:https://server:8443/cas/login)。

下面為CasAuthenticationEntryPoint類(lèi)的commence方法。其主要任務(wù)就是構造跳轉的url,再執行redirect動(dòng)作。根據上面的配置,實(shí)際上跳轉的url為:https://server:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8888%2Fdocms%2Fj_spring_cas_security_check

Java代碼
 
  1. public final void commence(final HttpServletRequest servletRequest, final HttpServletResponse response,  
  2.         final AuthenticationException authenticationException) throws IOException, ServletException {  
  3.   
  4.     final String urlEncodedService = createServiceUrl(servletRequest, response);  
  5.     final String redirectUrl = createRedirectUrl(urlEncodedService);  
  6.   
  7.     preCommence(servletRequest, response);  
  8.     response.sendRedirect(redirectUrl);  
  9. }  

 

 

接下來(lái)繼續分析custom-filter ref="casAuthenticationFilter" position="CAS_FILTER"

這是一個(gè)自定義標簽,并且在過(guò)濾器鏈中的位置是CAS_FILTER。這個(gè)過(guò)濾器在何時(shí)會(huì )起作用呢?帶著(zhù)這個(gè)疑問(wèn)繼續閱讀源碼

CasAuthenticationFilter對應的類(lèi)路徑是

org.springframework.security.cas.web.CasAuthenticationFilter

這個(gè)類(lèi)與UsernamePasswordAuthenticationFilter一樣,都繼承于A(yíng)bstractAuthenticationProcessingFilter。實(shí)際上所有認證過(guò)濾器都繼承這個(gè)抽象類(lèi),其過(guò)濾器本身只要實(shí)現attemptAuthentication方法即可。

CasAuthenticationFilter的構造方法直接向父類(lèi)的構造方法傳入/j_spring_cas_security_check用于判斷當前請求的url是否需要進(jìn)一步的認證處理

Java代碼
 
  1. public CasAuthenticationFilter() {  
  2.     super("/j_spring_cas_security_check");  
  3. }  

CasAuthenticationFilter類(lèi)的attemptAuthentication方法源碼如下

Java代碼
 
  1. public Authentication attemptAuthentication(final HttpServletRequest request, final HttpServletResponse response)  
  2.         throws AuthenticationException {  
  3.     //設置用戶(hù)名為有狀態(tài)標識符  
  4.     final String username = CAS_STATEFUL_IDENTIFIER;  
  5.     //獲取CAS認證成功后返回的ticket  
  6.     String password = request.getParameter(this.artifactParameter);  
  7.   
  8.     if (password == null) {  
  9.         password = "";  
  10.     }  
  11.     //構造UsernamePasswordAuthenticationToken對象  
  12.     final UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);  
  13.   
  14.     authRequest.setDetails(authenticationDetailsSource.buildDetails(request));  
  15.     //由認證管理器完成認證工作  
  16.     return this.getAuthenticationManager().authenticate(authRequest);  
  17. }  

 在之前的源碼分析中,已經(jīng)詳細分析了認證管理器AuthenticationManager認證的整個(gè)過(guò)程,這里就不再贅述了。

 

由于A(yíng)uthenticationManager是依賴(lài)于具體的AuthenticationProvider的,所以接下來(lái)看

Xml代碼
 
  1. <security:authentication-manager alias="authenticationmanager">  
  2. <security:authentication-provider ref="casAuthenticationProvider"/>  
  3. </security:authentication-manager>  

注意這里的ref屬性定義。如果沒(méi)有使用CAS認證,此處一般定義user-service-ref屬性。這兩個(gè)屬性的區別在于

ref:直接將ref依賴(lài)的bean注入到AuthenticationProvider的providers集合中

user-service-ref:定義DaoAuthenticationProvider的bean注入到AuthenticationProvider的providers集合中,并且DaoAuthenticationProvider的變量userDetailsService由user-service-ref依賴(lài)的bean注入。

 

由此可見(jiàn),采用CAS認證時(shí),AuthenticationProvider只有AnonymousAuthenticationProvider和CasAuthenticationProvider

 

繼續分析CasAuthenticationProvider是如何完成認證工作的

Java代碼
 
  1. public Authentication authenticate(Authentication authentication) throws AuthenticationException {  
  2.     //省略若干判斷  
  3.     CasAuthenticationToken result = null;  
  4.     //注意這里的無(wú)狀態(tài)條件。主要用于無(wú)httpsession的環(huán)境中。如soap調用  
  5.     if (stateless) {  
  6.         // Try to obtain from cache  
  7.         //通過(guò)緩存來(lái)存儲認證實(shí)體。主要避免每次請求最新ticket的網(wǎng)絡(luò )開(kāi)銷(xiāo)  
  8.         result = statelessTicketCache.getByTicketId(authentication.getCredentials().toString());  
  9.     }  
  10.   
  11.     if (result == null) {  
  12.         result = this.authenticateNow(authentication);  
  13.         result.setDetails(authentication.getDetails());  
  14.     }  
  15.   
  16.     if (stateless) {  
  17.         // Add to cache  
  18.         statelessTicketCache.putTicketInCache(result);  
  19.     }  
  20.   
  21.     return result;  
  22. }  
  23.   
  24. //完成認證工作  
  25. private CasAuthenticationToken authenticateNow(final Authentication authentication) throws AuthenticationException {  
  26.     try {  
  27.         //通過(guò)cas client的ticketValidator完成ticket校驗,并返回身份斷言  
  28.         final Assertion assertion = this.ticketValidator.validate(authentication.getCredentials().toString(), serviceProperties.getService());  
  29.        //根據斷言信息構造UserDetails   
  30.         final UserDetails userDetails = loadUserByAssertion(assertion);  
  31.        //檢查賬號狀態(tài)  
  32.        userDetailsChecker.check(userDetails);  
  33.        //構造CasAuthenticationToken  
  34.         return new CasAuthenticationToken(this.key, userDetails, authentication.getCredentials(), userDetails.getAuthorities(), userDetails, assertion);  
  35.     } catch (final TicketValidationException e) {  
  36.         throw new BadCredentialsException(e.getMessage(), e);  
  37.     }  
  38. }  
  39.   
  40. //通過(guò)注入的authenticationUserDetailsService根據token中的認證主體即用戶(hù)名獲取UserDetails   
  41. protected UserDetails loadUserByAssertion(final Assertion assertion) {  
  42.     final CasAssertionAuthenticationToken token = new CasAssertionAuthenticationToken(assertion, "");  
  43.     return this.authenticationUserDetailsService.loadUserDetails(token);  
  44. }  

需要注意的是為什么要定義authenticationUserDetailsService這個(gè)bean。由于CAS需要authentication-manager標簽下定義<security:authentication-provider ref="casAuthenticationProvider"/>,而不是之前所介紹的
user-service-ref屬性,所以這里僅僅定義了一個(gè)provider,而沒(méi)有注入UserDetailsService,所以這里需要單獨定義authenticationUserDetailsService這個(gè)bean,并注入到CasAuthenticationProvider中。

這里需要對CasAuthenticationToken、CasAssertionAuthenticationToken單獨解釋一下

CasAuthenticationToken:一個(gè)成功通過(guò)的CAS認證,與UsernamePasswordAuthenticationToken一樣,都是繼承于A(yíng)bstractAuthenticationToken,并且最終會(huì )保存到SecurityContext上下文、session中

CasAssertionAuthenticationToken:一個(gè)臨時(shí)的認證對象用于輔助獲取UserDetails

 

配置文件中幾個(gè)bean定義這里就不一一分析了,都是為了輔助完成CAS認證、跳轉的工作。 

 

現在,可以對整個(gè)CAS認證的過(guò)程總結一下了:

1.客戶(hù)端發(fā)起一個(gè)請求,試圖訪(fǎng)問(wèn)系統系統中受保護的url

2.各filter鏈進(jìn)行攔截并做相應處理,由于沒(méi)有通過(guò)認證,ExceptionTranslationFilter過(guò)濾器會(huì )捕獲到訪(fǎng)問(wèn)拒絕異常,并把該異常交給入口點(diǎn)處理

3.CAS 認證對應的入口點(diǎn)直接跳轉到CAS Server端的登錄界面,并攜帶參數service(一般為url:……/j_spring_cas_security_check)

4.CAS Server對登錄信息進(jìn)行處理,如果登錄成功,就跳轉到應用系統中service指定的url,并攜帶ticket

5.應用系統中的各filter鏈再次對該url攔截,此時(shí)CasAuthenticationFilter攔截到j(luò )_spring_cas_security_check,就會(huì )對ticket進(jìn)行驗證,驗證成功返回一個(gè)身份斷言,再通過(guò)身份斷言從當前應用系統中獲取對應的UserDetails、GrantedAuthority。此時(shí),如果步驟1中受保護的url權限列表有一個(gè)權限存在于GrantedAuthority列表中,說(shuō)明有權限訪(fǎng)問(wèn),直接響應客戶(hù)端所試圖訪(fǎng)問(wèn)的url

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Spring Security(3.1.7) CAS Authentication
SpringSecurity3.X--Cas client 配置之配置session-management遇到的問(wèn)題
spring security 3.1.0 控制用戶(hù)重復登陸
Spring Security3實(shí)踐總結
單點(diǎn)登錄學(xué)習(1)CAS服務(wù)器端配置編程
Spring Roo 簡(jiǎn)介,第 2 部分: 使用 Spring Roo 開(kāi)發(fā)應用程序
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久