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

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

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

    tangtb

    Hadoop,SpringMVC,ExtJs,Struts2,Spring,SpringSecurity,Hibernate,Struts
    posts - 25, comments - 88, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Security命名空間配置

    2.1 介紹

        從Spring-2.0開始可以使用命名空間的配置方式。 使用它呢,可以通過附加xml架構,為傳統的spring beans應用環境語法做補充。 你可以在spring參考文檔得到更多信息。 命名空間元素可以簡單的配置單個bean,或使用更強大的,定義一個備用配置語法,這可以更加緊密的匹配問題域,隱藏用戶背后的復雜性。 簡單元素可能隱藏事實,多種bean和處理步驟添加到應用環境中。 比如,把下面的security命名元素添加到應用環境中,將會為測試用途,在應用內部啟動一個內嵌LDAP服務器:

    1 <security:ldap-server />

        這比配置一個Apache目錄服務器bean要簡單得多。 最常見的替代配置需求都可以使用ldap-server元素的屬性進行配置,這樣用戶就不用擔心他們需要設置什么,不用擔心bean里的各種屬性。 [1]。使用一個良好的XML編輯器來編輯應用環境文件,應該提供可用的屬性和元素信息。 我們推薦你嘗試一下 SpringSource工具套件 因為它具有處理spring組合命名空間的特殊功能。

        要開始在你的應用環境里使用security命名空間,你所需要的就是把架構聲明添加到你的應用環境文件里:
    1 <beans xmlns="http://www.springframework.org/schema/beans"
    2 xmlns:security="http://www.springframework.org/schema/security"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    5 http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">
    6 
    7 </beans>

        在許多例子里,你會看到(在示例中)應用,我們通常使用"security"作為默認的命名空間,而不是"beans",這意味著我們可以省略所有security命名空間元素的前綴,使上下文更容易閱讀。 如果你把應用上下文分割成單獨的文件,讓你的安全配置都放到其中一個文件里,這樣更容易使用這種配置方法。 你的安全應用上下文應該像這樣開頭

    1 <beans:beans xmlns="http://www.springframework.org/schema/security"
    2 xmlns:beans="http://www.springframework.org/schema/beans">
    3 
    4 </beans:beans>
     
    就在這一章里,我們都將假設使用這種語法。

    2.1.1 命名空間的設計

        命名空間被用來設計成,處理框架內最常見的功能,提供一個簡化和簡潔的語法,使他們在一個應用程序里。 這種設計是基于框架內的大型依賴,可以分割成下面這些部分:

    *
    Web/HTTP安全 - 最復雜的部分。設置過濾器和相關的服務bean來應用框架驗證機制, 保護URL,渲染登錄和錯誤頁面還有更多。
    *
    業務類(方法)安全 - 可選的安全服務層。
    *
    AuthenticationManager - 通過框架的其它部分,處理認證請求。
    *
    AccessDecisionManager - 提供訪問的決定,適用于web以及方法的安全。一個默認的主體會被注冊,但是你也可以選擇自定義一個,使用正常的spring bean語法進行聲明。
    *
    AuthenticationProviders - 驗證管理器驗證用戶的機制。 該命名空間提供幾種標準選項,意味著使用傳統語法添加自定義bean。
    *
    UserDetailsService - 密切相關的認證供應器,但往往也需要由其他bean需要。

    下一章中,我們將看到如何把這些放到一起工作。

    2.2. 開始使用安全命名空間配置

        在本節中,我們來看看如何使用一些框架里的主要配置,建立一個命名空間配置。 我們假設你最初想要盡快的啟動運行,為已有的web應用添加認證支持和權限控制,使用一些測試登錄。 然后我們看一下如何修改一下,使用數據庫或其他安全信息殘酷。 在以后的章節里我們將引入更多高級的命名空間配置選項。

    2.2.1 配置web.xml

        我們要做的第一件事是把下面的filter聲明添加到 web.xml 文件中:

    1 <filter>
    2 <filter-name>springSecurityFilterChain</filter-name>
    3 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    4 </filter>
    5 
    6 <filter-mapping>
    7 <filter-name>springSecurityFilterChain</filter-name>
    8 <url-pattern>/*</url-pattern>
    9 </filter-mapping>
     
        這為Spring Security提供了一個調用鉤子。 然后我們準備編輯application context文件。 web安全服務使用<http> 進行元素配置。

    2.2.2 最小 <http>配置

    只需要進行如下配置就可以實現安全配置:

    1 <http auto-config='true'>
    2 <intercept-url pattern="/**" access="ROLE_USER" />
    3 </http>

        這表示,我們要保護應用程序中的所有URL,只有擁有 ROLE_USER角色的用戶才能訪問。
    Note

        你可以使用多個<intercept-url>元素為不同URL的集合定義不同的訪問需求,它們會被歸入一個有序隊列中,每次取出最先匹配的一個元素使用。 所以你必須把期望使用的匹配條件放到最上邊。

        要是想添加一些用戶,你可以直接使用下面的命名空間直接定義一些測試數據:

    1 <authentication-provider>
    2 <user-service>
    3 <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
    4 <user name="bob" password="bobspassword" authorities="ROLE_USER" />
    5 </user-service>
    6 </authentication-provider>
     
        如果你熟悉以前的版本,你很可能已經猜到了這里是怎么回事。 <http>元素會創建一個FilterChainProxy和filter使用的bean。 以前常常出現的,因為filter順序不正確產生的問題,不會再出現了,現在這些過濾器的位置都是預定義好的。

        <authentication-provider>元素創建了一個DaoAuthenticationProvider bean,<user-service>元素創建了一個InMemoryDaoImpl。 一個ProviderManager bean通常是由命名空間過程系統創建的, DaoAuthenticationProvider自動注冊到它上面。

        上面的配置定義了兩個用戶,他們在應用程序中的密碼和角色(用在權限控制上)。 也可以從一個標準properties文件中讀取這些信息,使用user-service的properties屬性。 參考in-memory authentication獲得更多信息。 使用<authentication-provider>元素意味著用戶信息將被認證管理用作處理認證請求。

        現在,你可以啟動程序,然后就會進入登錄流程了。 試試這個,或者試試工程里的"tutorial"例子。 上述配置實際上把很多服務添加到了程序里,因為我們使用了auto-config屬性。 比如,表單登錄和"remember-me"服務自動啟動了。

    2.2.2.1 auto-config包含了什么?

        我們在上面用到的auto-config屬性,其實是下面這些配置的縮寫:

    1 <http>
    2 <intercept-url pattern="/**" access="ROLE_USER" />
    3 <form-login />
    4 <anonymous />
    5 <http-basic />
    6 <logout />
    7 <remember-me />
    8 </http>

        這些元素分別與form-login,匿名認證,基本認證,注銷處理和remember-me對應。 他們擁有各自的屬性,來改變他們的具體行為。
    auto-config需要一個UserDetailsService

        使用auto-config的時候如果沒配置UserDetailsService就會出現錯誤(比如,如果你使用了LDAP認證)。 這是因為remember-me服務在auto-config="true"的時候啟動了,它的認證機制需要UserDetailsService來實現(參考Remember-me章獲得更多信息)。 如果你遇到了一個因為沒定義UserDetailsService造成的問題,那就試著去掉auto-config配置(或者是其他你配置上的remember-me)。

    2.2.2.2 表單和基本登錄選項

        你也許想知道,在需要登錄的時候,去哪里找這個登錄頁面,到現在為止我們都沒有提到任何的HTML或JSP文件。 實際上,如果我們沒有確切的指定一個頁面用來登錄,Spring Security會自動生成一個,基于可用的功能,為這個URL使用標準的數據,處理提交的登錄,然后發送到默認的目標URL。 然而,命名空間提供了許多支持,讓你可以自定義這些選項。 比如,如果你想實現自己的登錄頁面,你可以使用:

    1 <http auto-config='true'>
    2 <intercept-url pattern="/login.jsp*" filters="none"/>
    3 <intercept-url pattern="/**" access="ROLE_USER" />
    4 <form-login login-page='/login.jsp'/>
    5 </http>
     
        注意,你依舊可以使用auto-config。 這個form-login元素會覆蓋默認的設置。 也要注意我們需要添加額外的intercept-url元素,指定用來做登錄的頁面的URL,這些URL不應該被安全filter處理。 否則,這些請求會被/**部分攔截,它沒法訪問到登錄頁面。 如果你想使用基本認證而不是表單登錄,可以把配置修改成如下所示:

    1 <http auto-config='true'>
    2 <intercept-url pattern="/**" access="ROLE_USER" />
    3 <http-basic />
    4 </http>

        基本身份認證會被優先用到,在用戶嘗試訪問一個受保護的資源時,用來提示用戶登錄。 在這種配置中,表單登錄依然是可用的,如果你還想用的話,比如,把一個登錄表單內嵌到其他頁面里。

    2.2.3 使用其他認證提供器

        現實中,你會需要更大型的用戶信息源,而不是寫在application context里的幾個名字。 多數情況下,你會想把用戶信息保存到數據庫或者是LDAP服務器里。 LDAP命名控件會在LDAP章里詳細討論,所以我們這里不會講它。 如果你自定義了一個Spring Security的UserDetailsService實現,在你的application context中名叫"myUserDetailsService",然后你可以使用下面的驗證。

    1 <authentication-provider user-service-ref='myUserDetailsService'/>
     
        如果你想用數據庫,可以使用下面的方式

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

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

    2.2.3.1 添加一個密碼編碼器

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

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

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

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

        你可以通過password-encoder的ref屬性,指定一個自定義的密碼編碼器bean。 這應該包含application context中一個bean的名字,它應該是Spring Security的PasswordEncoder接口的一個實例。

    2.3 高級web特性

    2.3.1 Remember-Me認證

        參考Remember-Me章獲得remember-me命名空間配置的詳細信息。

    2.3.2 添加HTTP/HTTPS信道安全

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

    1 <http>
    2 <intercept-url pattern="/secure/**" access="ROLE_USER" requires-channel="https"/>
    3 <intercept-url pattern="/**" access="ROLE_USER" requires-channel="any"/>
    4 
    5 </http>

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

        如果你的程序使用的不是HTTP或HTTPS的標準端口,你可以用下面的方式指定端口對應關系:

    1 <http>
    2 
    3 <port-mappings>
    4 <port-mapping http="9080" https="9443"/>
    5 </port-mappings>
    6 </http>

        你可以在Chapter 7, Channel Security找到更詳細的討論。

    2.3.3 同步Session控制

        如果你希望限制單個用戶只能登錄到你的程序一次,Spring Security通過添加下面簡單的部分支持這個功能。 首先,你需要把下面的監聽器添加到你的web.xml文件里,讓Spring Security獲得session生存周期事件:
    <listener>
    <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
    </listener>

        然后,在你的application context加入如下部分:
    1 
    2 <http>
    3 
    4 <concurrent-session-control max-sessions="1" />
    5 </http>

        這將防止一個用戶重復登錄好幾次-第二次登錄會讓第一次登錄失效。 通常我們更想防止第二次登錄,這時候我們可以使用

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

    第二次登錄將被阻止。

    2.3.4 OpenID登錄

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

    1 <http auto-config='true'>
    2 <intercept-url pattern="/**" access="ROLE_USER" />
    3 <openid-login />
    4 </http>
     
        你應該注冊一個OpenID供應器(比如myopenid.com),然后把用戶信息添加到你的內存<user-service>中:

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

        你應該可以使用myopenid.com網站登錄來進行驗證了。

    2.3.5 添加你自己的filter

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

        過濾器順序在使用命名空間的時候是被嚴格執行的。 每個Spring Security過濾器都實現了Spring的Ordered接口,這些過濾器在初始化的時候先被排好序了。 標準的過濾器在命名空間里都有自己的假名:

    Table 2.1 標準過濾器假名和順序



        你可以把你自己的過濾器添加到隊列中,使用custom-filter元素,使用這些名字中的一個,來指定你的過濾器應該出現的位置:

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

        你還可以使用after 或 before屬性,如果你想把你的過濾器添加到隊列中另一個過濾器的前面或后面。可以使用"FIRST" 或 "LAST"來指定你想讓你的過濾器分別出現在隊列元素的前面或后面。

    2.3.6 防止Session固定攻擊

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

    *
    migrateSession - 創建一個新session,把原來session中所有屬性復制到新session中。這是默認值。
    *
    none - 什么也不做,繼續使用原來的session。
    *
    newSession - 創建一個新的“干凈的”session,不會復制session中的數據。

    2.3.7 設置自定義AuthenticationEntryPoint

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

        CAS例子,是一個在命名空間里使用自定義bean的好例子,包括這個語法。如果你不熟悉驗證入口點,可以看看技術縱覽章節中的討論。

    2.4 保護方法

        Spring Security 2.0大幅改善了對你的服務層方法添加安全。 如果你使用Java 5或更高版本,還支持JSR-250的安全注解,同框架提供的@secured注解相似。 你可以為單個bean提供安全控制,通過使用intercept-methods元素裝飾bean聲明,或者你可以使用AspectJ方式的切點來控制實體服務層里的多個bean。

    2.4.1 <global-method-security>元素

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

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

    2.4.1.1 使用protect-pointcut添加安全切點

        protect-pointcut是非常強大的,它讓你可以用簡單的聲明對多個bean的進行安全聲明。 參考下面的例子:
    1 <global-method-security>
    2 <protect-pointcut expression="execution(* com.mycompany.*Service.*(..))" access="ROLE_USER"/>
    3 </global-method-security>

        這樣會保護application context中的符合條件的bean的所有方法,這些bean要在com.mycompany包下,類名以"Service"結尾。 ROLE_USER的角色才能調用這些方法。 就像URL匹配一樣,指定的匹配要放在切點隊列的最前面,第一個匹配的表達式才會被用到。

    2.5. 默認的AccessDecisionManager

        這章假設你有一些Spring Security權限控制有關的架構知識。 如果沒有,你可以跳過這段,以后再來看,因為這章只是為了自定義的用戶設置的,需要在簡單基于角色安全的基礎上加一些客戶化的東西。

        當你使用命名空間配置時,默認的AccessDecisionManager實例會自動注冊,然后用來為方法調用和web URL訪問做驗證,這些都是基于你設置的intercept-url和protect-pointcut權限屬性內容(和注解中的內容,如果你使用注解控制方法的權限)。

        默認的策略是使用一個AffirmativeBased AccessDecisionManager ,以及RoleVoter 和AuthenticatedVoter。

    2.5.1 自定義AccessDecisionManager

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

        對于方法安全,你可以設置global-security里的access-decision-manager-ref屬性,用對應 AccessDecisionManager bean在application context里的id:

    1 <global-method-security access-decision-manager-ref="myAccessDecisionManagerBean">
    2 
    3 </global-method-security>

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

    1 <http access-decision-manager-ref="myAccessDecisionManagerBean">
    2 
    3 </http>

    2.5.2 驗證管理器

        我們大概知道命名空間配置會自動為我們注冊一個驗證管理器bean。 這是一個Spring Security的ProviderManager類,如果你以前使用過框架,應該對它很熟悉了。

        你也許想為ProviderManager注冊另外的AuthenticationProvider bean,你可以使用<custom-authentication-provider>元素實現。比如:

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

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

    1 <security:authentication-manager alias="authenticationManager"/>
    2 
    3 <bean id="casProcessingFilter" class="org.springframework.security.ui.cas.CasProcessingFilter">
    4 <security:custom-filter position="CAS_PROCESSING_FILTER"/>
    5 <property name="authenticationManager" ref="authenticationManager"/>
    6 
    7 </bean>
     
    [1] 你可以在LDAP的章節里,找到更多有關使用的ldap-server的元素。
    轉自:http://www.javaeye.com/topic/196922
    相關鏈接:http://www.javaeye.com/forums/39/search?query=Spring+Security-2.0.x%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3%E7%9A%84
    主站蜘蛛池模板: 亚洲欧洲中文日韩久久AV乱码| 九九九精品成人免费视频| 99精品在线免费观看| 真人做人试看60分钟免费视频| 午夜色a大片在线观看免费| 免费特级黄毛片在线成人观看| 一本色道久久88亚洲综合 | 久久久久亚洲AV成人网人人软件| 亚洲乱码中文字幕综合| 久久亚洲日韩看片无码| 亚洲国产精品无码中文lv| 久久性生大片免费观看性| 国产成人精品免费视| 午夜国产羞羞视频免费网站| 日韩亚洲欧洲在线com91tv| 亚洲中文字幕在线无码一区二区| 美女露隐私全部免费直播| 日本高清高色视频免费| 免费看的一级毛片| 亚洲国产精品特色大片观看完整版| 亚洲喷奶水中文字幕电影 | 在线观看亚洲免费视频| 成全视频高清免费观看电视剧| 97在线观免费视频观看| 国产亚洲精aa成人网站| 中文字幕亚洲综合小综合在线| jizz18免费视频| 国产香蕉九九久久精品免费| 亚洲日韩小电影在线观看| 亚洲一卡2卡3卡4卡乱码 在线| 人妻免费久久久久久久了| 成人免费的性色视频| 亚洲婷婷国产精品电影人久久| 亚洲国产精品久久网午夜| 一区二区三区免费看| 在线看片免费不卡人成视频| 亚洲最大激情中文字幕| 亚洲AV一二三区成人影片| 91在线免费观看| 日本高清色本免费现在观看| 久久精品国产亚洲精品2020|