Spring Security初體驗

初體驗,從天開始研究一下Spring Security這個權限框架。

第一個簡單的Demo實現:

1、創建Web Project;

2、在src目錄下創建applicationContext.xml文件;

3、創建三個JSP頁面:分別爲admin.jsp、user.jsp、index.jsp;

4、加入實現Spring Security所依賴的jar文件,可以將源碼包中

     例子(spring-security-samples-tutorial-3.0.3.RELEASE.war )

     的所有jar文件扔到你的工程中;

5、修改你的web.xml文件;

 

下面爲個文件的內容:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	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-3.0.xsd
                        http://www.springframework.org/schema/security 
                        http://www.springframework.org/schema/security/spring-security-3.0.xsd">

	<http auto-config='true'>
		<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
		<intercept-url pattern="/**" access="ROLE_USER" />
	</http>
	<authentication-manager>
		<authentication-provider>
			<user-service>
				<user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
				<user name="user" password="user" authorities="ROLE_USER" />
			</user-service>
		</authentication-provider>
	</authentication-manager>
</beans:beans>

 

admin.jsp

<%@ page language="java" pageEncoding="utf-8"%>
<html>
  <head>
    <title>admin</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body>
    這個是我的admin.jsp
  </body>
</html>

 

user.jsp

<%@ page language="java" pageEncoding="utf-8"%>
<html>
  <head>
    <title>user</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body>
    這個是我的user.jsp頁面
  </body>
</html>

 

index.jsp

<%@ page language="java" pageEncoding="utf-8"%>
<html>
  <head>
    <title>index</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body>
    <ul>
        <li><a href="user.jsp">user.jsp</a></li>
        <li><a href="admin.jsp">admin.jsp</a></li>
        <li><a href="j_spring_security_logout">註銷</a></li>
    </ul>
  </body>
</html>

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.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>

 

     啓動服務,分別用admin,admin;user,user 進行登錄,查看效果。admin可以訪問三個頁面index.jsp、user.jsp和admin.jsp。而user只可以訪問兩個頁面 index.jsp與user.jsp;原因很簡單,在applicationContext.xml 文件中我們創建了兩個用戶與兩個角色,admin擁有ROLE_ADMIN角色,user有ROLE_USER角色。不同的角色訪問的路徑資源是不同的ROLE_ADMIN可以訪問到admin.jsp頁面,而ROLE_USER可以訪問出admin.jsp以外的其他頁面。

 

     值得注意的是不同角色訪問不同路徑的定義方式,上面的定義方式是:

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

如果將他們的上下順序調換一下,意義就完全變了。ROLE_USER可以訪問所有的頁面。

 

 

Family168中有這樣的解釋:

http部分配置如何攔截用戶請求。auto-config='true'將自動配置幾種常用的權限控制機制,包括form, anonymous, rememberMe。
 
 
 我們利用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。

access指定的權限部分比較有趣,大家可以注意到這些權限標示符都是以ROLE_開頭的,實際上這與Spring Security中的Voter機制有着千絲萬縷的聯繫,只有包含了特定前綴的字符串纔會被Spring Security處理。目前來說我們只需要記住這一點就可以了,在教程以後的部分中我們會詳細講解Voter的內容。
 
 
 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允許訪問的資源。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章