Java Spring Security認(rèn)證與授權(quán)及注銷和權(quán)限控制篇綜合解析
Spring Security簡介:
Spring Security 是針對Spring項目的安全框架,也是Spring Boot底層安全模塊默認(rèn)的技術(shù)選型,它可以實現(xiàn)強(qiáng)大的Web安全控制,對于安全控制,我們只需要引入 spring-boot-starter-security 模塊,進(jìn)行少量的配置,即可實現(xiàn)強(qiáng)大的安全管理!
記住幾個類:
- WebSecurityConfigurerAdapter:自定義Security策略
- AuthenticationManagerBuilder:自定義認(rèn)證策略
- @EnableWebSecurity:開啟WebSecurity模式
Spring Security的兩個主要目標(biāo)是 “認(rèn)證” 和 “授權(quán)”(訪問控制)。
“認(rèn)證”(Authentication)
身份驗證是關(guān)于驗證您的憑據(jù),如用戶名/用戶ID和密碼,以驗證您的身份。
身份驗證通常通過用戶名和密碼完成,有時與身份驗證因素結(jié)合使用。
“授權(quán)” (Authorization)
授權(quán)發(fā)生在系統(tǒng)成功驗證您的身份后,最終會授予您訪問資源(如信息,文件,數(shù)據(jù)庫,資金,位置,幾乎任何內(nèi)容)的完全權(quán)限。
這個概念是通用的,而不是只在Spring Security 中存在。
Spring Security 框架對于認(rèn)證和授權(quán)很好的支持。在用戶認(rèn)證方面,Spring Security 框架支持主流的認(rèn)證方式,包括 HTTP 基本認(rèn)證、HTTP 表單驗證、HTTP 摘要認(rèn)證、OpenID 和 LDAP 等。在用戶授權(quán)方面,Spring Security 提供了基于角色的訪問控制和訪問控制列表(Access Control List,ACL),可以對應(yīng)用中的領(lǐng)域?qū)ο筮M(jìn)行細(xì)粒度的控制。
下面是spring security官網(wǎng):Spring Security 找到對應(yīng)的官方文檔:Spring Security Reference

實驗環(huán)境搭建:
1.新建一個初始的springboot項目web模塊,thymeleaf模塊
2.導(dǎo)入靜態(tài)資源

3、controller跳轉(zhuǎn)!

4、測試實驗環(huán)境是否成功
認(rèn)證和授權(quán)
我們測試的環(huán)境,是誰都可以訪問,現(xiàn)在我們使用 Spring Security 增加上認(rèn)證和授權(quán)的功能
1、引入 Spring Security 模塊
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2、編寫 Spring Security 配置類
參考對應(yīng)的官方文檔:Spring Security Reference

3、編寫基礎(chǔ)配置類
@EnableWebSecurity // 開啟WebSecurity模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
}
}
4.定義授權(quán)的規(guī)則:
在配置類中看授權(quán)的源碼:


5、測試,發(fā)現(xiàn)除了首頁都進(jìn)不去了!因為我們目前沒有登錄的角色,因為請求需要登錄的角色擁有對應(yīng)的權(quán)限才可以!
6、在configure()方法中加入以下配置,開啟自動配置的登錄功能!
從源碼解釋中看

// 開啟自動配置的登錄功能 // /login 請求來到登錄頁 // /login?error 重定向到這里表示登錄失敗 http.formLogin();
7、測試一下:發(fā)現(xiàn),沒有權(quán)限的時候,會跳轉(zhuǎn)到登錄的頁面!

8、查看剛才登錄頁的注釋信息;
我們可以定義認(rèn)證規(guī)則,從源碼中查看

