麻豆传媒视频在线,国产91精品不卡视频,欧美jizz19性欧美,污视频网站在线观看,91涩漫在线观看,伊人发布在线,九色porny丨首页在线,福利视频一区,久久av网址,久久人人视频

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > acegi參考手冊(v1.0.4)[譯]-第六章 通用認證服務

acegi參考手冊(v1.0.4)[譯]-第六章 通用認證服務
2010-01-13 23:25:27  作者:  來源:
第六章. 通用認證服務
6.1. Mechanisms, Providers 和 Entry Points
如果你使用Acegi Security提供的認證方法,那么通常你需要配置一個web filter,一個AuthenticationProvider
以及AuthenticationEntryPoint。在本節我們將要瀏覽一個示例應用,它需要支持基于form的認證(例如提供給用戶登錄的HTML頁面)以及基礎認證(例如web service或者類似的可以訪問受保護資源)。
 
web.xml中,這個應用需要一個單獨的Acegi Security filter來使用FilterChainProxy。幾乎所有的Acegi Security應用都有一個類似的項,看起來象下面這樣:
 
 
xml 代碼
 
  1. <filter>  
  2. <filter-name>Acegi Filter Chain Proxy</filter-name>  
  3. <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>  
  4. <init-param>  
  5. <param-name>targetClass</param-name>  
  6. <param-value>org.acegisecurity.util.FilterChainProxy</param-value>  
  7. </init-param>  
  8. </filter>  
  9. <filter-mapping>  
  10. <filter-name>Acegi Filter Chain Proxy</filter-name>  
  11. <url-pattern>/*</url-pattern>  
  12. </filter-mapping>  
 
上述聲明將使每個web請求都要經過Acegi SecurityFilterChainProxy。正如在本手冊的filter那節中所說,FilterChainProxy是一個通用類,它使得web請求按照URL模式被發送到不同的filter。那些被委派的filter是由application context管理的,因此它們可以享受依賴注射的好處。我們來看看在你的application contextFilterChainProxy的定義會是什么樣的:
 
 
xml 代碼
 
  1. <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">  
  2. <property name="filterInvocationDefinitionSource">  
  3. <value>  
  4. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON   
  5. PATTERN_TYPE_APACHE_ANT   
  6. /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,basicProcessingFilter,securityContextHolderAwareRequestFilter,</value>  
  7. </property>  
  8. </bean>  
 
在內部,Acegi Security會使用PropertyEditor來將上述XML片段中的字符串轉化為一個FilterInvocationDefinitionSource對象。在這個階段需要注意的是,一系列的filter會按照定義的順序運行,并且這些filter實際就是application context中的bean<bean id>。所以,在我們的例子中,會在application context出現另外一些bean,它們會被命名為httpSessionContextIntegrationFilter, logoutFilter 等。Filter出現的順序會在手冊中filter那一節討論,雖然上述的例子中它們是正確的。
 
在我們的例子中,我們使用了AuthenticationProcessingFilterBasicProcessingFilter。它們分別對應了基于form的認證和BASIC HTTP header-based認證的“認證機制”(我們在手冊的前面部分討論了認證機制扮演的角色)。如果你既不使用form也不使用BASIC認證,就不需要定義這些bean了。取而代之的是你要定義對應你所需要的認證環境的filter,例如DigestProcessingFilter 或者CasProcessingFilter。請對照手冊中對應的章節來了解如何配置這些認證機制。
 
讓我們回憶一下,在HttpSessionContextIntegrationFilter中保存了每個HTTP session調用中的SecurityContext。這意味著認證機制只會在principal最初嘗試認證的時候被使用一次。在余下的時間內,認證機制只是靜靜的待在那里,將請求發往filter鏈中的下一個filter。這個基于實際的需求源于這樣的一個事實,很少有認證實現在每一個,每一次的調用的時候都會進行認證(BASIC認證是一個值得注意的例外),但是如果一個pricipal在最初的認證步驟之后帳號被取消了,或者被禁用了,或者被修改了(例如GrantedAuthority[]中增加或者減少)會怎么樣呢?讓我們來看看現在這些情況是如何處理的。
 
前面已經介紹了安全對象的主要認證provider AbstractSecurityInterceptor。這個類需要能夠訪問一個AuthenticationManager。它同時有個可選配置可以設定一個認證對象每次安全對象調用的時候是否需要重新認證。如果Authentication.isAuthenticated()返回true,那么它默認在SecurityContextHolder中的認證對象是已認證的。這樣做對于提高性能是非常好的,但是對于即時的認證驗證是不理想的。在這樣的情況下你可能需要將AbstractSecurityInterceptor.alwaysReauthenticate屬性設置為true
 
你可能會問自己“這個AuthenticationManager是什么?”我們之前沒有見過它,但是我們曾經討論過AuthenticationProvider的概念。非常簡單,AuthenticationManager負責在AuthenticationProvider鏈之間傳遞請求。它非常象我們之前討論過的filter鏈,雖然有一些不同。Acegi Security只提供了一個AuthenticationManager實現,因此讓我們看看對于我們這章的例子,它是如何配置的:
 
xml 代碼
 
  1. <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">  
  2. <property name="providers">  
  3. <list>  
  4. <ref local="daoAuthenticationProvider"/>  
  5. <ref local="anonymousAuthenticationProvider"/>  
  6. <ref local="rememberMeAuthenticationProvider"/>  
  7. </list>  
  8. </property>  
  9. </bean>  
 
在這個時候,可能值得提到的是你的認證機制(通常是filter)也被注入了一個AuthenticationManager的引用。所以和認證機制都會使用上述的ProviderManager來輪詢一系列的AuthenticationProvider
 
在我們例子中有三個provider。它們按照上述的順序調用(使用list而不是set來顯示是按照順序調用的),每個provider都能夠嘗試認證,或者僅僅返回一個null來跳過認證。如果所有的實現都返回nullProviderManager會拋出一個相應的異常。如果你想了解更多chaining providers的信息,請參閱ProviderManagerJavaDoc
 
authentication mechanism使用的那些provider有時候是可以互換的,而有時候它們又依賴于特定的authentication mechanism。例如,DaoAuthenticationProvider只需要一個基于字符串的用戶名和密碼。若干個認證機制會產生基于字符串的用戶名和密碼的集合,包括(但不限于)BASIC form 認證。同時,有些認證機制會產生一個只能和特定類型的AuthenticationProvider交互的認證請求對象。一個這種一對一映射的例子是JA-SIG CAS,它使用service ticket的概念,只能被Common Authentication Services CasAuthenticationProvider認證。一個更加深入的一對一映射的例子是LDAP認證機制,它只能由LdapAuthenticationProvider處理。這種特定的對應關系在每個類的JavaDoc以及在本手冊的特定認證方法章節中有詳細說明。你不用擔心這些實現的細節,因為如果你忘記注冊一個合適的provider,你在嘗試認證時只會收到一個ProviderNotFoundException異常。
 
當你在FilterChainProxy中正確配置了認證機制,并且確保注冊了對應的AuthenticationProvider,你的最后一步是配置一個AuthenticationEntryPoint。回憶一下早先我們討論過的ExceptionTranslationFilter的角色,當一個基于HTTP的請求收到一個HTTP頭或者一個HTTP重定向以開始認證時它被使用。繼續我們早先的例子:
 
xml 代碼
 
  1. <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">  
  2. <property name="authenticationEntryPoint"><ref  
  3. local="authenticationProcessingFilterEntryPoint"/></property>  
  4. <property name="accessDeniedHandler">  
  5. <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">  
  6. <property name="errorPage" value="/accessDenied.jsp"/>  
  7. </bean>  
  8. </property>  
  9. </bean>  
  10. <bean id="authenticationProcessingFilterEntryPoint"  
  11. class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">  
  12. <property name="loginFormUrl"><value>/acegilogin.jsp</value></property>  
  13. <property name="forceHttps"><value>false</value></property>  
  14. </bean>  
 
注意到ExceptionTranslationFilter需要兩個協作者。第一個AccessDeniedHandlerImpl,使用一個RequestDispatcher導向顯示特定的訪問拒絕的錯誤頁面。我們使用forwad所以SecurityContextHolder中仍然保留principal的詳細信息,這些對于顯示給用戶來說是有用的(在Acegi Security的老版本中,我們依賴rervlet容器來處理403錯誤信息,它缺乏這個有用的上下文信息)。AccessDeniedHandlerImpl同時將會將HTTP頭設置為403,它是訪問拒絕的正式錯誤代碼。至于AuthentionEntryPoint,這里設置如果一個未受認證的principal嘗試執行一個受保護的操作時,我們需要執行那些動作。因為在我們的例子中要使用基于form的認證,因此我們設定AuthenticationProcessinFilterEntryPoint以及登錄頁面的URL。你的應用系統通常只需要一個entry point,并且大多數的認證方法都定義了自己特有的AuthenticationEntryPoint。每個認證方式所對應的特定entry point的詳細情況會在本手冊特定的認證方法章節中介紹。
6.2. UserDetails 和 Associated Types
正如在第一部分中提到的,大多數認證provider要用到UserDetails UserDetailsService 接口。后面那個接口只包含一個方法:
 
 
java 代碼
 
  1. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException,   
  2. DataAccessException;  
 
 
返回值UserDetails是一個接口,它提供了若干個getter保證返回非null值,例如用戶名,密碼,授予的權限以及用戶是啟用還是禁用狀態。大部分認證provider都會使用一個,即使它在認證判斷過程中實際并不使用用戶名和密碼。通常這些provider只會使用返回的UserDetails中的GrantedAuthority[]信息,因為有些系統(例如LDAP X509 CAS)已經承擔了實際的身份驗證的責任。
 
Acegi Security提供了一個UserDetails的實體類實現-UserAcegi Security用戶需要確定什么時候實現UserDetailsService以及返回什么樣的UserDetails實體類。通常,直接使用User類或者繼承User類就可以了,盡管有一些特殊情況(例如 object relational mappers),需要用戶從頭寫他們自己的UserDetails實現。這種情況也時有發生,用戶只要返回他們正常的代表系統用戶的領域對象就可以了。特別是UserDetails經常被用來存儲額外的principal相關屬性(例如他們的電話號碼以及email地址),這樣它們可以很容易被web視圖使用。
 
特定的UserDetailsService實現起來是很簡單的,它應該很容易由用戶來選擇持久化策略來獲取認證信息。說到這里,Acegi Security確實包含了一些有用的基礎實現,下面讓我們看一下。
 
6.2.1. In-Memory 認證
雖然用戶可以創建一個定制的UserDetailsService實現來從一個持久化引擎中獲取信息,很多應用不需要這種復雜性。特別是如果你正在進行快速原型開發或者剛開始集成Acegi Security,當你不需要花費時間來進行數據庫配置或者寫UserDetailsService的實現。這種情況之下,你有一個簡單的選擇,就是配置InMemoryDaoImpl實現。
 
 
xml 代碼
 
  1. <bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">  
  2. <property name="userMap">  
  3. <value>  
  4. marissa=koala,ROLE_TELLER,ROLE_SUPERVISOR   
  5. dianne=emu,ROLE_TELLER   
  6. scott=wombat,ROLE_TELLER   
  7. peter=opal,disabled,ROLE_TELLER   
  8. </value>  
  9. </property>  
  10. </bean>  
 
在上面的例子中,userMap屬性包含了每個用戶的用戶名,密碼,一個授權列表以及一個可選的啟用/禁用關鍵詞。使用逗號分隔。用戶名必須在等號的左側,密碼必須在等號右側第一個出現。啟用和禁用關鍵詞(大小寫敏感)可以出現在第二個或者之后任意位置。剩余的字符串被看作是授予的權限,這些權錢被創建為GrantedAuthorityImpl對象(僅供參考-大多數的應用不需要自定義的GrantedAuthority實現,所以使用默認的實現就可以了)。注意如果一個用戶沒有密碼及或沒有被授予權限,該用戶不會在in-memory 認證庫中創建。
 
InMemoryDaoImpl也提供了一個setUserProperties(Properties)方法,可以允許你用另一個Spring的配置好的bean或者一個外部的properties文件來實例化屬性。你可能要使用SpringPropertiesFactoryBean,它在加載外部屬性文件的時候非常有用。這個setter可能對于有大量用戶的應用,或者開發期配置變更有所助益,但是不要指望使用整個數據庫來處理認證細節。
 
6.2.2. JDBC 認證
也包括了一個從JDBC數據源獲取認證信息的UserDetailsService。使用Spring內部的JDBC,避免了僅僅為了存儲用戶信息而使用復雜的對象關系Common Authentication Services 映射(ORM)。如果你確實使用ORM工具,你可能要寫一個定制的UserDetailsService來重用你已經創建的映射文件。回到JdbcDaoImpl,下面是一個配置的例子:
 
xml 代碼
 
  1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  2. <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>  
  3. <property name="url"><value>jdbc:hsqldb:hsql://localhost:9001</value></property>  
  4. <property name="username"><value>sa</value></property>  
  5. <property name="password"><value></value></property>  
  6. </bean>  
  7. <bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">  
  8. <property name="dataSource"><ref bean="dataSource"/></property>  
  9. </bean>  
  10.    
你可能要修改上述的DriverManagerDataSource來使用不同的關系數據庫管理系統。你還可以使用從JNDI獲取的全局數據源,如上的常規Spring選項。不論是使用什么數據庫以及如何獲取數據源,必須使用一個按照dbinit.txt中寫明的數據庫模式。你可以從Acegi Security網站下載這個文件。
 
如果你的默認數據庫模式不能滿足需要,JdbcDaoImpl提供了兩個屬性允許定制SQL語句。如果需要進一步定制,你可以繼承JdbcDaoImpl。請參考JavaDocs獲取詳情,不過請注意這個類并不是為了復雜的自定義繼承而寫的。如果你的需求比較復雜(例如數據庫結構比較特殊或者需要返回一個特定的UserDetails實現),那么你最好寫自己的UserDetailsService實現。Acegi Security提供的基礎實現只是為了典型場景,并沒有提供無限的配置靈活性。
 
6.3. 并行Concurrent Session 處理
Acegi Security能夠限定次數防止一個principal多次并行認證到同一個應用。許多ISV利用這一點來加強授權管理,網管也喜歡這個特性因為可以防止一個用戶名被重復使用。例如,你可以限制“Batman”用戶從兩個不同的session登錄系統。
 
使用并行session支持,你需要在web.xml中增加如下內容:
 
xml 代碼
 
  1. <listener>  
  2. <listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>  
  3. </listener>  
 
而且,你需要在中FilterChainProxy增加org.acegisecurity.concurrent.ConcurrentSessionFilter to your FilterChainProxyConcurrentSessionFilter需要兩個屬性,sessionRegistry用來指向一個SessionRegistryImpl實例,expiredUrl指向一個session實效時顯示的頁面。
 
當一個HttpSession開始或者結束的時候web.xml HttpSessionEventPublisher發送一個ApplicationEventSpring ApplicationContext。這很關鍵,因為它確保session終止的時候SessionRegistryImpl會收到通知。
 
你還要裝配ConcurrentSessionControllerImpl并在ProviderManager中引用:
 
 
xml 代碼
 
  1. <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">  
  2. <property name="providers">  
  3. <!-- your providers go here -->  
  4. </property>  
  5. <property name="sessionController"><ref bean="concurrentSessionController"/></property>  
  6. </bean>  
  7. <bean id="concurrentSessionController"  
  8. class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">  
  9. <property name="maximumSessions"><value>1</value></property>  
  10. <property name="sessionRegistry"><ref local="sessionRegistry"/></property>  
  11. </bean>  
  12. <bean id="sessionRegistry" class="org.acegisecurity.concurrent.SessionRegistryImpl"/>  
6.4. 認證標簽庫
AuthenticationTag只是用來把principalAuthentication.getPrincipal()對象的屬性顯示到web頁面。
 
下面的JSP片段展示了如何使用AuthenticationTag
 
java 代碼
 
  1. <authz:authentication operation="username"/>  
 
這個標簽將會顯示pricipal的名字。這里我們假設Authentication.getPrincipal()是一個UserDetails對象,這在使用典型的DaoAuthenticationProvider時候的一般狀況。

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
国产女同一区二区| 久久久久久久综合日本| 图片区小说区亚洲| 国产在线视频网站| 免费在线超碰| 成人在线免费公开观看视频| 国产日本在线视频| 欧美videossex另类| 日本动漫理论片在线观看网站 | 国产福利小视频在线| 六十路在线观看| 国产二区视频在线观看| 在线激情网站| av福利导福航大全在线| 福利一区视频| 偷拍自拍一区| 欧美在线二区| 亚洲欧美精品一区| 国产香蕉精品视频一区二区三区| 日韩在线观看精品| 午夜免费在线观看精品视频| 国产美女搞久久| 高清av在线| 中文字幕成在线观看| 免费精品一区| 久久香蕉国产| 日韩电影在线观看网站| youjizz久久| 99精品国产一区二区三区| 国产精品久久天天影视| 日本中文在线一区| 国产成人综合亚洲91猫咪| 尤物视频一区二区| 欧美日本不卡视频| 久久九九精品99国产精品| 国产精品电影一区| 国产视频第一区| 男人天堂视频在线观看| 欧洲亚洲成人| 国产美女诱惑一区二区| 26uuu国产在线精品一区二区| 亚洲国产视频网站| 亚洲成人av片| 久久免费在线观看| 亚洲成人天堂| 精品免费av在线 | 精品69视频一区二区三区| 久久夜色电影| missav|免费高清av在线看| 欧美大片1688网站| 欧美伦理在线视频| 美女在线视频一区| 亚洲精品第一国产综合野| 91精选在线观看| 色8久久人人97超碰香蕉987| 精品视频久久久| 日韩免费中文字幕| 麻豆免费在线观看| 精品国产3级a| 波多野结衣精品在线| 精品美女国产在线| www.色综合| 日本一二区视频| 在线国产成人影院| 伊人久久成人| 一区二区不卡在线视频 午夜欧美不卡在| 国产乱子伦视频一区二区三区 | 欧美韩日一区| 国产传媒欧美日韩成人| 欧美日韩在线另类| 欧美激情亚洲一区| 黄网址在线观看| 欧美丝袜激情| 国产欧美日韩精品一区| 日韩av综合网站| 中文字幕在线观看| 超碰97久久国产精品牛牛| 精品一区二区三区不卡 | 国产精品久久久久91| 大胆人体色综合| 中文字幕在线观看| 亚洲国产精品免费视频| 日韩福利电影在线| 精品久久久久久久久久久| 欧美激情三级免费| yellow在线观看网址| 在线观看三级视频| 一级欧洲+日本+国产| 《视频一区视频二区| 久热精品视频在线观看一区| www在线免费观看视频| 91超碰成人| 一区二区三区**美女毛片| 色在人av网站天堂精品| 色资源二区在线视频| 亚洲私拍自拍| 色狠狠一区二区三区香蕉| 日韩av大片免费看| 91精品一区| 国产精品一区二区91| 亚洲成人在线网| 视频三区在线观看| 大片网站久久| 亚洲综合色网站| 国产成人jvid在线播放| 亚洲天堂网站| 久久久.com| 欧美激情一区二区久久久| 色尼玛亚洲综合影院| 老司机午夜精品99久久| 日韩经典第一页| 久久亚洲天堂| 久久综合影视| 亚洲成人激情图| 岛国成人毛片| 热久久一区二区| 亚洲人成在线免费观看| a视频在线播放| 国内精品不卡在线| 最近2019中文字幕mv免费看| 欧美91看片特黄aaaa| 99久久er热在这里只有精品15| 欧美另类极品videosbestfree| 色综合一区二区日本韩国亚洲| 91视频xxxx| 欧美一区第一页| 综合综合综合综合综合网| 亚洲影视在线播放| 伊人发布在线| 亚洲精品网址| 日韩欧美一区二区久久婷婷| 18在线观看的| 高清不卡在线观看av| 久久久久久中文字幕| 精品国产影院| 欧美日韩亚洲系列| 青青草免费在线| 日本不卡一区二区三区| 中文字幕精品www乱入免费视频| 性欧美gay| 亚洲人成精品久久久久| 成视人a免费观看视频| 亚洲国内欧美| 亚洲人精品午夜在线观看| av在线精品| 亚洲成人av免费| 在线观看黄色av| 国产激情一区二区三区桃花岛亚洲| 久久久女女女女999久久| 激情av综合| 在线观看一区二区视频| 免费黄网站在线播放| 国产精品乡下勾搭老头1| 日韩av电影手机在线| 一本一道久久a久久精品蜜桃| 亚洲第一精品自拍| 亚洲一区av| 日韩欧美在线免费| 国产第一页在线视频| 国产亚洲成aⅴ人片在线观看| 日本免费专区| 麻豆freexxxx性91精品| 午夜精品视频在线| 牛牛国产精品| 中国china体内裑精亚洲片| 成人av动漫| 国产一区久久久| 欧美在线观看网址综合| 97精品视频在线看| 亚洲欧美中文日韩在线v日本| 亚洲网址在线观看| 欧美情侣在线播放| 91另类视频| 色屁屁一区二区| 精品91久久| 亚洲国产精品麻豆| 91色在线看| 一区二区三区不卡视频在线观看| 亚洲视频tv| 日本一区二区视频在线观看| 天堂中文在线视频| 成人精品亚洲人成在线| 超碰在线公开超碰在线| 国产成人三级在线观看| 疯狂做受xxxⅹ高潮视频免费| 韩国毛片一区二区三区| 国产在线播放91| 国产最新精品精品你懂的| 国产日产欧美a一级在线| 狠狠色丁香九九婷婷综合五月| 啊啊啊射了视频网站| 欧美激情啪啪| 欧洲色大大久久| 日韩成人亚洲| 欧美丝袜自拍制服另类| 91精品亚洲一区在线观看| 精品国产制服丝袜高跟| 亚洲伊人春色| 久久6精品影院| 午夜精品久久|