Spring boot之身份驗證和訪問控制

本文筆記跟隨于遇見狂神說老師的視頻

一.SpringSecurity(安全)

1.相關概念

在web開發中,安全第一位,有簡單的方法,比如:攔截器,過濾器

也有安全框架,比如:SpringSecurity,shiro,兩者很像,名字和類不一樣。

都是做認證授權兩個部分!

常見的權限有:功能權限,訪問權限,菜單權限。以前做這些用攔截器,過濾器(大量的原生代碼~)

?2.代碼前期準備階段

2.1導入靜態資源

2.2導入security依賴

<!--SpringSecurity --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

2.3創建controller層

package com.zhang.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@Controller
public class RouterController {@GetMapping("/index")public String index(){return "index";}@GetMapping("/tologin")public String toLogin(){return "views/login";}@GetMapping("/level1/{id}")public String level1(@PathVariable("id") int id){return "views/level1/"+id;}@GetMapping("/level2/{id}")public String level2(@PathVariable("id") int id){return "views/level2/"+id;}@GetMapping("/level3/{id}")public String level3(@PathVariable("id") int id){return "views/level3/"+id;}
}

3.認證和授權實現

?創建一個配置類,用來設置用戶的訪問權限,以及認證用戶的身份信息

package com.zhang.config;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {//授權@Overrideprotected void configure(HttpSecurity http) throws Exception {//給傳過來的url設置訪問權限,首頁所有人都可以訪問,功能頁只能是有權限的人可以訪問//請求授權的規則http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/level1/**").hasRole("vip1").antMatchers("/level2/**").hasRole("vip2").antMatchers("/level3/**").hasRole("vip3");//沒有權限自動跳到登錄頁面http.formLogin();}//認證  springboot 2.1.x可以直接使用//Spring security 5.0中新增了多種加密方式,也改變了密碼的格式。//要想我們的項目還能夠正常登陸,需要修改一下configure中的代碼。我們要將前端傳過來的密碼進行某種方式加密//spring security 官方推薦的是使用bcrypt加密方式。@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//可以從內存也可以從數據庫中取數據認證auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("zhangsan").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1").and().withUser("lisi").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2").and().withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");}
}

4.注銷功能實現

在配置類中實現注銷功能

在前端index.xml主頁面中增加注銷按鈕

經測試,注銷成功后會跳轉到登錄頁面,如果想要注銷成功后跳轉到主頁面,需要在配置類中改進一下開啟注銷功能

 //開啟注銷功能    .logoutSuccessUrl("/"); 注銷成功來到首頁http.logout().logoutSuccessUrl("/");

如果用戶沒有登錄時在導航欄只顯示登錄按鈕,登錄后在導航欄顯示用戶的登錄信息和注銷按鈕并且如何根據用戶的權限不同在菜單欄顯示的功能也不同?

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

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

導入maven依賴

 <!--security-thymeleaf整合包--><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity4</artifactId><version>2.1.2.RELEASE</version></dependency>

導入以上依賴后,可以在thymeleaf中進行一些security的操作

修改前端index.xml主頁面

導入命名空間:

xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"

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

<!--主容器-->
<div class="ui container"><div class="ui segment" id="index-header-nav" th:fragment="nav-menu"><div class="ui secondary menu"><a class="item"  th:href="@{/index}">首頁</a><!--登錄注銷--><div class="right menu"><!--如果未登錄--><div sec:authorize="!isAuthenticated()"><a class="item" th:href="@{/toLogin}"><el-button type="success" icon="el-icon-check" circle></el-button> 登錄</a></div><!--如果已登錄--><div sec:authorize="isAuthenticated()"><a class="item"><el-button type="primary" icon="el-icon-edit" circle></el-button>用戶名:<span sec:authentication="principal.username"></span></a></div><a class="item" th:href="@{/logout}"><el-button type="danger" icon="el-icon-delete" circle></el-button> 注銷</a></div></div></div>

重啟后點擊注銷會報404的錯誤,是因為它默認防止csrf跨站請求偽造,因為會產生安全問題,我們可以將請求改為post表單提交,或者在spring security中關閉csrf功能

        http.csrf().disable();//關閉csrf功能:跨站請求偽造,默認只能通過post方式提交logout請求

到此,可以在導航欄正確的顯示登錄前后的信息,接下來實現根據用戶權限不同,在菜單欄顯示不同頁面。

修改前端index.xml主頁面

