spring 的權限控制:security

下面我們將實現關於Spring Security3的一系列教程. 
最終的目標是整合Spring Security + Spring3MVC 
完成類似於SpringSide3中mini-web的功能. 

Spring Security是什麼? 

引用

Spring Security,這是一種基於Spring AOP和Servlet過濾器的安全框架。它提供全面的安全性解決方案,同時在Web請求級和方法調用級處理身份確認和授權。在Spring Framework基礎上,Spring Security充分利用了依賴注入(DI,Dependency Injection)和麪向切面技術。



關於Spring Security學習的資料. 
最重要,最齊全的中文資料當然是family168的中文文檔 
Spring Security2參考文檔 

Spring Security3 參考文檔 

附件包含了一個很好的初入門的PDF教程. 
最好是花30分鐘先照着PDF上的教程一步一步的操作. 
雖然沒有實際的應用價值,但對初學者認識SpringSecurity3很有幫助. 

我們的項目目錄結構最終是: 

1bdbc126-14db-3a48-bfb3-6eedca9c1fc7.png 


需要添加的jar包: 

cea111b5-ef8f-3179-a157-8818b300fd29.png 


我們先實現一個controller: 

MainController.java 

Java代碼  收藏代碼

  1. package org.liukai.tutorial.controller;  

  2.   

  3. import org.apache.log4j.Logger;  

  4. import org.springframework.stereotype.Controller;  

  5. import org.springframework.web.bind.annotation.RequestMapping;  

  6. import org.springframework.web.bind.annotation.RequestMethod;  

  7.   

  8. @Controller  

  9. @RequestMapping("/main")  

  10. public class MainController {  

  11.     protected static Logger logger = Logger.getLogger("controller");  

  12.   

  13.     /** 

  14.      * 跳轉到commonpage頁面 

  15.      *  

  16.      * @return 

  17.      */  

  18.     @RequestMapping(value = "/common", method = RequestMethod.GET)  

  19.     public String getCommonPage() {  

  20.         logger.debug("Received request to show common page");  

  21.         return "commonpage";  

  22.     }  

  23.   

  24.     /** 

  25.      * 跳轉到adminpage頁面 

  26.      *  

  27.      * @return 

  28.      */  

  29.     @RequestMapping(value = "/admin", method = RequestMethod.GET)  

  30.     public String getAadminPage() {  

  31.         logger.debug("Received request to show admin page");  

  32.         return "adminpage";  

  33.   

  34.     }  

  35.   

  36. }  



該controller有兩個mapping映射: 

引用

main/common 
main/admin



現在我們將同過Spring Security3框架實現成功登陸的人都能訪問到main/common. 
但只有擁有admin權限的用戶才能訪問main/admin. 


我們先在web.xml中開啓Spring3MVC和SpringSecurity3. 

web.xml 

