天天看點

Security安全認證 | Spring Boot如何內建Security實作安全認證

作者:章為忠學架構

前面介紹了Spring Boot 使用JWT實作Token驗證,其實Spring Boot 有完整的安全認證架構:Spring Security。接下來我們介紹如何內建Security 實作安全驗證。

安全對于企業來說至關重要,必要的安全認證為企業阻擋了外部非正常的通路,保證了企業内部資料的安全。

目前,資料安全問題越來越受到行業内公司的重視。資料洩漏很大一部分原因是非正常權限通路導緻的,于是使用合适的安全架構保護企業服務的安全變得非常緊迫。在Java領域,Spring Security無疑是最佳選擇之一。

Spring Security 是 Spring 家族中的一個安全管理架構,能夠基于 Spring 的企業應用系統提供聲明式的安全通路控制解決方案。它提供了一組可以在Spring應用系統中靈活配置的元件,充分利用了 Spring的IoC、DI和AOP等特性,為應用系統提供聲明式的安全通路控制功能,減少了為企業系統安全控制編寫大量重複代碼的工作。

雖然,在Spring Boot出現之前,Spring Security已經發展多年,但是使用并不廣泛。安全管理這個領域一直是Shiro的天下,因為相對于Shiro,在項目中內建Spring Security還是一件麻煩的事情,是以Spring Security雖然比Shiro強大,但是卻沒有Shiro受歡迎。

随着Spring Boot的出現,Spring Boot 對Spring Security 提供了自動化配置方案,可以零配置使用 Spring Security。這使得Spring Security重新煥發新的活力。

Spring Boot 提供了內建 Spring Security 的元件包 spring-boot-starter-security,友善我們在 Spring Boot 項目中使用 Spring Security進行權限控制。

在Spring Boot 項目中內建Spring Boot Security 非常簡單,隻需在項目中增加Spring Boot Security的依賴即可。下面通過示例示範Spring Boot中基礎Security的登入驗證。

1. 添加依賴

Spring Boot 提供了內建 Spring Security 的元件包 spring-boot-starter-security,友善我們在 Spring Boot 項目中使用 Spring Security。

上面除了引入Security元件外,因為我們要做Web系統的權限驗證,是以還添加了Web和Thymeleaf元件。

2. 配置登入使用者名和密碼

使用者名和密碼在application.properties中進行配置。

在application.properties配置檔案中增加了管理者的使用者名和密碼。

3. 添加Controller

建立SecurityController 類,在類中添加通路頁面的入口。

4. 建立前端頁面

在resources/templates 目錄下建立頁面 index.html,這個頁面就是具體的需要增權重限控制的頁面,隻有登入了才能進入此頁。

5. 測試驗證

配置完成後,重新開機項目,通路位址:http://localhost:8080/,頁面會自動彈出一個登入框,如下圖所示。

Security安全認證 | Spring Boot如何內建Security實作安全認證

系統自動跳轉到Spring Security預設的登入頁面,輸入之前配置的使用者名和密碼就可以登入系統,登入後的頁面如下圖所示。

Security安全認證 | Spring Boot如何內建Security實作安全認證

通過上面的示例,我們看到Spring Security自動給所有通路請求做了登入保護,實作了頁面權限控制。

前面示範了在Spring Boot項目中內建Spring Security 實作簡單的登入驗證功能,在實際項目使用過程中,可能有的功能頁面不需要進行登入驗證,而有的功能頁面隻有進行登入驗證才能通路。下面通過完整的示例程式示範如何實作Security的登入認證。

1. 建立頁面content.html

先建立頁面content.html,此頁面隻有登入使用者才可檢視,否則會跳轉到登入頁面,登入成功後才能通路。示例代碼如下:

在上面的示例中,我們看到退出使用post請求,因為Security退出請求預設隻支援post 。

2. 修改index.html 頁面

修改之前的index.html頁面,增加登入按鈕。

在上面的示例中,index頁面屬于公共頁面,無權限驗證,從index頁面進入content頁面時需要登入驗證。

3. 修改Controller控制器

修改之前的SecurityController控制器,增加content頁面路由位址,示例代碼如下:

4. 建立 SecurityConfig 類

建立 Security的配置檔案SecurityConfig類,它繼承于 WebSecurityConfigurerAdapter,現自定義權限驗證配置。示例代碼如下:

在上面的示例程式中,SecurityConfig類中配置 index.html 可以直接通路,但 content.html 需要登入後才可以檢視,沒有登入的自動跳轉到登入頁面。

@EnableWebSecurity:開啟 Spring Security 權限控制和認證功能。

antMatchers("/", "/home").permitAll():配置不用登入可以通路的請求。

anyRequest().authenticated():表示其他的請求都必須有權限認證。

formLogin():定制登入資訊。

loginPage("/login"):自定義登入位址,若注釋掉,則使用預設登入頁面。

logout():退出功能,Spring Security自動監控了/logout。

ignoringAntMatchers("/logout"):Spring Security 預設啟用了同源請求控制,在這裡選擇忽略退出請求的同源限制。

修改完成之後重新開機項目,通路位址http://localhost:8080/可以看到 index 頁面的内容,單擊連結跳轉到content頁面時會自動跳轉到登入頁面,登入成功後才會自動跳轉到http://localhost:8080/content,在 content 頁面單擊“退出”按鈕,會登出狀态,跳轉到登入頁面并提示已經退出。

Security安全認證 | Spring Boot如何內建Security實作安全認證

登入、退出、請求受限頁面退出後跳轉到登入頁面是常用的安全控制案例,也是賬戶系統基本的安全保障。

以上,我們就把Spring Boot如何內建Security實作安全認證介紹完了。