天天看點

SpringBoot14:內建SpringSecurity

在 Web 開發中,安全一直是非常重要的一個方面。安全雖然屬于應用的非功能性需求,但是應該在應用開發的初期就考慮進來。如果在應用開發的後期才考慮安全的問題,就可能陷入一個兩難的境地:一方面,應用存在嚴重的安全漏洞,無法滿足使用者的要求,并可能造成使用者的隐私資料被攻擊者竊取;另一方面,應用的基本架構已經确定,要修複安全漏洞,可能需要對系統的架構做出比較重大的調整,因而需要更多的開發時間,影響應用的釋出程序。是以,從應用開發的第一天就應該把安全相關的因素考慮進來,并在整個應用的開發過程中。

市面上存在比較有名的:Shiro,Spring Security !

這裡需要闡述一下的是,每一個架構的出現都是為了解決某一問題而産生了,那麼Spring Security架構的出現是為了解決什麼問題呢?

首先我們看下它的官網介紹:Spring Security官網位址

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.

Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements

Spring Security是一個功能強大且高度可定制的身份驗證和通路控制架構。它實際上是保護基于spring的應用程式的标準。

Spring Security是一個架構,側重于為Java應用程式提供身份驗證和授權。與所有Spring項目一樣,Spring安全性的真正強大之處在于它可以輕松地擴充以滿足定制需求

從官網的介紹中可以知道這是一個權限架構。想我們之前做項目是沒有使用架構是怎麼控制權限的?對于權限 一般會細分為功能權限,通路權限,和菜單權限。代碼會寫的非常的繁瑣,備援。

怎麼解決之前寫權限代碼繁瑣,備援的問題,一些主流架構就應運而生而Spring Scecurity就是其中的一種。

Spring 是一個非常流行和成功的 Java 應用開發架構。Spring Security 基于 Spring 架構,提供了一套 Web 應用安全性的完整解決方案。一般來說,Web 應用的安全性包括使用者認證(Authentication)和使用者授權(Authorization)兩個部分。使用者認證指的是驗證某個使用者是否為系統中的合法主體,也就是說使用者能否通路該系統。使用者認證一般要求使用者提供使用者名和密碼。系統通過校驗使用者名和密碼來完成認證過程。使用者授權指的是驗證某個使用者是否有權限執行某個操作。在一個系統中,不同使用者所具有的權限是不同的。比如對一個檔案來說,有的使用者隻能進行讀取,而有的使用者可以進行修改。一般來說,系統會為不同的使用者配置設定不同的角色,而每個角色則對應一系列的權限。

對于上面提到的兩種應用情景,Spring Security 架構都有很好的支援。在使用者認證方面,Spring Security 架構支援主流的認證方式,包括 HTTP 基本認證、HTTP 表單驗證、HTTP 摘要認證、OpenID 和 LDAP 等。在使用者授權方面,Spring Security 提供了基于角色的通路控制和通路控制清單(Access Control List,ACL),可以對應用中的領域對象進行細粒度的控制。

1、建立一個初始的springboot項目,導入web子產品,thymeleaf子產品

2、導入靜态資源

3、controller跳轉!

4、測試實驗環境是否OK!

Spring Security 是針對Spring項目的安全架構,也是Spring Boot底層安全子產品預設的技術選型,他可以實作強大的Web安全控制,對于安全控制,我們僅需要引入 spring-boot-starter-security 子產品,進行少量的配置,即可實作強大的安全管理!

記住幾個類:

WebSecurityConfigurerAdapter:自定義Security政策

AuthenticationManagerBuilder:自定義認證政策

@EnableWebSecurity:開啟WebSecurity模式

Spring Security的兩個主要目标是 “認證” 和 “授權”(通路控制)。

“認證”(Authentication)

身份驗證是關于驗證您的憑據,如使用者名/使用者ID和密碼,以驗證您的身份。

身份驗證通常通過使用者名和密碼完成,有時與身份驗證因素結合使用。

“授權” (Authorization)

授權發生在系統成功驗證您的身份後,最終會授予您通路資源(如資訊,檔案,資料庫,資金,位置,幾乎任何内容)的完全權限。

這個概念是通用的,而不是隻在Spring Security 中存在。

目前,我們的測試環境,是誰都可以通路的,我們使用 Spring Security 增加上認證和授權的功能