Xml代碼  收藏代碼

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

  2. <web-app id="WebApp_ID" version="2.4"  

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

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

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

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

  7.       

  8.     <!-- SpringSecurity必須的filter -->  

  9.     <filter>  

  10.         <filter-name>springSecurityFilterChain</filter-name>  

  11.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  

  12.     </filter>  

  13.   

  14.     <filter-mapping>  

  15.         <filter-name>springSecurityFilterChain</filter-name>  

  16.         <url-pattern>/*</url-pattern>  

  17.     </filter-mapping>  

  18.   

  19.     <context-param>  

  20.         <param-name>contextConfigLocation</param-name>  

  21.         <param-value>  

  22.         /WEB-INF/spring-security.xml  

  23.         /WEB-INF/applicationContext.xml  

  24.         </param-value>  

  25.     </context-param>  

  26.   

  27.     <servlet>  

  28.         <servlet-name>spring</servlet-name>  

  29.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  

  30.         <load-on-startup>1</load-on-startup>  

  31.     </servlet>  

  32.   

  33.     <servlet-mapping>  

  34.         <servlet-name>spring</servlet-name>  

  35.         <url-pattern>/</url-pattern>  

  36.     </servlet-mapping>  

  37.   

  38.     <listener>  

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

  40.     </listener>  

  41.   

  42. </web-app>  



要啓用SpringSecurity3,我們需要完成以下兩步: 
1.在web.xml中聲明DelegatingFilterProxy. 

Xml代碼  收藏代碼

  1. <filter-mapping>  

  2.         <filter-name>springSecurityFilterChain</filter-name>  

  3.         <url-pattern>/*</url-pattern>  

  4.     </filter-mapping>  



表示項目中所有路徑的資源都要經過SpringSecurity. 

2.導入指定的SpringSecurity配置 :spring-security.xml 

關於spring-security.xml的配置. 
我們把這個放到後面配置.以便更詳細的講解. 

注意一點.最好是將DelegatingFilterProxy寫在DispatcherServlet之前.否則 
SpringSecurity可能不會正常工作.
 


在web.xml中我們定義servlet:spring. 
按照慣例,我們必須聲明一個spring-servle.xml 
spring-servle.xml 

Xml代碼  收藏代碼

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

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

  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  

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

  5.             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

  6.   

  7.     <!-- 定義一個視圖解析器 -->  

  8.     <bean id="viewResolver"  

  9.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"  

  10.         p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />  

  11.   

  12. </beans>  



這個XML配置聲明一個視圖解析器.在控制器中會根據JSP名映射到/ WEB-INF/jsp中相應的位置. 


然後創建一個applicationContext.xml. 

applicationContext.xml. 

Xml代碼  收藏代碼

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

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

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

  4.     xmlns:context="http://www.springframework.org/schema/context"  

  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  

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

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

  8.             http://www.springframework.org/schema/context  

  9.             http://www.springframework.org/schema/context/spring-context-3.0.xsd  

  10.             http://www.springframework.org/schema/mvc   

  11.             http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  

  12.   

  13.     <!-- 激活spring的註解. -->  

  14.     <context:annotation-config />  

  15.   

  16.     <!-- 掃描註解組件並且自動的注入spring beans中.   

  17.     例如,他會掃描@Controller 和@Service下的文件.所以確保此base-package設置正確. -->  

  18.     <context:component-scan base-package="org.liukai.tutorial" />  

  19.   

  20.     <!-- 配置註解驅動的Spring MVC Controller 的編程模型.注:次標籤只在 Servlet MVC工作! -->  

  21.     <mvc:annotation-driven />  

  22.   

  23. </beans>  






接着是創建JSP頁面 

commonpage.jsp 

Jsp代碼  收藏代碼

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  

  2.     pageEncoding="UTF-8"%>  

  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  

  4. <html>  

  5. <head>  

  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

  7. <title>Insert title here</title>  

  8. </head>  

  9. <body>  

  10.     <h1>Common Page</h1>  

  11.     <p>每個人都能訪問的頁面.</p>  

  12.     <a href="/spring3-security-integration/main/admin"> Go AdminPage </a>  

  13.     <br />  

  14.     <a href="/spring3-security-integration/auth/login">退出登錄</a>  

  15.   

  16. </body>  

  17. </html>  




adminpage.jsp 

Jsp代碼  收藏代碼

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  

  2.     pageEncoding="UTF-8"%>  

  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  

  4. <html>  

  5. <head>  

  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

  7. <title>Insert title here</title>  

  8. </head>  

  9. <body>  

  10.     <h1>Admin Page</h1>  

  11.     <p>管理員頁面</p>  

  12.     <a href="/spring3-security-integration/auth/login">退出登錄</a>  

  13. </body>  

  14. </html>  



這兩個JSP對應着 

0d59b3d5-9ebe-37f6-b34d-e0f7ad666847.png 


7fc72a65-9c4e-3118-844d-7037bfbef3a0.png 


當然還有登陸頁面和拒絕訪問頁面 

228714e0-1212-3d70-b723-667a34ad97ba.png 


268fc009-b29e-3f05-afd0-d817f4a1b650.png 

loginpage.jsp 

Jsp代碼  收藏代碼

  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  

  2. <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>  

  3. <%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>  

  4.   

  5. <%@ page language="java" contentType="text/html; charset=UTF-8"  

  6.     pageEncoding="UTF-8"%>  

  7. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  

  8. <html>  

  9. <head>  

  10. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

  11. <title>Insert title here</title>  

  12. </head>  

  13. <body>  

  14.   

  15.     <h1>Login</h1>  

  16.   

  17.     <div id="login-error">${error}</div>  

  18.   

  19.     <form action="../j_spring_security_check" method="post">  

  20.   

  21.         <p>  

  22.             <label for="j_username">Username</label> <input id="j_username"  

  23.                 name="j_username" type="text" />  

  24.         </p>  

  25.   

  26.         <p>  

  27.             <label for="j_password">Password</label> <input id="j_password"  

  28.                 name="j_password" type="password" />  

  29.         </p>  

  30.   

  31.         <input type="submit" value="Login" />  

  32.   

  33.     </form>  

  34.   

  35. </body>  

  36. </html>  




deniedpage.jsp 

Jsp代碼  收藏代碼

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  

  2.     pageEncoding="UTF-8"%>  

  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  

  4. <html>  

  5. <head>  

  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

  7. <title>Insert title here</title>  

  8. </head>  

  9. <body>  

  10.     <h1>你的權限不夠!</h1>  

  11.     <p>只有擁有Admin權限才能訪問!</p>  

  12.     <a href="/spring3-security-integration/auth/login">退出登錄</a>  

  13. </body>  

  14. </html>  




還有一個controller用於映射上面兩個JSP頁面.. 

LoginLogoutController.java
 

Java代碼  收藏代碼

  1. package org.liukai.tutorial.controller;  

  2.   

  3. import org.apache.log4j.Logger;  

  4. import org.springframework.stereotype.Controller;  

  5. import org.springframework.ui.ModelMap;  

  6. import org.springframework.web.bind.annotation.RequestMapping;  

  7. import org.springframework.web.bind.annotation.RequestMethod;  

  8. import org.springframework.web.bind.annotation.RequestParam;  

  9.   

  10. @Controller  

  11. @RequestMapping("auth")  

  12. public class LoginLogoutController {  

  13.   

  14.     protected static Logger logger = Logger.getLogger("controller");  

  15.   

  16.     /** 

  17.      * 指向登錄頁面 

  18.      */  

  19.     @RequestMapping(value = "/login", method = RequestMethod.GET)  

  20.     public String getLoginPage(  

  21.             @RequestParam(value = "error", required = falseboolean error,  

  22.             ModelMap model) {  

  23.   

  24.         logger.debug("Received request to show login page");  

  25.   

  26.         if (error == true) {  

  27.             // Assign an error message  

  28.             model.put("error",  

  29.                     "You have entered an invalid username or password!");  

  30.         } else {  

  31.             model.put("error""");  

  32.         }  

  33.         return "loginpage";  

  34.   

  35.     }  

  36.   

  37.     /** 

  38.      * 指定無訪問額權限頁面 

  39.      *  

  40.      * @return 

  41.      */  

  42.     @RequestMapping(value = "/denied", method = RequestMethod.GET)  

  43.     public String getDeniedPage() {  

  44.   

  45.         logger.debug("Received request to show denied page");  

  46.   

  47.         return "deniedpage";  

  48.   

  49.     }  

  50. }  



