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

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

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

    Spring Security 2.0學(xué)習(xí)筆記

        spring 2.5也發(fā)布了,Acegi 2.0也出來了,發(fā)現(xiàn)里面也多了很多新特性,不過好多都是英文的,所以就到處看看,記些東西,謂之筆記也,呵呵。廢話不多說,配置文件當(dāng)然要從web.xml開始啊。看代碼。
        使用安全框架第一步就是需要在web.xml文件中聲明要使用的過濾器<filter></filter>
    <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    以上代碼在Spring Securtity網(wǎng)絡(luò)構(gòu)建下定義了一個(gè)鉤子,接著你就可以開始編輯你的應(yīng)用程序配置文件(這個(gè)就不是Web.xml了)。網(wǎng)頁安全服務(wù)使用<http>元素配置。
    給你們看個(gè)最小應(yīng)用的<http>設(shè)置
    <http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
    </http>
    以上代碼說明希望我們應(yīng)用程序的所有URLS都被保護(hù)起來,并要求由角色為ROLE_USER登入(注意:你可以使用若干的<intercept-url>元素為不同的URLS設(shè)置不同的用戶角色登錄請(qǐng)求,但是它們會(huì)在合適的排列中進(jìn)行評(píng)估,而且第一個(gè)匹配的將被使用。所以你應(yīng)該將最細(xì)節(jié)的配置部分放在最前面!)
        為了加一些用戶,你可以在命名空間里面定義一些測(cè)試數(shù)據(jù):
    <authentication-provider>
    <user-service>
    <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
    <user name="bob" password="bobspassword" authorities="ROLE_USER" />
    </user-service>
    </authentication-provider>
       注意:<http>元素是為創(chuàng)建一個(gè)FilterChainProxy和它要使用的若干filter beans,因?yàn)閒ilter順序不正確產(chǎn)生的問題,不會(huì)再出現(xiàn)了,現(xiàn)在這些過濾器的位置都是預(yù)定義好的。 
                  <authentication-provider>元素創(chuàng)建一個(gè)DaoAuthenticationProvider bean,<user-service>元素創(chuàng)建一個(gè)InMemoryDaoImpl.一個(gè)ProviderManageer bean 總是由命名空間處理系統(tǒng)所創(chuàng)建而且DaoAuthenticationProvider自動(dòng)被ProviderManageer bean注冊(cè)。
    我們接著說測(cè)試用戶,上面定義了2個(gè)用戶,他們的密碼和角色被應(yīng)用于程序中的登錄控制。它也可以從<user-service>的配置屬性中載入來自標(biāo)準(zhǔn)的屬性文件中的用戶信息。使用<authentication-provider>元素意味著用戶信息將被authentication manager用來處理認(rèn)證請(qǐng)求。
        接下來說下auto-config屬性,就如上面的配置定義一樣,像這樣定義就可以了
    <http>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login />
    <anonymous />
    <http-basic />
    <logout />
    <remember-me />
    </http>
    以上這些元素負(fù)責(zé)啟用用戶登錄、匿名認(rèn)證、基礎(chǔ)認(rèn)證、注銷和remember-me服務(wù),他們都有各自的屬性去改變他們的行為。auto-config需要一個(gè)UserDetailsService.在使用沒有UserDetailsService的auto-config時(shí)在你的配置文件中會(huì)發(fā)成一個(gè)錯(cuò)誤(比如你正在使用LDAP認(rèn)證)。這是因?yàn)閞emember-me在auto-config="true"的時(shí)候會(huì)自動(dòng)激活而且它還要求一個(gè)使用UserDetailsService運(yùn)行的認(rèn)證機(jī)制,那么如果你有一個(gè)因缺少UserDetailsService而產(chǎn)生的錯(cuò)誤,請(qǐng)嘗試移除auto-config的設(shè)置。
        好了我們接下來談下表單和基本登錄選項(xiàng),你可能會(huì)奇怪當(dāng)提示你要登錄的時(shí)候登錄表單是從哪兒來的,因?yàn)槲覀儾]有提供任何HTML文件或者JSP文件。事實(shí)上,我們并沒有為登錄頁面明確的設(shè)置URL。 Spring Security 會(huì)產(chǎn)生一個(gè)自動(dòng)的、基于自動(dòng)激活并使用專為URL提交登錄的標(biāo)準(zhǔn)參數(shù)特性,對(duì)于默認(rèn)目標(biāo)URL,用戶會(huì)自動(dòng)發(fā)送相應(yīng)信息。然而,命名空間提供足夠豐富的支持允許你自定義這些選項(xiàng)。比如,你想提供自己的登錄頁面,你可以這么做:
    <http auto-config='true'>
    <intercept-url pattern="/login.jsp*" filters="none"/>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page='/login.jsp'/>
    </http>
    你依然能用auto-config,form-login元素僅僅是重寫了默認(rèn)的設(shè)置,同樣的我們已經(jīng)添加了額外的intercept-url元素告訴登錄頁面所有的請(qǐng)求都應(yīng)該被安全過濾器所處理,另外,請(qǐng)求也應(yīng)該被模式/**進(jìn)行匹配并且它不能轉(zhuǎn)向它自己的登錄頁面,如果你想使用basic authentication來代替form login,那么請(qǐng)修改配置文件如下:
    <http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <http-basic />
    </http>
    Basic authentication將會(huì)獲得優(yōu)先并將用于登錄提示當(dāng)一個(gè)用戶試圖訪問被保護(hù)的資源。如果你希望使用它的話Form login依然可以在這份配置文件中使用。
        現(xiàn)實(shí)中,你會(huì)需要更大型的用戶信息源,而不是寫在application context里的幾個(gè)名字。 多數(shù)情況下,你會(huì)想把用戶信息保存到數(shù)據(jù)庫或者是LDAP服務(wù)器里。 LDAP命名控件會(huì)在LDAP章里詳細(xì)討論,所以我們這里不會(huì)講它。 如果你自定義了一個(gè)Spring Security的UserDetailsService實(shí)現(xiàn),在你的application context中名叫"myUserDetailsService",然后你可以使用下面的驗(yàn)證。

    <authentication-provider user-service-ref='myUserDetailsService'/>



    如果你想用數(shù)據(jù)庫,可以使用下面的方式

    <authentication-provider>
    <jdbc-user-service data-source-ref="securityDataSource"/>
    </authentication-provider>



    這里的"securityDataSource"就是 DataSource bean在application context里的名字,它指向了包含著Spring Security用戶信息的表。 另外,你可以配置一個(gè)Spring Security JdbcDaoImpl bean,使用user-service-ref屬性指定。
    2.2.3.1. 添加一個(gè)密碼編碼器

    你的密碼數(shù)據(jù)通常要使用一種散列算法進(jìn)行編碼。 使用<password-encoder>元素支持這個(gè)功能。 使用SHA加密密碼,原始的認(rèn)證供應(yīng)器配置,看起來就像這樣:

    <authentication-provider>
    <password-encoder hash="sha"/>
    <user-service>
    <user name="jimi" password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f" authorities="ROLE_USER, ROLE_ADMIN" />
    <user name="bob" password="4e7421b1b8765d8f9406d87e7cc6aa784c4ab97f" authorities="ROLE_USER" />
    </user-service>
    </authentication-provider>



    在使用散列密碼時(shí),用鹽值防止字典攻擊是個(gè)好主意,Spring Security也支持這個(gè)功能。 理想情況下,你可能想為每個(gè)用戶隨機(jī)生成一個(gè)鹽值,不過,你可以使用從UserDetailsService讀取出來的UserDetails對(duì)象中的屬性。 比如,使用username屬性,你可以這樣用:

    <password-encoder hash="sha">
    <salt-source user-property="username"/>
    </password-encoder>


    你可以通過password-encoder的ref屬性,指定一個(gè)自定義的密碼編碼器bean。 這應(yīng)該包含application context中一個(gè)bean的名字,它應(yīng)該是Spring Security的PasswordEncoder接口的一個(gè)實(shí)例。
    2.3. 高級(jí)web特性
    2.3.1. Remember-Me認(rèn)證

    參考Remember-Me章獲得remember-me命名空間配置的詳細(xì)信息。
    2.3.2. 添加HTTP/HTTPS信道安全

    如果你的同時(shí)支持HTTP和HTTPS協(xié)議,然后你要求特定的URL只能使用HTTPS,這時(shí)可以直接使用<intercept-url>的requires-channel屬性:

    <http>
    <intercept-url pattern="/secure/**" access="ROLE_USER" requires-channel="https"/>
    <intercept-url pattern="/**" access="ROLE_USER" requires-channel="any"/>
    ...
    </http>


    使用了這個(gè)配置以后,如果用戶通過HTTP嘗試訪問"/secure/**"匹配的網(wǎng)址,他們會(huì)先被重定向到HTTPS網(wǎng)址下。 可用的選項(xiàng)有"http", "https" 或 "any"。 使用"any"意味著使用HTTP或HTTPS都可以。

    如果你的程序使用的不是HTTP或HTTPS的標(biāo)準(zhǔn)端口,你可以用下面的方式指定端口對(duì)應(yīng)關(guān)系:


    <http>
    ...
    <port-mappings>
    <port-mapping http="9080" https="9443"/>
    </port-mappings>
    </http>


    你可以在Chapter 7, Channel Security找到更詳細(xì)的討論。
    2.3.3. 同步Session控制

    如果你希望限制單個(gè)用戶只能登錄到你的程序一次,Spring Security通過添加下面簡單的部分支持這個(gè)功能。 首先,你需要把下面的監(jiān)聽器添加到你的web.xml文件里,讓Spring Security獲得session生存周期事件:


    <listener>
    <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
    </listener>

    然后,在你的application context加入如下部分:

    <http>
    ...
    <concurrent-session-control max-sessions="1" />
    </http>


    這將防止一個(gè)用戶重復(fù)登錄好幾次-第二次登錄會(huì)讓第一次登錄失效。 通常我們更想防止第二次登錄,這時(shí)候我們可以使用

    <http>
    ...
    <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true"/>
    </http>


    第二次登錄將被阻止。
    2.3.4. OpenID登錄

    命名空間支持OpenID登錄,替代普通的表單登錄,或作為一種附加功能,只需要進(jìn)行簡單的修改:

    <http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <openid-login />
    </http>


    你應(yīng)該注冊(cè)一個(gè)OpenID供應(yīng)器(比如myopenid.com),然后把用戶信息添加到你的內(nèi)存<user-service>中:

    <user name="http://jimi.hendrix.myopenid.com/" password="notused" authorities="ROLE_USER" />


    你應(yīng)該可以使用myopenid.com網(wǎng)站登錄來進(jìn)行驗(yàn)證了。
    2.3.5. 添加你自己的filter

    如果你以前使用過Spring Security,你應(yīng)該知道這個(gè)框架里維護(hù)了一個(gè)過濾器鏈,來提供它的服務(wù)。 你也許想把你自己的過濾器添加到鏈條的特定位置,或者讓已存在的過濾器,使用特定的版本。 你如何在命名空間配置里實(shí)現(xiàn)這些功能呢?過濾器鏈現(xiàn)在已經(jīng)不能之間看到了。

    過濾器順序在使用命名空間的時(shí)候是被嚴(yán)格執(zhí)行的。 每個(gè)Spring Security過濾器都實(shí)現(xiàn)了Spring的Ordered接口,這些過濾器在初始化的時(shí)候先被排好序了。 標(biāo)準(zhǔn)的過濾器在命名空間里都有自己的假名:

    Table 2.1. 標(biāo)準(zhǔn)過濾器假名和順序
    Alias Filter Class
    CHANNEL_FILTER ChannelProcessingFilter
    CONCURRENT_SESSION_FILTER ConcurrentSessionFilter
    SESSION_CONTEXT_INTEGRATION_FILTER HttpSessionContextIntegrationFilter
    LOGOUT_FILTER LogoutFilter
    X509_FILTER X509PreAuthenticatedProcessigFilter
    PRE_AUTH_FILTER Subclass of AstractPreAuthenticatedProcessingFilter
    CAS_PROCESSING_FILTER CasProcessingFilter
    AUTHENTICATION_PROCESSING_FILTER AuthenticationProcessingFilter
    BASIC_PROCESSING_FILTER BasicProcessingFilter
    SERVLET_API_SUPPORT_FILTER classname
    REMEMBER_ME_FILTER RememberMeProcessingFilter
    ANONYMOUS_FILTER AnonymousProcessingFilter
    EXCEPTION_TRANSLATION_FILTER ExceptionTranslationFilter
    NTLM_FILTER NtlmProcessingFilter
    FILTER_SECURITY_INTERCEPTOR FilterSecurityInterceptor
    SWITCH_USER_FILTER SwitchUserProcessingFilter


    你可以把你自己的過濾器添加到隊(duì)列中,使用custom-filter元素,使用這些名字中的一個(gè),來指定你的過濾器應(yīng)該出現(xiàn)的位置:

    <beans:bean id="myFilter" class="com.mycompany.MySpecialAuthenticationFilter">
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/>
    </beans:bean>


    你還可以使用after 或 before屬性,如果你想把你的過濾器添加到隊(duì)列中另一個(gè)過濾器的前面或后面。可以使用"FIRST" 或 "LAST"來指定你想讓你的過濾器分別出現(xiàn)在隊(duì)列元素的前面或后面。
    2.3.6. 防止Session固定攻擊

    Session固定攻擊是一個(gè)潛在危險(xiǎn),當(dāng)一個(gè)惡意攻擊者可以創(chuàng)建一個(gè)session訪問一個(gè)網(wǎng)站的時(shí)候,然后說服另一個(gè)用戶登錄到同一個(gè)會(huì)話上(比如,發(fā)送給他們一個(gè)包含了session標(biāo)識(shí)參數(shù)的鏈接)。 Spring Security通過在用戶登錄時(shí),創(chuàng)建一個(gè)新session來防止這個(gè)問題。 如果你不需要保護(hù),或者它與其他一些需求沖突,你可以通過使用<http>中的session-fixation-protection屬性來配置它的行為,它有三個(gè)選項(xiàng)

    *

    migrateSession - 創(chuàng)建一個(gè)新session,把原來session中所有屬性復(fù)制到新session中。這是默認(rèn)值。
    *

    none - 什么也不做,繼續(xù)使用原來的session。
    *

    newSession - 創(chuàng)建一個(gè)新的“干凈的”session,不會(huì)復(fù)制session中的數(shù)據(jù)。

    2.3.7. 設(shè)置自定義AuthenticationEntryPoint

    如果你不使用命名空間里的表單登錄,OpenID或基本身份驗(yàn)證,你也許想定義個(gè)驗(yàn)證過濾器和入口點(diǎn),使用傳統(tǒng)的bean語法,把他們鏈接到命名空間里。 你可以像Section 2.3.5, “添加你自己的filter”里解釋的那樣,添加過濾器。 對(duì)應(yīng)的AuthenticationEntryPoint可以使用<http>中的entry-point-ref進(jìn)行設(shè)置。

    CAS例子,是一個(gè)在命名空間里使用自定義bean的好例子,包括這個(gè)語法。如果你不熟悉驗(yàn)證入口點(diǎn),可以看看技術(shù)縱覽章節(jié)中的討論。
    2.4. 保護(hù)方法

    Spring Security 2.0大幅改善了對(duì)你的服務(wù)層方法添加安全。 如果你使用Java 5或更高版本,還支持JSR-250的安全注解,同框架提供的@secured注解相似。 你可以為單個(gè)bean提供安全控制,通過使用intercept-methods元素裝飾bean聲明,或者你可以使用AspectJ方式的切點(diǎn)來控制實(shí)體服務(wù)層里的多個(gè)bean。
    2.4.1. <global-method-security>元素

    這個(gè)元素用來在你的應(yīng)用程序中啟用基于安全的注解(通過在這個(gè)元素中設(shè)置響應(yīng)的屬性),也可以用來聲明將要應(yīng)用在你的實(shí)體application context中的安全切點(diǎn)組。 你應(yīng)該只定義一個(gè)<global-method-security>元素。 下面的聲明同時(shí)啟用兩種類型的注解:

    <global-method-security secured-annotations="enabled" jsr250-annotations="enabled"/>


    2.4.1.1. 使用protect-pointcut添加安全切點(diǎn)

    protect-pointcut是非常強(qiáng)大的,它讓你可以用簡單的聲明對(duì)多個(gè)bean的進(jìn)行安全聲明。 參考下面的例子:

    <global-method-security>
    <protect-pointcut expression="execution(* com.mycompany.*Service.*(..))" access="ROLE_USER"/>
    </global-method-security>



    這樣會(huì)保護(hù)application context中的符合條件的bean的所有方法,這些bean要在com.mycompany包下,類名以"Service"結(jié)尾。 ROLE_USER的角色才能調(diào)用這些方法。 就像URL匹配一樣,指定的匹配要放在切點(diǎn)隊(duì)列的最前面,第一個(gè)匹配的表達(dá)式才會(huì)被用到。
    2.5. 默認(rèn)的AccessDecisionManager

    這章假設(shè)你有一些Spring Security權(quán)限控制有關(guān)的架構(gòu)知識(shí)。 如果沒有,你可以跳過這段,以后再來看,因?yàn)檫@章只是為了自定義的用戶設(shè)置的,需要在簡單基于角色安全的基礎(chǔ)上加一些客戶化的東西。

    當(dāng)你使用命名空間配置時(shí),默認(rèn)的AccessDecisionManager實(shí)例會(huì)自動(dòng)注冊(cè),然后用來為方法調(diào)用和web URL訪問做驗(yàn)證,這些都是基于你設(shè)置的intercept-url和protect-pointcut權(quán)限屬性內(nèi)容(和注解中的內(nèi)容,如果你使用注解控制方法的權(quán)限)。

    默認(rèn)的策略是使用一個(gè)AffirmativeBased AccessDecisionManager ,以及RoleVoter 和AuthenticatedVoter。
    2.5.1. 自定義AccessDecisionManager

    如果你需要使用一個(gè)更復(fù)雜的訪問控制策略,把它設(shè)置給方法和web安全是很簡單的。

    對(duì)于方法安全,你可以設(shè)置global-security里的access-decision-manager-ref屬性,用對(duì)應(yīng) AccessDecisionManager bean在application context里的id:

    <global-method-security access-decision-manager-ref="myAccessDecisionManagerBean">
    ...
    </global-method-security>


    web安全安全的語法也是一樣,但是放在http元素里:

    <http access-decision-manager-ref="myAccessDecisionManagerBean">
    ...
    </http>


    2.5.2. 驗(yàn)證管理器

    我們大概知道命名空間配置會(huì)自動(dòng)為我們注冊(cè)一個(gè)驗(yàn)證管理器bean。 這是一個(gè)Spring Security的ProviderManager類,如果你以前使用過框架,應(yīng)該對(duì)它很熟悉了。

    你也許想為ProviderManager注冊(cè)另外的AuthenticationProvider bean,你可以使用<custom-authentication-provider>元素實(shí)現(xiàn)。比如:

    <bean id="casAuthenticationProvider"
    class="org.springframework.security.providers.cas.CasAuthenticationProvider">
    <security:custom-authentication-provider />
    ...
    </bean>


    另一個(gè)常見的需求是,上下文中的另一個(gè)bean可能需要引用AuthenticationManager。 這里有一個(gè)特殊的元素,可以讓你為AuthenticationManager注冊(cè)一個(gè)別名,然后你可以application context的其他地方使用這個(gè)名字。

    <security:authentication-manager alias="authenticationManager"/>

    <bean id="casProcessingFilter" class="org.springframework.security.ui.cas.CasProcessingFilter">
    <security:custom-filter position="CAS_PROCESSING_FILTER"/>
    <property name="authenticationManager" ref="authenticationManager"/>
    ...
    </bean>
    第三章 簡單的應(yīng)用
        這幾個(gè)網(wǎng)絡(luò)應(yīng)用程序在項(xiàng)目中是可用的。為了避免大負(fù)荷的下載,僅僅“指南”和“連接”例子包含在發(fā)行文件中。你也可以自行生成其它例子的項(xiàng)目文件,或者你也可以通過MAVEN倉庫獲取war文件。正如入門文檔所描述的那樣,你可以獲得源代碼并很容易的利用maven編譯和部署它。
        3.1. 指南的例子
        指南的例子是個(gè)不錯(cuò)的入門級(jí)應(yīng)用。它將簡單的命名空間進(jìn)行配置貫徹始終.
        關(guān)于運(yùn)行環(huán)境就不多說了,JDK1.4以上版本包含1.4.
        讓我們深入的了解一下spring security里面的共享組組件吧
        1.SecurityContextHolder,SecurityContext和Authentication對(duì)象,這里面最基本的對(duì)象是SecurityContextHolder. 這里將存儲(chǔ)應(yīng)用程序的安全細(xì)節(jié)包括當(dāng)前應(yīng)用程序使用的principal細(xì)節(jié),默認(rèn)的SecurityContextHolder是以本地線程進(jìn)行存儲(chǔ)細(xì)節(jié)的,這意味著在同一線程中安全上下文對(duì)方法總是可用的,即使安全上下文并不是明確的將請(qǐng)求分發(fā)給各個(gè)方法,使用本地線程對(duì)于principal的請(qǐng)求被處理時(shí)是非常安全的,當(dāng)轉(zhuǎn)移請(qǐng)求的時(shí)候。當(dāng)然,spring security會(huì)自動(dòng)幫你保管所以你也無需擔(dān)心。有些應(yīng)用程序卻并不適合使用本地線程,因?yàn)樗鼈円蕴厥獾木€程方式運(yùn)行。比如一個(gè)SWING的客戶端程序需要JAVA虛擬機(jī)所有線程共用一個(gè)安全上下文。在這種情況下你需要使用SecurityContextHolder.MODE_GLOBAL。其它程序也希望由相同的安全標(biāo)識(shí)線程產(chǎn)生其它線程,可以用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL來實(shí)現(xiàn)上述要求。你有兩種方式來改變默認(rèn)的SecurityContextHolder.MODE_THREADLOCAL 模式。第一種是設(shè)置系統(tǒng)屬性,作為選擇可在SecurityContextHolder中調(diào)用一個(gè)靜態(tài)方法。絕大多數(shù)的應(yīng)用程序不需要改變,如果你想改變請(qǐng)?jiān)贘AVADOC中獲取更多的內(nèi)容。
        在SecurityContextHolder內(nèi)部我們存儲(chǔ)的當(dāng)前principal細(xì)節(jié)與應(yīng)用程序相結(jié)合,Spring Security使用一個(gè)Authentication對(duì)象去描述這些信息,同時(shí)你也不需要自己在去創(chuàng)建一個(gè)Authentication對(duì)象了,Spring Securtity為每一個(gè)用戶都提供Authentication對(duì)象查詢,你可以使用以下的程序代碼塊----在你程序的任何地方。
    Object obj = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    if (obj instanceof UserDetails) {
    String username 
    = ((UserDetails)obj).getUsername();
    }
     else {
    String username 
    = obj.toString();
    }
    上面的代碼介紹了許多有趣的關(guān)系和鍵值對(duì)象,首先你將注意到在SecurityContextHolder 和Authentication之間有一個(gè)中間媒介,SecurityContextHolder.getContext()方法事實(shí)上返回一個(gè)SecurityContext。
        5.2.2. The UserDetailsService
        通過上面的代碼片段你可以從Authentication對(duì)象中獲得一個(gè)principal。principal也是一個(gè)對(duì)象,大多數(shù)情況你都能從UserDetails中得到它的映射。
    在Spring Security中UserDetails是一個(gè)重要的接口,它描述一個(gè)principal,在可擴(kuò)展的且特殊的應(yīng)用方式。你可以將UserDetails想象成一個(gè)適配器在你的數(shù)據(jù)庫與Spring Security內(nèi)部需要的 SecurityContextHolder之間。你完全可以在UserDetails中找到你應(yīng)用程序中提供的原始對(duì)象的映射,因此你可以調(diào)用諸如getEmail(), getEmployeeNumber()等等的業(yè)務(wù)邏輯方法。現(xiàn)在你可能感到奇怪,我在何時(shí)提供了一個(gè)UserDetails對(duì)象?我是怎么做到的?誰提供的?最簡短的解釋就是有一個(gè)叫UserDetailsService的接口,它僅僅只有一個(gè)方法接受String類型的username參數(shù)并返回一個(gè)UserDetails。大部分的認(rèn)證模塊都會(huì)委托給UserDetailsService成為認(rèn)證處理的一部分。UserDetailsService被用來構(gòu)建存儲(chǔ)在SecurityContextHolder里的Authentication對(duì)象。有個(gè)好消息是我們提供了許多UserDetailsService的實(shí)現(xiàn),包括用于內(nèi)存處理和JDBC處理的實(shí)現(xiàn)。大多數(shù)用戶趨于實(shí)現(xiàn)他們自己的實(shí)現(xiàn),盡管,在DAO中僅僅是一些簡單的實(shí)現(xiàn)來描述雇傭者,客戶信息或者其它企業(yè)級(jí)應(yīng)用。
        5.2.3. GrantedAuthority
        除了principal以外,由Authentication 提供的另外一個(gè)非常重要的方法就是getAuthorities( ),這個(gè)方法提供一個(gè)GrantedAuthority對(duì)象數(shù)組,一個(gè)GrantedAuthority是由principal準(zhǔn)許的一個(gè)授權(quán),通常這些授權(quán)是一些"角色",比如 ROLE_ADMINISTRATOR或者ROLE_HR_SUPERVISOR,這些角色稍后將配置于web授權(quán)、方法授權(quán)和業(yè)務(wù)邏輯對(duì)象授權(quán)。Spring Security的其它部分能夠解釋這些授權(quán),并將他們顯示出來。權(quán)限類通常由UserDetailsService加載!通常GrantedAuthority在大部分應(yīng)用程序中是允許的。但是他們并不是單獨(dú)的給特定的業(yè)務(wù)邏輯對(duì)象,因此,你不用給你的雇員業(yè)務(wù)邏輯對(duì)象單獨(dú)提供角色,假如這里有數(shù)以千計(jì)的授權(quán),你內(nèi)存會(huì)很快溢出的,或者說為你一個(gè)用戶授權(quán)要花費(fèi)很長的一段時(shí)間。
        當(dāng)然Spring Security為這些公共的需求特別設(shè)計(jì)了句柄,不過你最好使用你自己項(xiàng)目的對(duì)象安全容器去替代掉。有時(shí),你需要在HTTP請(qǐng)求間對(duì)SecurityContext進(jìn)行存儲(chǔ),其它時(shí)間principal會(huì)對(duì)每個(gè)請(qǐng)求重新認(rèn)證,盡管大多數(shù)情況下它是會(huì)被存儲(chǔ)的。HttpSessionContextIntegrationFilter將負(fù)責(zé)在HTTP請(qǐng)求間對(duì)一個(gè)SecurityContext進(jìn)行存儲(chǔ)。根據(jù)類型的名字,HttpSession 會(huì)存儲(chǔ)這些信息,你完全沒有必要使用HttpSession 存儲(chǔ)安全信息,通常都用SecurityContextHolder來代替。
        5.2.4. Summary
        Spring Security主要組件如下:
        1.SecurityContextHolder, 提供各種各樣的類型登錄SecurityContext
        2.SecurityContext,控制安全信息的請(qǐng)求認(rèn)證
        3.HttpSessionContextIntegrationFilter,在web請(qǐng)求間將SecurityContext存儲(chǔ)在HttpSession中
        4.Authentication,描述一個(gè)具有spring security風(fēng)格的principal
        5.GrantedAuthority,映射程序范圍內(nèi)許可的principal
        6.UserDetails,從你的應(yīng)用程序的DAOS中獲取有用的信息來構(gòu)建一個(gè)Authentication對(duì)象
        7.UserDetailsService,當(dāng)傳進(jìn)一個(gè)string類型的username時(shí)創(chuàng)建一個(gè)UserDetails.
        5.3. Authentication
        一個(gè)典型的網(wǎng)絡(luò)應(yīng)用認(rèn)證處理
        1.你訪問一個(gè)主頁,然后點(diǎn)擊一個(gè)鏈接。
        2.服務(wù)器收到一個(gè)請(qǐng)求,確定你訪問了一個(gè)被保護(hù)的請(qǐng)求。
        3.如果你沒有被認(rèn)證,服務(wù)器端會(huì)返回一個(gè)指示請(qǐng)求要求你認(rèn)證。請(qǐng)求可以是一個(gè)HTTP請(qǐng)求代碼,也可以是一個(gè)重定向的頁面。
        4.依賴認(rèn)證機(jī)制,你的瀏覽器也會(huì)重導(dǎo)向到特定頁面,所以你可以填寫表單,或者瀏覽器以各種方式找回你的唯一標(biāo)識(shí)。
        5.瀏覽器回回傳一個(gè)請(qǐng)求給服務(wù)器,可能是個(gè)POST請(qǐng)求包含你填寫的表單內(nèi)容,或者一個(gè)HTTP頭包含你的認(rèn)證細(xì)節(jié)。
        6.服務(wù)器端將會(huì)判斷發(fā)送過來的認(rèn)證信息是否有效,如果有效,下一步將會(huì)啟動(dòng)。如果無效,你的瀏覽器將會(huì)再次詢問(回到第三步)
        7.如果你有訪問權(quán)限將能夠訪問相應(yīng)的資源,否則將會(huì)返回一個(gè)403錯(cuò)誤。
    5.3.1. ExceptionTranslationFilter
        ExceptionTranslationFilter是一個(gè)spring security 過濾器,它負(fù)責(zé)檢測(cè)所有spring secutrity所拋出的異常,這些異常通常由主要為認(rèn)證服務(wù)的AbstractSecurityInterceptor拋出,我們將在下一部分討論AbstractSecurityInterceptor。但是現(xiàn)在我們需要知道它產(chǎn)生JAVA錯(cuò)誤,并不知道HTTP的內(nèi)容和如何去驗(yàn)證一個(gè)principal,代替ExceptionTranslationFilter提供這些服務(wù),并負(fù)責(zé)返回403的錯(cuò)誤代碼(如果principal已經(jīng)被認(rèn)證而且缺乏足夠的登錄按照上述步驟7)或者登錄一個(gè)AuthenticationEntryPoint(如果principal沒有被認(rèn)證因此我們需要返回第三步)。
    5.3.2. AuthenticationEntryPoint
        AuthenticationEntryPoint 負(fù)責(zé)上述步驟的第三步,你可以想象,每個(gè)網(wǎng)絡(luò)應(yīng)用程序都將會(huì)有個(gè)默認(rèn)的認(rèn)證策略,每個(gè)主要的認(rèn)證系統(tǒng)都將有它自己的AuthenticationEntryPoint實(shí)現(xiàn),他們用來描述步驟3中的動(dòng)作,在你的瀏覽器決定提交你的認(rèn)證證書后,這需要服務(wù)器端需要一些類似于收集這些認(rèn)證的細(xì)節(jié)的東西。現(xiàn)在我們已經(jīng)到了第六步了。在Spring Security中有一個(gè)專用名為從用戶參數(shù)收集認(rèn)證細(xì)節(jié)的函數(shù),那個(gè)名字就是authentication mechanism。從用戶參數(shù)中獲得相應(yīng)的認(rèn)證細(xì)節(jié)以后,一個(gè)認(rèn)證請(qǐng)求對(duì)象被構(gòu)建,然后將會(huì)指向一個(gè)AuthenticationProvider。
    5.3.3. AuthenticationProvider
       歡迎到http://www.tutu6.com來看看



    posted on 2008-07-05 02:15 Cloud kensin 閱讀(6633) 評(píng)論(6)  編輯  收藏 所屬分類: Java

    評(píng)論

    # re: Spring Security 2.0學(xué)習(xí)筆記 2009-01-22 13:33 java游客

    寫的很詳細(xì)  回復(fù)  更多評(píng)論   

    # re: Spring Security 2.0學(xué)習(xí)筆記 2009-04-30 15:38 sfsd

    這是COPY文檔上的內(nèi)容嘛  回復(fù)  更多評(píng)論   

    # re: Spring Security 2.0學(xué)習(xí)筆記 2009-05-04 09:39 Cloud kensin

    @sfsd
    是文檔上面的啦,不過我看的時(shí)候是英文,所以自己翻譯了看到的那些而已  回復(fù)  更多評(píng)論   

    # re: Spring Security 2.0學(xué)習(xí)筆記 2010-09-03 13:49 prosper

    很好,謝謝  回復(fù)  更多評(píng)論   

    # re: Spring Security 2.0學(xué)習(xí)筆記 2010-09-03 23:45 disget

    跟中文文檔一字不差還好意思說是自己翻譯的……真惡心著  回復(fù)  更多評(píng)論   

    # re: Spring Security 2.0學(xué)習(xí)筆記[未登錄] 2011-07-13 10:09 三毛

    @disget
    或許是人家英文好呢!何必這樣激動(dòng)呢。可以選擇不來看嘛!  回復(fù)  更多評(píng)論   

    <2011年7月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(4)

    隨筆分類

    相冊(cè)

    相冊(cè)

    搜索

    最新評(píng)論

    主站蜘蛛池模板: a毛看片免费观看视频| 亚洲色婷婷综合久久| 久久久久久夜精品精品免费啦| 亚洲日本在线免费观看| 阿v视频免费在线观看| 国产AV旡码专区亚洲AV苍井空| 五月婷婷在线免费观看| 91视频精品全国免费观看| 美女黄色免费网站| 亚洲无mate20pro麻豆| 亚洲色偷偷偷网站色偷一区| 国产成人亚洲精品狼色在线| 在线永久免费观看黄网站| 日韩版码免费福利视频| 亚洲毛片免费观看| 亚洲免费视频播放| 久久九九兔免费精品6| 1000部免费啪啪十八未年禁止观看 | 国产精品V亚洲精品V日韩精品| 中文字幕成人免费高清在线| 亚洲av无码专区在线观看下载| 久久久久久亚洲精品不卡| 免费a级毛片无码a∨性按摩| 日韩免费毛片视频| 日韩中文字幕免费| 国产精品另类激情久久久免费 | 免费一级毛片清高播放| 日韩视频免费在线| 欧洲美熟女乱又伦免费视频| 一个人看的www在线观看免费| 国产免费一区二区三区免费视频| 亚洲视频在线观看视频| 亚洲天堂一区二区三区| 亚洲人成网站影音先锋播放| 亚洲精品在线观看视频| 亚洲色av性色在线观无码| 本道天堂成在人线av无码免费| 91精品国产亚洲爽啪在线影院| 日韩精品视频免费在线观看| 国产免费av片在线播放| 免费jlzzjlzz在线播放视频|