今天我們就來學習spring security 的配置文件applicationContext-security.xml文件
----------------------3小時完成-----------------------------------
要做的事:學會在web.xml文件中配置,學會applicationContext-security.xml文件配置
1、掌握配置文件運行原理。
2、學會在web.xml文件中配置spring security文件。
3、學會applicationContext-security.xml文件中的配置標籤。
-------------------------------------------------------------------------
第一步,掌握配置文件運行原理。要知道配置文件是幹什麼用的,什麼時候被用到。在java框架中的配置文件,是初始化數據使用的。是在程序一開始就被用到。配置文件web.xml是被tomcat容器加載的,而tomcat就相當於一個代理類。applicationContext-security.xml是通過web.xml作爲入口初始化spring security的入口的。
第二步,學會在web.xml文件中配置spring security文件。這個配置文件就是applicationContext-security.xml。
首先,在web.xml配置中有以下配置
<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>
注意filter-name一定要寫成springSecurityFilterChain。在DelegatingFilterProxy類init時,會獲取filter-name,然後通過filter-name去spring中獲取代理的bean。DelegatingFilterProxy是代理授權過濾器。而spring-security的配置是由HttpSecurityBeanDefinitionParser解析器解析,每一個http都會被解析成一個SecurityFilterChain都添加到FilterChainProxy中的filterChains中。而且該FilterChainProxy會以springSecurityFilterChain註冊得到spring的bean中。
<http realm="Contacts Realm">
<intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/index.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/hello.htm" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/switchuser.jsp" access="ROLE_SUPERVISOR"/>
<intercept-url pattern="/j_spring_security_switch_user" access="ROLE_SUPERVISOR"/>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/>
<http-basic/>
<logout logout-success-url="/index.jsp"/>
<remember-me />
<custom-filter ref="switchUserProcessingFilter" position="SWITCH_USER_FILTER"/>
</http>
說明:
access後接用戶角色,IS_AUTHENTICATED_ANONYMOUSLY代表匿名登錄,ROLE_USER代表普通用戶,ROLE_SUPERVISOR代表超級管理員。
程序在啓動的時候會遍歷解析spring-security配置文件,當命名空間是<http>
的時候就使用HttpSecurityBeanDefinitionParser類來解析。
<!-- 靜態資源,不用權限 -->
<httppattern="/resources/**"security="none"/>
<httppattern="/verify/**"security="none"/>
<httppattern="/user/login.htm"security="none"/>
<httppattern="/user/register.*"security="none"/>
<httppattern="/favicon.ico"security="none"/>
當發現security="none"
的時候,則創建一個DefaultFilterChain添加到FilterChainProxy的filterChains屬性中。
----------------------------------------------------------------------------------------------------------------------------
最小<http>配置
只需要進行如下配置就可以配置成一個安全配置
<http auto-config='true'>
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
這表示,我們要保護應用程序中的所有URL,只有擁有ROLE_USER角色的用戶才能訪問。
<http
auto-config='true'>這一句其實是一些配置的縮寫:
<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login />
<anonymous />
<http-basic />
<logout />
<remember-me />
</http>
這些元素分別與form-login,匿名認證,註銷處理和remember-me對應。
auto-config需要一個UserDetailsService
使用auto-config的時候如果沒有配置UserDetailsService就會出現錯誤。這是因爲remember-me服務在auto-config="true"的時候啓動了,它的認證機制需要UserDetailsService來實現。
如果碰到報沒有定義UserDetailsService造成的問題,試着去掉auto-config配置。
下邊這些是標籤屬性說明:
配置說明:
lowercase-comparisons:表示URL比較前先轉爲小寫。
path-type:表示使用Apache Ant的匹配模式。
access-denied-page:訪問拒絕時轉向的頁面。
access-decision-manager-ref:指定了自定義的訪問策略管理器。當系統角色名的前綴不是默認的ROLE_時,需要自定義訪問策略管理器。
login-page:指定登錄頁面。
login-processing-url:指定了客戶在登錄頁面中按下 Sign In 按鈕時要訪問的 URL。與登錄頁面form的action一致。其默認值爲:/j_spring_security_check。
authentication-failure-url:指定了身份驗證失敗時跳轉到的頁面。
default-target-url:指定了成功進行身份驗證和授權後默認呈現給用戶的頁面。
always-use-default-target:指定了是否在身份驗證通過後總是跳轉到default-target-url屬性指定的URL。
logout-url:指定了用於響應退出系統請求的URL。其默認值爲:/j_spring_security_logout。
logout-success-url:退出系統後轉向的URL。
invalidate-session:指定在退出系統時是否要銷燬Session。
max-sessions:允許用戶帳號登錄的次數。範例限制用戶只能登錄一次。
exception-if-maximum-exceeded: 默認爲false,此值表示:用戶第二次登錄時,前一次的登錄信息都被清空。
當exception-if-maximum-exceeded="true"時系統會拒絕第二次登錄。