該controller實現了兩個映射 

引用

auth/login     --顯示Login頁面 
auth/denied    --顯示拒絕訪問頁面




最後,讓我們看看spring-security.xml的配置 

spring-security.xml 

Xml代碼  收藏代碼

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

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

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

  4.     xmlns:security="http://www.springframework.org/schema/security"  

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

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

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

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

  9.       

  10.     <!--  Spring-Security 的配置 -->  

  11.     <!-- 注意開啓use-expressions.表示開啓表達式.  

  12.     see:http://www.family168.com/tutorial/springsecurity3/html/el-access.html  

  13.      -->  

  14.     <security:http auto-config="true" use-expressions="true" access-denied-page="/auth/denied" >  

  15.           

  16.         <security:intercept-url pattern="/auth/login" access="permitAll"/>  

  17.         <security:intercept-url pattern="/main/admin" access="hasRole('ROLE_ADMIN')"/>  

  18.         <security:intercept-url pattern="/main/common" access="hasRole('ROLE_USER')"/>  

  19.           

  20.         <security:form-login  

  21.                 login-page="/auth/login"   

  22.                 authentication-failure-url="/auth/login?error=true"   

  23.                 default-target-url="/main/common"/>  

  24.               

  25.         <security:logout   

  26.                 invalidate-session="true"   

  27.                 logout-success-url="/auth/login"   

  28.                 logout-url="/auth/logout"/>  

  29.       

  30.     </security:http>  

  31.       

  32.     <!-- 指定一個自定義的authentication-manager :customUserDetailsService -->  

  33.     <security:authentication-manager>  

  34.             <security:authentication-provider user-service-ref="customUserDetailsService">  

  35.                     <security:password-encoder ref="passwordEncoder"/>  

  36.             </security:authentication-provider>  

  37.     </security:authentication-manager>  

  38.       

  39.     <!-- 對密碼進行MD5編碼 -->  

  40.     <bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" id="passwordEncoder"/>  

  41.   

  42.     <!--   

  43.         通過 customUserDetailsService,Spring會自動的用戶的訪問級別.  

  44.         也可以理解成:以後我們和數據庫操作就是通過customUserDetailsService來進行關聯.  

  45.      -->  

  46.     <bean id="customUserDetailsService" class="org.liukai.tutorial.service.CustomUserDetailsService"/>  

  47.       

  48. </beans>  