sec:authorize=“hasRole()”,為具有相應權限的用戶設置可訪問的頁面

5.記住我及首頁定制

5.1記住我功能實現

登錄之后,關閉瀏覽器,登錄記錄就沒了,如果關閉瀏覽器再打開,還要顯示登錄的記錄,我們需要設置一個記住我的功能。

在配置類中添加以下代碼:

//實現記住我的功能http.rememberMe();

重啟項目,登錄頁多了一個記住我功能,關閉瀏覽器后重新打開,發現登錄記錄還存在。

檢查cookie發現,記住我被保存在cookie中,點擊注銷按鈕后,cookie中的記住我被刪除

結論:登錄成功后,將cookie發送給瀏覽器保存,以后登錄帶上這個cookie,只要通過檢查就可以免登錄了。如果點擊注銷,則會刪除這個cookie?。

5.2定制登錄頁

改變spring security默認的登錄頁為自定義的登錄頁

在剛才的登錄配置功能后添加logininpage

 //沒有權限自動跳到登錄頁面http.formLogin().loginPage("/tologin");

前端也要指向我們自定義的login請求

?我們登錄,需要將這些信息發送到哪里,我們也需要配置,login.html 配置提交請求及方式,方式必須為post:

 <form th:action="@{/usr/tologin}" method="post">

圖片實例:

?如果前端傳遞的參數username和password不是默認的,需要我們后臺處理一下

如果username和password是以下的內容

需要在配置類中設置一下,將對應的字段進行連接

 //沒有權限自動跳到登錄頁面http.formLogin().usernameParameter("/name").passwordParameter("/pwd").loginPage("/tologin");

?在登錄頁中增加記住我的按鈕

 <div class="field"><input type="checkbox" name="remeber">記住我</div>
//實現記住我的功能http.rememberMe().rememberMeParameter("remeber");

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87614.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#使用開源框架NetronLight繪制流程圖

之前使用MindFusion.Diagramming繪制流程圖確認很方便&#xff0c;只能試用版&#xff0c;如果長期使用&#xff0c;需要收費。 C#使用MindFusion.Diagramming框架繪制流程圖(2):流程圖示例_c# 畫流程圖控件-CSDN博客 這里找一個簡易開源框架NetronLight&#xff0c;GIT下載地…

支持向量機(SVM)在腦部MRI分類中的深入應用與實現

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…

AtCoder AT_abc413_c [ABC413C] Large Queue 題解

題目大意 有一個初始為空的序列 A A A&#xff0c; Q Q Q 次操作分為兩類&#xff1a; 第一類&#xff1a;將 c c c 個 x x x 放到 A A A 的末尾。第二類&#xff1a;將前 k k k 個數的和輸出并移除它們。 思路 這是一個求和問題&#xff0c;想到的第一個思路是前綴和…

「源力覺醒 創作者計劃」_文心大模型開源:開啟 AI 新時代的大門

在人工智能的浩瀚星空中&#xff0c;大模型技術宛如一顆璀璨的巨星&#xff0c;照亮了無數行業前行的道路。自誕生以來&#xff0c;大模型憑借其強大的語言理解與生成能力&#xff0c;引發了全球范圍內的技術變革與創新浪潮。百度宣布于 6 月 30 日開源文心大模型 4.5 系列&…

Git 怎么判斷是否沖突?

&#x1f4cc; [Q&A] Git 怎么判斷是否沖突&#xff1f; Git 使用的是三路合并算法&#xff08;Three-way Merge&#xff09;&#xff0c;它比較&#xff1a; 共同祖先提交&#xff08;base&#xff09; 當前分支的改動&#xff08;ours&#xff09; 被合并分支的改動&am…

在sf=0.1時測試fireducks、duckdb、polars的tpch

首先&#xff0c;從https://github.1git.de/fireducks-dev/polars-tpch下載源代碼包&#xff0c;將其解壓縮到/par/fire目錄。 然后進入此目錄&#xff0c;運行 SCALE_FACTOR0.1 ./run-fireducks.sh&#xff0c;腳本會首先安裝所需的包&#xff0c;編譯tpch的數據生成器&#x…

AWS多賬號管理終極指南:從安裝配置到高效使用

引言:為什么需要多賬號管理? 在云計算時代,企業使用多個AWS賬號已成為最佳實踐。根據AWS Well-Architected Framework,多賬號架構可以: 實現環境隔離(生產/測試/開發)滿足不同業務單元的安全要求簡化資源管理和成本分配符合合規性要求(如SOC2、ISO27001)本文將手把手…

