spring security 4.1.x入門
許可權控制在網頁開發中是很重要的一部分,最基本的就是用form進行賬號密碼的認證,更復雜的可能控制的粒度會更細一些,spring securty相關的資訊在網上可以搜到很多,入門的例程更是多不勝數,但是在我學習瞭解的過程中,卻發現沒有一個簡單易懂的,給學習之路帶來了諸多不便,所以我希望可以用一種更簡單的方式來幫助其它想要學習spring securty的人更快的學會使用spring securty。
關於spring securty的原理什麼的,網上有很多相關的資料,有些東西我不再具體描述,一些我感覺比較重要的東西,會著重寫一些,前面先說一些原理性的東西,後面再進一步把原理轉換成實踐的小demo,目前最新的版本是4.1,就以4.1版本為例,前面的版本我也不太瞭解,不過大部分東西都是大同小異的。
spring securty提供多認證方式,這裡只討論用form進行使用者名稱密碼驗證的方式。
spring securty的使用方式是在web.xml裡配置一個filter來攔截想要讓spring securty處理的url,在這個filter裡維護了一個過濾器鏈,不同版本里的過濾器鏈可能會有所有不同。
spring securty 3.0.1裡的過濾器鏈如下:
名稱 | 過濾器類 | 名稱空間元素或屬性 |
---|---|---|
CHANNEL_FILTER | ChannelProcessingFilter | http/[email protected] |
CONCURRENT_SESSION_FILTER | ConcurrentSessionFilter | session-management/concurrency-control |
SECURITY_CONTEXT_FILTER | SecurityContextPersistenceFilter | http |
LOGOUT_FILTER | LogoutFilter | http/logout |
X509_FILTER | X509AuthenticationFilter | http/x509 |
PRE_AUTH_FILTER | AstractPreAuthenticatedProcessingFilter | N/A |
CAS_FILTER | CasAuthenticationFilter | N/A |
FORM_LOGIN_FILTER | UsernamePasswordAuthenticationFilter | http/form-login |
BASIC_AUTH_FILTER | BasicAuthenticationFilter | http/http-basic |
SERVLET_API_SUPPORT_FILTER | SecurityContextHolderAwareFilter | http/@servlet-api-provision |
REMEMBER_ME_FILTER | RememberMeAuthenticationFilter | http/remember-me |
ANONYMOUS_FILTER | SessionManagementFilter | http/anonymous |
SESSION_MANAGEMENT_FILTER | AnonymousAuthenticationFilter | session-management |
EXCEPTION_TRANSLATION_FILTER | ExceptionTranslationFilter | http |
FILTER_SECURITY_INTERCEPTOR | FilterSecurityInterceptor | http |
SWITCH_USER_FILTER | SwitchUserAuthenticationFilter | N/A |
spring securty 4.1.x裡的過濾器鏈如下:
名稱 | 過濾器類 | 名稱空間元素或屬性 |
---|---|---|
CHANNEL_FILTER | ChannelProcessingFilter | http/[email protected] |
SECURITY_CONTEXT_FILTER | SecurityContextPersistenceFilter | http |
CONCURRENT_SESSION_FILTER | ConcurrentSessionFilter | session-management/concurrency-control |
HEADERS_FILTER | HeaderWriterFilter | http/headers |
CSRF_FILTER | CsrfFilter | http/csrf |
LOGOUT_FILTER | LogoutFilter | http/logout |
X509_FILTER | X509AuthenticationFilter | http/x509 |
PRE_AUTH_FILTER | AbstractPreAuthenticatedProcessingFilter | N/A |
CAS_FILTER | CasAuthenticationFilter | N/A |
FORM_LOGIN_FILTER | UsernamePasswordAuthenticaionFilter | http/form-login |
BASIC_AUTH_FILTER | BasicAuthenticationFilter | http/http-basic |
SERVLET_API_SUPPORT_FILTER | SecurityContextHolderAwareRequestFilter | http/@ervet-apiprovision |
JAAS_API_SUPPORT_FILTER | JaasApiIntegrationFilter | http/@jaas-apiprovision |
REMEMBER_ME_FILTER | RememberMeAuthenticationFilter | http/remember-me |
ANONYMOUS_FILTER | AnonymousAuthenticationFilter | http/anonymous |
SESSION_MANAGEMENT_FILTER | SessionManagementFilter | session-management |
EXCEPTION_TRANSLATION_FILTER | ExceptionTranslationFilter | http |
FILTER_SECURITY_INTERCEPTOR | FilterSecurityInterceptor | http |
SWITCH_USER_FILTER | SwitchUserFilter | N/A |
過濾器鏈裡的Filter不能被修改,但是我們可以通過插入自定義的Filter來實現自己想要的功能,當然,更高階的內容會在後面的章節裡進行討論。
現在,我們來做一個最簡單的入門Demo,為了儘可能簡單,僅僅只引用了spring security。
- spring security所需要的jar包,如果是手動新增,可能要新增一系列的jar包,建議用maven組建專案 ,pom檔案如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pers.homer.test</groupId>
<artifactId>Demo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<finalName>Demo</finalName>
</build>
</project>
- 配置web.xml引入spring security
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-security.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>
</web-app>
- 配置spring-security.xml檔案,讓spring security按照我們的要求來工作
<?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.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-4.1.xsd ">
<!-- 不需要進行安全認證的資源 -->
<http pattern="/resources/**" security="none" />
<!-- 資源所需要的許可權 -->
<http use-expressions="true" auto-config="true">
<intercept-url pattern="/index.jsp*" access="permitAll" />
<intercept-url pattern="/user.jsp*" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/admin.jsp*" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>
<!-- 配置使用者和相應的許可權 -->
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_USER" />
<user name="admin" password="admin" authorities="ROLE_ADMIN" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
- 配置部分完成了,通過配置裡的內容,我們其實已經可以看出來,我做了三個頁面來驗證相應的使用者許可權,最後的工作就是寫三個jsp檔案,index.jsp , user.jsp ,admin.jsp,這三個jsp檔案裡的內容可以隨便寫,我的index.jsp程式碼如下,其實三個頁面就是顯示不同的提示,其他兩個我們可以自行補充。
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<div>這是任何人都可以訪問的頁面</div>
</body>
</html>
到這裡,整個demo已經完成了,執行之後,訪問相應的頁面時,如果沒有登入,會自動轉到spring security預設的登入頁面,登入後即可訪問,許可權不足時也會有預設的錯誤提示。
入門的例程做的儘可能的簡單,我把spring web MVC的部分也分離了出去,讓大家的注意力放在我們關注的地方,後面會逐步討論更高階的應用。
相關推薦
spring security 4.1.x入門
許可權控制在網頁開發中是很重要的一部分,最基本的就是用form進行賬號密碼的認證,更復雜的可能控制的粒度會更細一些,spring securty相關的資訊在網上可以搜到很多,入門的例程更是多不勝數,但是在我學習瞭解的過程中,卻發現沒有一個簡單易懂的,給學習之路帶
SpringBoot整合Spring Security(1)——入門程式
因為專案需要,第一次接觸Spring Security,早就聽聞Spring Security強大但上手困難,今天學習了一天,翻遍了全網資料,才僅僅出入門道,特整理這篇文章來讓後來者少踩一點坑(本文附帶例項程式,請放心食用) 本篇文章環境:SpringBoot 2.0 + Mybatis + S
spring security 4.1兩個不錯功能介紹
一轉眼, spring security 已經發布4.1 了,檢視 了下新特性,有兩個比較值得關注: 1) 可以在pathvariable形式的URL中進行保護了 比如有個方法: [code="java"] public class WebSecurity {publi
Spring Security 4.x -> 5.x 踩坑記錄
1. AuthenticationManager無法自動注入 在實現AbstractAuthenticationProcessingFilter重寫以使用者名稱、密碼認證時,需要顯示注入AuthenticationManager,不然會報如下錯誤: Caus
upgrade to Spring-Security 4.X後的登入問題
升級到4.2.3後,登入出現 HTTP Status 403 - Could not verify the provided CSRF token because your session was not found sec http裡面需要增加: <sec:hea
Spring Security 4.x 啟用CSRF防禦後logout只能是POST請求
學習Spring Security時碰到這個問題 官方原文: 18.5.3 Logging Out Adding CSRF will update the LogoutFilter to only use HTTP POST. This ensures tha
Spring Security 4.X xml配置重定向
<!-- 後臺許可權控制 @PreAuthorize --> <global-method-security pre-post-annotations="enabled" /> <form-login login-page="/login
Spring Boot整合Spring Security(4.0)入門(Maven)
之前沒有做過許可權方面的,組長讓我做下一版本的許可權管理,去看了幾篇部落格,感覺寫的不夠清晰,自己總結一下,僅當做自己學習的記錄(如有誤導、錯誤敬請諒解、指出)。 1.pom.xml中引入支援包: <!-- springboot spring securi
spring security 3.1 實現權限控制
ref bmi sage pan 管理系統 dao 數據庫 ng- nds spring security 3.1 實現權限控制 簡單介紹:spring security 實現的權限控制,能夠分別保護後臺方法的管理,url連接訪問的控制,以及頁面元
Spring Security 4.2.3 Filters 解析
其中 validate ali 配置 生命 擁有 path str support 一、 熟悉一個模塊的最快方法 1. 配置logback文件,打印相應的debug信息 2. 根據相應的信息,打斷點查看執行結果 二、spring 使用 DelegatingFilterP
Spring Framework 4.2.x - Eclipse/STS專案匯入指南
Spring Framework - Eclipse/STS專案匯入指南 本文件將指導您把"Spring Framework"專案匯入到Eclipse或STS中。 建議您使用最近版本的Eclipse或STS。作為最低限度,Eclipse中需要具備以下功能:完整的Java 8支援、Aspect
Spring Tools 4.1.0 釋出,針對 Spring 應用的開發環境
Spring Tools 4 for Eclipse, Visual Studio Code 和 Atom 的 4.1.0 版本釋出了。Spring Tools 4 是為你量身打造的下一代 Spring 工具,無論你喜歡 Eclipse、Visual Studi
Spring Security 4.2.2 一些注意事項
1.配置檔案中的http標籤變為security:http2.security:http上的屬性use-expressions="false",如果未這麼宣告,那麼在子節點中security:intercept-url的access中直接使用角色名,則會報錯Field or
spring-webmvc-4.1.6 介面返回json資料 中文出現\u0000\u0000\u0000\u0000
之前搭建開發環境的時候遇到了一個奇怪的現象,使用spring4.1.6的框架,因為spring的升級處理json的jar也跟著升級到了Jackson2.6的rc1版。具體引入的jar如下
Spring Security 4 (03)—— 資源資訊
序言 這一篇主要是講資源的載入和認證 1.記憶體載入 <security:http auto-config="false" use-expressions="false" &g
Spring Security 4 整合Hibernate 實現持久化登入驗證(帶原始碼)
【相關已翻譯的本系列其他文章,點選分類裡面的spring security 4】 本教程將使用Spring Security 4 和hibernate向你展示持久化登入驗證. 在持久化登入驗證中,應用通過session記住使用者特徵。 一般來說,在登入介面,當你
spring-framework-4.1.6 mvc整合commons-dbutils-1.6註解式事務
dbutils 是 Apache 提供的一個開源 JDBC 工具類庫,對 JDBC 做了一些簡單的封裝,使用非常方便。在專案中經常會有用到事務,我們就來看看spring mvc是怎麼結合dbutils開發註解式事務的。 1、下載commons-dbutils-1.6.jar
Spring Security(一)入門
1、新建maven專案,匯入依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apac
Spring Security 4 退出後再登入,頁面停留在登入頁,Url卻多了一個Logout引數
spring security 4 的logout問題 今天在整合spring-boot 和 spring-security的時候,出現瞭如下的怪象: 配置好了基本的登入和身份驗證(自定義了一個簡單的UserDetailsService),springboo
Spring Security 4 安全檢視片段 使用標籤(Spring Security 標籤)
下一篇文章: 【剩餘文章,將盡快翻譯完畢,敬請期待。 翻譯by 明明如月 QQ 605283073】 本教程向你展示怎樣建立安全檢視層,Spring MVC web 應用中,使用Spring Security 標籤,基於使用者角色顯示或者隱藏部分jsp或