在配置中我們可以看到三個URL對應的三個權限 

Xml代碼  收藏代碼

  1. <security:intercept-url pattern="/auth/login" access="permitAll"/>  

  2.         <security:intercept-url pattern="/main/admin" access="hasRole('ROLE_ADMIN')"/>  

  3.         <security:intercept-url pattern="/main/common" access="hasRole('ROLE_USER')"/>  



需要注意的是我們使用了SpringEL表達式來指定角色的訪問. 
以下是表達式對應的用法. 

引用


表達式 說明 
hasRole([role]) 返回 true 如果當前主體擁有特定角色。 
hasAnyRole([role1,role2]) 返回 true 如果當前主體擁有任何一個提供的角色 (使用逗號分隔的字符串隊列) 
principal 允許直接訪問主體對象,表示當前用戶 
authentication 允許直接訪問當前 Authentication對象 從SecurityContext中獲得 
permitAll 一直返回true 
denyAll 一直返回false 
isAnonymous() 如果用戶是一個匿名登錄的用戶 就會返回 true 
isRememberMe() 如果用戶是通過remember-me 登錄的用戶 就會返回 true 
isAuthenticated() 如果用戶不是匿名用戶就會返回true 
isFullyAuthenticated() 如果用戶不是通過匿名也不是通過remember-me登錄的用戶時, 就會返回true。 



所以 

Xml代碼  收藏代碼

  1. <security:intercept-url pattern="/auth/login" access="permitAll"/>  


表示所有的人都可以訪問/auth/login. 


Xml代碼  收藏代碼

  1. <security:intercept-url pattern="/main/admin" access="hasRole('ROLE_ADMIN')"/>  

  2.         <security:intercept-url pattern="/main/common" access="hasRole('ROLE_USER')"/>  


則表示只有擁有對應的角色才能訪問. 





Xml代碼  收藏代碼

  1. <security:form-login  

  2.         login-page="/auth/login"   

  3.         authentication-failure-url="/auth/login?error=true"   

  4.         default-target-url="/main/common"/>  



表示通過 /auth/login這個映射進行登錄. 
如果驗證失敗則返回一個URL:/auth/login?error=true 
如果登錄成功則默認指向:/main/common 



