1. 程式人生 > 實用技巧 >Spring-Security 初窺1——閱讀

Spring-Security 初窺1——閱讀

>>> hot3.png

Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Control ,DI:Dependency Injection 依賴注入)和AOP(面向切面程式設計)功能,為應用系統提供宣告式的安全訪問控制功能,減少了為企業系統安全控制編寫大量重複程式碼的工作。

——以上摘自百度百科

在一開始,我們主要談談怎麼配置 Spring Security,怎麼使用Spring Security。這裡使用的spring-security是

spring-security-core-2.0.5的版本,應該是比較老的版本,但是作為了解一下spring-security還是可以的。

一、一個簡單的HelloWorld

Spring Security 中可以使用Acegi-1.x 時代的普通配置方式,也可以使用從2.0 時代才出現的名稱空間配置方式,實際上這兩者實現的功能是完全一致的,只是新的名稱空間配置方式可以把原來需要幾百行的配置壓縮成短短的幾十行。我們的教程中都會使用名稱空間的方式進行配置,凡事務求最簡。

1.配置過濾器

為了在專案中使用 Spring Security 控制權限,首先要在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>

所有的使用者在訪問專案之前,都要先通過Spring Security的檢測,這從第一時間把沒有授權的請求排除在系統之外,保證系統資源的安全。

2.在 applicationContext.xml 中使用Spring Security 提供的名稱空間進行配置

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security" ------------1

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/security

http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">

<http auto-config='true'> ---------------2

<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> ---------------3

<intercept-url pattern="/**" access="ROLE_USER" />

</http>

<authentication-provider>

<user-service>

<user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />---------------4

<user name="user" password="user" authorities="ROLE_USER" />

</user-service>

</authentication-provider>

</beans:beans>

其中 :

1:宣告在xml 中使用Spring Security 提供的名稱空間

2:http 部分配置如何攔截使用者請求。auto-config='true'將自動配置幾種常用的許可權控制機制,包括form, anonymous, rememberMe。

3:我們利用intercept-url 來判斷使用者需要具有何種許可權才能訪問對應的url資源,可以在pattern 中指定一個特定的url 資源,也可以使用萬用字元指定一組類似的url 資源。例子中定義的兩個intercepter-url,第一個用來控制對/admin.jsp 的訪問,第二個使用了萬用字元/**,說明它將控制對系統中所有url 資源的訪問。在實際使用中,Spring Security 採用的是一種就近原則,就是說當用戶訪問的url 資源滿足多個intercepter-url 時,系統將使用第一個符合條件的intercept-url 進行許可權控制。在我們這個例子中就是,當用戶訪問/admin.jsp 時,雖然兩個intercept-url 都滿足要求,但因為第一個intercept-url 排在上面,所以Spring Security 會使用第一個intercept-url 中的配置處理對/admin.jsp 的請求,也就是說,只有那些擁有了ROLE_ADMIN 許可權的使用者才能訪問/admin.jsp。

4:user-service 中定義了兩個使用者,admin 和user。為了簡便起見,我們使用明文定義了兩個使用者對應的密碼,這只是為 了當前演示的方便,之後的例子中我們會使用Spring Security 提供的加密方式,避免使用者密碼被他人竊取。最最重要的 部分是authorities,這裡定義了這個使用者登陸之後將會擁有的許可權,它與上面intercept-url 中定義的許可權內容一一對應。每個使用者可以同時擁有多個許可權,例子中的admin 使用者就擁有ROLE_ADMIN 和ROLE_USER兩種許可權,這使得admin 使用者在登陸之後可以訪問ROLE_ADMIN 和ROLE_USER允許訪問的所有資源。與之對應的是,user 使用者就只擁有ROLE_USER 許可權,所以他只能訪問ROLE_USER 允許訪問的資源,而不能訪問ROLE_ADMIN 允許訪問的資源。

因為 Spring Security 是建立在Spring 的基礎之上的,所以web.xml 中除了需要配置我們剛剛提到的過濾器,還要加上載入Spring 的相關配置。最終得到的web.xml看起來像是這樣:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext*.xml</param-value>

</context-param>

<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>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

</web-app>

演示不同許可權的使用者登陸之後可以訪問不同的資源,我們為專案添加了兩個jsp檔案,admin.jsp 和index.jsp。其中admin.jsp 只有那些擁有ROLE_ADMIN 許可權的使用者才能訪問,而index.jsp 只允許那些擁有ROLE_USER 許可權的使用者才能訪問。

最終我們的整個專案會變成下面這樣:

181423_Pz6U_2322416.jpg

等到專案啟動完成後。開啟瀏覽器訪問http://localhost:8080/ch001/就可以看到登陸頁面。

181734_480K_2322416.jpg

這個簡陋的頁面是 Spring Security 自動生成的,一來為了演示的方便,二來避免使用者自己編寫登陸頁面時犯錯,Spring Security 為了避免可能出現的風險,連測試用的登入頁面都自動生成出來了。在這裡我們就省去編寫登陸頁面的步驟,直接使用預設生成的登入頁面進行演示吧。首先讓我們輸入一個錯誤用的使用者名稱或密碼,這裡我們使用 test/test,當然這個使用者是不存在的,點選提交之後我們會得到這樣一個登陸錯誤提示頁面。

181920_QxtC_2322416.png

如果輸入的是正確的使用者名稱和密碼,比如user/user,系統在登陸成功後會預設跳轉到index.jsp。

181734_Mqfq_2322416.png

這時我們可以點選 admin.jsp 連結訪問admin.jsp,也可以點選logout 進行登出。很遺憾,user 使用者是無法訪問/admin.jsp 這個url 資源的,這在上面的配置檔案中已經有過深入的討論。我們在這裡再簡要重複一遍:user 使用者擁有ROLE_USER許可權,但是/admin.jsp 資源需要使用者擁有ROLE_ADMIN 許可權才能訪問,所以當user 使用者檢視訪問被保護的/admin.jsp 時,Spring Security 會在中途攔截這一請求,返回拒絕訪問頁面。為了正常訪問 admin.jsp,我們需要先點選logout 登出當前使用者,然後使用admin/admin 登陸系統,然後再次點選admin.jsp 連結就會顯示出admin.jsp 中的內容。

根據我們之前的配置,admin 使用者擁有ROLE_ADMIN 和ROLE_USER 兩個許可權,因為他擁有ROLE_USER 許可權,所以可以訪問/index.jsp,因為他擁有ROLE_ADMIN 許可權,所以他可以訪問/admin.jsp。


轉載於:https://my.oschina.net/guanhe/blog/607620