UE5音頻技術

1 . 調制器 Modulator 調整參數 調制器可以使聲音每次音高都不一樣 2. 隨機 節點 3. 混音器 Mixer 混合兩個音頻 4. 串聯器 Concatenator 按循序播放 5.多普勒 Doppler 根據距離音頻變化 6.包絡線 Enveloper 武器充能發射 7.混響

創客匠人視角:創始人 IP 打造與知識變現的培訓賦能體系

在知識付費行業進入精耕期的當下&#xff0c;為何部分企業投入大量培訓卻收效甚微&#xff1f;創客匠人 CEO 老蔣通過服務 5W 知識博主的經驗指出&#xff1a;唯有將創始人 IP 思維與培訓體系深度融合&#xff0c;才能讓培訓成為知識變現的 “轉換器”。一、內訓體系重構&…

基于Java+SpringBoot的三國之家網站

源碼編號&#xff1a;S591 源碼名稱&#xff1a;基于SpringBoot的三國之家網站 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;20 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windows/Mac、…

推薦算法系統系列五>推薦算法CF協同過濾用戶行為挖掘(itembase+userbase)

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 配套視頻 推薦算法系統實戰全系列精品課【陳敬雷】 文章目錄 推薦算…

pytest之fixture中yield詳解

1. fixture——yield介紹 fixture的teardown操作并不是獨立的函數&#xff0c;用yield關鍵字呼喚teardown操作。前面通過fixture實現了在每個用例之前執行初始化操作&#xff0c;那么用例執行完之后&#xff0c;如需要清除數據&#xff08;或還原&#xff09;操作&#xff0c;…

Nginx 動靜分離原理與工作機制詳解:從架構優化到性能提升

前言&#xff1a;在 Web 應用架構不斷演進的今天&#xff0c;如何高效處理日益增長的訪問量和復雜的業務邏輯&#xff0c;成為開發者必須面對的挑戰。當我們在瀏覽器中打開一個網頁&#xff0c;那些直觀可見的 HTML 頁面、精美絕倫的圖片、流暢運行的 JavaScript 腳本&#xff…

介紹electron

一、Electron 是什么&#xff1f; Electron 是一個基于 Chromium 和 Node.js 的框架&#xff0c;允許開發者使用前端技術&#xff08;HTML/CSS/JavaScript&#xff09;構建原生桌面應用。其核心優勢在于&#xff1a; 跨平臺&#xff1a;一次開發&#xff0c;生成 Windows、ma…

DeepSeek與詭秘之主

1、大模型像個腐儒 其實從大模型的訓練方式來看&#xff0c;它算不上天賦異稟。尤其在成長階段&#xff0c;大模型那種種令人驚艷的表現&#xff0c;足夠讓人誤以為這是個天才。 可人這種生物&#xff0c;注定是貪婪的。在大模型成長后期&#xff0c;伴隨著各種技巧的驗證&…

動手實踐OpenHands系列學習筆記5:代理系統架構概述

筆記5&#xff1a;代理系統架構概述 一、引言 AI代理系統是一種能夠自主執行任務的智能軟件架構&#xff0c;OpenHands作為AI驅動的軟件開發代理平臺&#xff0c;擁有完整的代理系統架構設計。本筆記將探討AI代理架構的基本原理&#xff0c;并通過分析OpenHands核心架構&…

智能電動汽車 --- 車輛網關路由緩存

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

Spring中實現依賴注入(DI)的三種方式

1. Autowired 字段注入&#xff08;不推薦&#xff09;? Service public class UserService {Autowired // 直接在字段上注入private UserRepository userRepository; } ??原理??&#xff1a;Spring 啟動時掃描所有 Component、Service 等注解的類&#xff0c;發現 Aut…

Alpha系統聯結大數據、GPT兩大功能,助力律所管理降本增效

如何通過AI工具實現法律服務的提質增效,是每一位法律人都積極關注和學習的課題。但從AI技術火爆一下,法律人一直缺乏系統、實用的學習資料,來掌握在法律場景下AI的使用技巧。 今年5月,iCourt攜手貴陽律協大數據與人工智能專業委員會,聯合舉辦了《人工智能助力律師行業高質量發…

UI前端與數字孿生融合新趨勢:智慧家居的智能化控制與個性化服務

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構智慧家居的技術范式在智能家居滲透率快速提升的今天&#xf…