Xml代碼  收藏代碼

  1. security:logout   

  2.                 invalidate-session="true"   

  3.                 logout-success-url="/auth/login"   

  4.                 logout-url="/auth/logout"/>  



很簡單.我們開啓了session失效功能. 
註銷URL爲:/auth/logout 
註銷成功後轉向:/auth/login 


Xml代碼  收藏代碼

  1. <!-- 指定一個自定義的authentication-manager :customUserDetailsService -->  

  2.     <security:authentication-manager>  

  3.             <security:authentication-provider user-service-ref="customUserDetailsService">  

  4.                     <security:password-encoder ref="passwordEncoder"/>  

  5.             </security:authentication-provider>  

  6.     </security:authentication-manager>  

  7.       

  8.     <!-- 對密碼進行MD5編碼 -->  

  9.     <bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" id="passwordEncoder"/>  

  10.   

  11.     <!--   

  12.         通過 customUserDetailsService,Spring會自動的用戶的訪問級別.  

  13.         也可以理解成:以後我們和數據庫操作就是通過customUserDetailsService來進行關聯.  

  14.      -->  

  15.     <bean id="customUserDetailsService" class="org.liukai.tutorial.service.CustomUserDetailsService"/>  



一個自定義的CustomUserDetailsService,是實現SpringSecurity的UserDetailsService接口,但我們重寫了他即便於我們進行數據庫操作. 



DbUser.java 

Java代碼  收藏代碼

  1. package org.liukai.tutorial.domain;  

  2.   

  3. public class DbUser {  

  4.   

  5.     private String username;  

  6.     private String password;  

  7.     private Integer access;  

  8.   

  9.      //getter/setter  

  10.   

  11. }  




通過一個初始化的List來模擬數據庫操作. 

UserDao.java 

Java代碼  收藏代碼

  1. package org.liukai.tutorial.dao;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.List;  

  5.   

  6. import org.apache.log4j.Logger;  

  7. import org.liukai.tutorial.domain.DbUser;  

  8.   

  9. public class UserDao {  

  10.   

  11.     protected static Logger logger = Logger.getLogger("dao");  

  12.   

  13.     public DbUser getDatabase(String username) {  

  14.   

  15.         List<DbUser> users = internalDatabase();  

  16.   

  17.         for (DbUser dbUser : users) {  

  18.             if (dbUser.getUsername().equals(username) == true) {  

  19.                 logger.debug("User found");  

  20.                 return dbUser;  

  21.             }  

  22.         }  

  23.         logger.error("User does not exist!");  

  24.         throw new RuntimeException("User does not exist!");  

  25.   

  26.     }  

  27.   

  28.     /** 

  29.      * 初始化數據 

  30.      */  

  31.     private List<DbUser> internalDatabase() {  

  32.   

  33.         List<DbUser> users = new ArrayList<DbUser>();  

  34.         DbUser user = null;  

  35.   

  36.         user = new DbUser();  

  37.         user.setUsername("admin");  

  38.   

  39.         // "admin"經過MD5加密後  

  40.         user.setPassword("21232f297a57a5a743894a0e4a801fc3");  

  41.         user.setAccess(1);  

  42.   

  43.         users.add(user);  

  44.   

  45.         user = new DbUser();  

  46.         user.setUsername("user");  

  47.   

  48.         // "user"經過MD5加密後  

  49.         user.setPassword("ee11cbb19052e40b07aac0ca060c23ee");  

  50.         user.setAccess(2);  

  51.   

  52.         users.add(user);  

  53.   

  54.         return users;  

  55.   

  56.     }  

  57. }  




自定義UserDetailsService .可以通過繼承UserDetailsService 
來達到靈活的自定義UserDetailsService 

關於UserDetailsService更多信息. 可以查看SpringSecurity3文檔 


CustomUserDetailsService.java 

