1. 程式人生 > >spring security 4.1.x入門

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 Security1)——入門程式

因為專案需要,第一次接觸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或