重寫configure(AuthenticationManagerBuilder auth)方法
//定義認(rèn)證規(guī)則
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//在內(nèi)存中定義,也可以在jdbc中去拿....
auth.inMemoryAuthentication()
.withUser("kuangshen").password("123456").roles("vip2","vip3")
.and()
.withUser("root").password("123456").roles("vip1","vip2","vip3")
.and()
.withUser("guest").password("123456").roles("vip1","vip2");
}
9、測試,我們可以使用這些賬號登錄進(jìn)行測試!發(fā)現(xiàn)會報錯!
There is no PasswordEncoder mapped for the id “null”
10、原因,我們要將前端傳過來的密碼進(jìn)行某種方式加密,否則就無法登錄,修改代碼

11、測試,登錄成功,并且每個角色只能訪問自己認(rèn)證下的規(guī)則
權(quán)限控制和注銷
1、開啟自動配置的注銷的功能

2、在前端,增加一個注銷的按鈕,index.html 導(dǎo)航欄中
<a class="item" th:href="@{/logout}" rel="external nofollow" >
<i class="sign-out icon"></i> 注銷
</a>
3、可以去測試一下,登錄成功后點(diǎn)擊注銷,發(fā)現(xiàn)注銷完畢會跳轉(zhuǎn)到登錄頁面!
4、但是,我們想讓他注銷成功后,依舊可以跳轉(zhuǎn)到首頁,該怎么處理呢?
// .logoutSuccessUrl("/"); 注銷成功來到首頁
http.logout().logoutSuccessUrl("/");
5、測試,注銷完畢后,發(fā)現(xiàn)跳轉(zhuǎn)到首頁OK
6、現(xiàn)在來一個需求:用戶沒有登錄的時候,導(dǎo)航欄上只顯示登錄按鈕,用戶登錄之后,導(dǎo)航欄可以顯示登錄的用戶信息及注銷按鈕!還有就是,比如longdi這個用戶,它只有 vip2,vip3功能,那么登錄則只顯示這兩個功能,而vip1的功能菜單不顯示!這個就是真實的網(wǎng)站情況了!
我們需要結(jié)合thymeleaf中的一些功能
sec:authorize="isAuthenticated()":是否認(rèn)證登錄!來顯示不同的頁面
Maven依賴:
<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> <version>3.0.4.RELEASE</version> </dependency>
7、修改我們的 前端頁面
導(dǎo)入命名空間 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
修改導(dǎo)航欄,增加認(rèn)證判斷
8、重啟測試,可以登錄試試看,登錄成功后確實,顯示了我們想要的頁面;
9、如果注銷404了,就是因為它默認(rèn)防止csrf跨站請求偽造,因為會產(chǎn)生安全問題,可以將請求改為post表單提交,或者在spring security中關(guān)閉csrf功能;試試在 配置中增加

10、繼續(xù)將下面的角色功能塊認(rèn)證完成!測試成功!
到此這篇關(guān)于Java Spring Security認(rèn)證與授權(quán)及注銷和權(quán)限控制篇綜合解析的文章就介紹到這了,更多相關(guān)Java Spring Security內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot自定義Redis實現(xiàn)緩存序列化詳解
Spring提供了一個RedisTemplate來進(jìn)行對Redis的操作,但是RedisTemplate默認(rèn)配置的是使用Java本機(jī)序列化。如果要對對象操作,就不是那么的方便。所以本文為大家介紹了另一種SpringBoot結(jié)合Redis實現(xiàn)序列化的方法,需要的可以參考一下2022-07-07
使用Spring注解@EventListener實現(xiàn)監(jiān)聽原理
這篇文章主要介紹了使用Spring注解@EventListener實現(xiàn)監(jiān)聽原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Java數(shù)據(jù)結(jié)構(gòu)(線性表)詳解
本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)(線性表)的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧2017-01-01
Spring?boot?自定義?Starter及自動配置的方法
Starter?組件是?Spring?boot?的一個核心特性,Starter組件的出現(xiàn)極大的簡化了項目開發(fā),這篇文章主要介紹了Spring?boot?自定義?Starter?及?自動配置,需要的朋友可以參考下2022-12-12
PowerShell用戶認(rèn)證Function實例代碼
這篇文章主要介紹了PowerShell用戶認(rèn)證Function的資料,并附實例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下2016-09-09