1、引入 Spring Security 子產品

參考官網:https://docs.spring.io/spring-security/site/docs/current/reference/html5/#jc

3、編寫基礎配置類

4、定制請求的授權規則

5、測試一下:發現除了首頁都進不去了!因為我們目前沒有登入的角色,因為請求需要登入的角色擁有對應的權限才可以!

6、在configure()方法中加入以下配置,開啟自動配置的登入功能!

7、測試一下:發現,沒有權限的時候,會跳轉到登入的頁面!

SpringBoot14:內建SpringSecurity

8、檢視剛才登入頁的注釋資訊;

我們可以定義認證規則,重寫configure(AuthenticationManagerBuilder auth)方法

9、測試,我們可以使用這些賬号登入進行測試!發現會報錯!

There is no PasswordEncoder mapped for the id “null”

SpringBoot14:內建SpringSecurity

10、原因,我們要将前端傳過來的密碼進行某種方式加密,否則就無法登入,修改代碼

11、測試,發現,登入成功,并且每個角色隻能通路自己認證下的規則!搞定

1、開啟自動配置的登出的功能

2、我們在前端,增加一個登出的按鈕,index.html 導航欄中

3、我們可以去測試一下,登入成功後點選登出,發現登出完畢會跳轉到登入頁面!

4、但是,我們想讓他登出成功後,依舊可以跳轉到首頁,該怎麼處理呢?

5、測試,登出完畢後,發現跳轉到首頁OK

6、我們現在又來一個需求:使用者沒有登入的時候,導航欄上隻顯示登入按鈕,使用者登入之後,導航欄可以顯示登入的使用者資訊及登出按鈕!還有就是,比如edgar這個使用者,它隻有 vip2,vip3功能,那麼登入則隻顯示這兩個功能,而vip1的功能菜單不顯示!這個就是真實的網站情況了!該如何做呢?

我們需要結合thymeleaf中的一些功能

sec:authorize="isAuthenticated()":是否認證登入!來顯示不同的頁面

Maven依賴:

7、修改我們的 前端頁面

導入命名空間

<code>xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"</code>

修改導航欄,增加認證判斷

8、重新開機測試,我們可以登入試試看,登入成功後确實,顯示了我們想要的頁面;

9、如果登出404了,就是因為它預設防止csrf跨站請求僞造,因為會産生安全問題,我們可以将請求改為post表單送出,或者在spring security中關閉csrf功能;我們試試:在 配置中增加 <code>http.csrf().disable();</code>

10、我們繼續将下面的角色功能塊認證完成!

11、測試一下!

12、權限控制和登出搞定!

現在的情況,我們隻要登入之後,關閉浏覽器,再登入,就會讓我們重新登入,但是很多網站的情況,就是有一個記住密碼的功能,這個該如何實作呢?很簡單

1、開啟記住我功能

2、我們再次啟動項目測試一下,發現登入頁多了一個記住我功能,我們登入之後關閉 浏覽器,然後重新打開浏覽器通路,發現使用者依舊存在!

思考:如何實作的呢?其實非常簡單

我們可以檢視浏覽器的cookie

SpringBoot14:內建SpringSecurity

3、我們點選登出的時候,可以發現,spring security 幫我們自動删除了這個 cookie

SpringBoot14:內建SpringSecurity

4、結論:登入成功後,将cookie發送給浏覽器儲存,以後登入帶上這個cookie,隻要通過檢查就可以免登入了。如果點選登出,則會删除這個cookie,具體的原理我們在JavaWeb階段都講過了,這裡就不在多說了!

現在這個登入頁面都是spring security 預設的,怎麼樣可以使用我們自己寫的Login界面呢?

1、在剛才的登入頁配置後面指定 loginpage

2、然後前端也需要指向我們自己定義的 login請求

3、我們登入,需要将這些資訊發送到哪裡,我們也需要配置,login.html 配置送出請求及方式,方式必須為post:

在 loginPage()源碼中的注釋上有寫明:

4、這個請求送出上來,我們還需要驗證處理,怎麼做呢?我們可以檢視formLogin()方法的源碼!我們配置接收登入的使用者名和密碼的參數!

5、在登入頁增加記住我的多選框

6、後端驗證處理!

7、測試,OK