Java代碼  收藏代碼

  1.  package org.liukai.tutorial.service;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.Collection;  

  5. import java.util.List;  

  6.   

  7. import org.apache.log4j.Logger;  

  8. import org.liukai.tutorial.dao.UserDao;  

  9. import org.liukai.tutorial.domain.DbUser;  

  10. import org.springframework.dao.DataAccessException;  

  11. import org.springframework.security.core.GrantedAuthority;  

  12. import org.springframework.security.core.authority.GrantedAuthorityImpl;  

  13. import org.springframework.security.core.userdetails.User;  

  14. import org.springframework.security.core.userdetails.UserDetails;  

  15. import org.springframework.security.core.userdetails.UserDetailsService;  

  16. import org.springframework.security.core.userdetails.UsernameNotFoundException;  

  17.   

  18. /** 

  19.  * 一個自定義的service用來和數據庫進行操作. 即以後我們要通過數據庫保存權限.則需要我們繼承UserDetailsService 

  20.  *  

  21.  * @author liukai 

  22.  *  

  23.  */  

  24. public class CustomUserDetailsService implements UserDetailsService {  

  25.   

  26.     protected static Logger logger = Logger.getLogger("service");  

  27.   

  28.     private UserDao userDAO = new UserDao();  

  29.   

  30.     public UserDetails loadUserByUsername(String username)  

  31.             throws UsernameNotFoundException, DataAccessException {  

  32.   

  33.         UserDetails user = null;  

  34.   

  35.         try {  

  36.   

  37.             // 搜索數據庫以匹配用戶登錄名.  

  38.             // 我們可以通過dao使用JDBC來訪問數據庫  

  39.             DbUser dbUser = userDAO.getDatabase(username);  

  40.   

  41.             // Populate the Spring User object with details from the dbUser  

  42.             // Here we just pass the username, password, and access level  

  43.             // getAuthorities() will translate the access level to the correct  

  44.             // role type  

  45.   

  46.             user = new User(dbUser.getUsername(), dbUser.getPassword()  

  47.                     .toLowerCase(), truetruetruetrue,  

  48.                     getAuthorities(dbUser.getAccess()));  

  49.   

  50.         } catch (Exception e) {  

  51.             logger.error("Error in retrieving user");  

  52.             throw new UsernameNotFoundException("Error in retrieving user");  

  53.         }  

  54.   

  55.         return user;  

  56.     }  

  57.   

  58.     /** 

  59.      * 獲得訪問角色權限 

  60.      *  

  61.      * @param access 

  62.      * @return 

  63.      */  

  64.     public Collection<GrantedAuthority> getAuthorities(Integer access) {  

  65.   

  66.         List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(2);  

  67.   

  68.         // 所有的用戶默認擁有ROLE_USER權限  

  69.         logger.debug("Grant ROLE_USER to this user");  

  70.         authList.add(new GrantedAuthorityImpl("ROLE_USER"));  

  71.   

  72.         // 如果參數access爲1.則擁有ROLE_ADMIN權限  

  73.         if (access.compareTo(1) == 0) {  

  74.             logger.debug("Grant ROLE_ADMIN to this user");  

  75.             authList.add(new GrantedAuthorityImpl("ROLE_ADMIN"));  

  76.         }  

  77.   

  78.         return authList;  

  79.     }  

  80. }  



最後啓動服務器輸入: 
http://localhost:8080/spring3-security-integration/auth/login 



總結 
通過本教程.我們對SpringSecurity3有了進一步的認識. 
主要是瞭解了UserDetailsService的重要作用. 
以及實現了模擬自定義數據的登錄.(這點很重要,很多人學習了SpringSecurity卻不知道 
如何自定義權限) 

這次教程因爲內容很多,顯得比較粗糙.很多地方並沒有詳細的闡明. 
後面的教程還是SpringSecurity. 
但我們將對SpringSecurity3新推出的一些特性進行詳細的說明和理解. 


BTW:附件爲本次教程源碼.你可以下載後直接在tomcat或其他web服務器啓動.也可以自行添加 
maven插件啓動. 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章