記錄SSM項目集成Spring Security 4.X版本 之 加密驗證和記住我功能

目錄

前言

一、用戶登錄密碼加密認證

二、記住我功能


前言

本次筆記的記錄是接SSM項目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架實現登錄和主頁菜單顯示-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/u011529483/article/details/136255768?spm=1001.2014.3001.5502

文章之后補全spring-security登錄時用戶認證進行密碼加密驗證和實現記住我功能。


一、用戶登錄密碼加密認證

1. 修改上一篇文章中的項目wqdemotwo的spring-security.xml配置文件

打開如下標紅的兩處配置:

什么意思呢?

<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean> 是在配置文件中聲明一個bean,實現BCryptPasswordEncoder類。

<security:password-encoder ref="passwordEncoder"/> 是將聲明的bean “passwordEncoder” 注入到?authentication-provider 中去。對應的?AuthenticationProvider 類是認證提供者。此處指定了myUserDetailsService 服務類(獲取用戶詳情,如 用戶名,密碼等)

2. 生成加密后的密碼,實現登錄認證

進入加密算法實現類:BCryptPasswordEncoder

進入接口:PasswordEncoder

encode()方法對明文密碼進行加密。我們調用這個方法對數據庫中的密碼進行加密:

此處我隨意找一個類生成加密密碼:就 LoginController 類吧

運行項目生成加密密碼:$2a$10$n/q4O15Lg9d1WvelfRu9i.qrgE5iVjTeD4.hXAqsLZaGRmTKoGxtK錄入到數據庫中。

完成,現在重新啟動項目查看登錄效果:用戶:zhangsan,密碼:123456

系統登錄成功:

執行loadUserByUsername查詢用戶詳情方法后,后臺打印結果,密碼加密了。

3. 補充說明

總結一下:整個登錄認證過程中我們并沒有做密碼的對比校驗,但是密碼輸入錯誤是無法登錄認證成功的。這是因為密碼比對交由 SpringSecurity 處理了,登錄頁面傳入 用戶名 通過詳情查詢方法loadUserByUsername 獲取了UserDetails(得到了數據庫中的用戶名和密碼)然后返回給了SpringSecurity 進行密碼校驗。

spring-security.xml 配置文件中注入了AuthenticationManager 身份驗證管理器類,AuthenticationProvider認證提供者類,PasswordEncoder接口的實現類等。執行時會執行一系列相關類(源碼就不研究了,有情懷的小伙伴可以試試)。最終完成用戶登錄認證。而?密碼的校驗是由BCryptPasswordEncoder類 通過實現PasswordEncoder接口 的matches方法來完成

我們可以來驗證一下。將數據庫中用戶zhangsan的密碼改回明文123456。此時運行項目進行登錄,結果是登錄失敗了:

后臺打印數據庫獲取的密碼是123456明文,小伙伴注意到下圖最后一行的紅字。

BCryptPasswordEncoder.matches Encoded password does not look like BCrypt:什么意思呢?就是BCryptPasswordEncode類的matches方法中報出了 密碼不屬于自己(BCrypt)的編碼格式,下圖:

matches方法中如果通過了編碼格式校驗則進入checkpw(rawPassword.toString(), encodedPassword)方法,rawPassword登錄頁面傳入的,encodedPassword數據庫中存儲的。所以密碼的校驗是由BCryptPasswordEncoder類 通過實現PasswordEncoder接口 的matches方法來完成

二、記住我功能

1. 將上篇文章項目wqdemotwo的spring-security.xml配置文件,打開如下兩處配置

說明:token-validity-seconds="300" 屬性指定免登錄訪問資源的維持時間,超過這個時間沒有任何資源請求,便需要重新登錄。

注意:第一次運行項目時要將<!--<property name="createTableOnStartup" value="true"/>--> 配置打開,createTableOnStartup屬性是當項目啟動時,springSecurity創建表存儲remember me相關信息,第二次啟動時要注釋這個屬性。

????說明:<property name="dataSource" ref="dataSource"/>指定數據庫數據源,如oracle。ref="dataSource"注入的是applicationContext.xml配置文件中的數據源,如下圖:

2. 修改登錄頁面

增加 記住我 復選框,如圖:

到此記住我功能配置完成,打開spring-security.xml文件的createTableOnStartup屬性運行項目,按預期設想應該在數據庫生成表PERSISTENT_LOGINS:

-- Create table
create table PERSISTENT_LOGINS
(username  VARCHAR2(64) not null,series    VARCHAR2(64) not null,token     VARCHAR2(64) not null,last_used TIMESTAMP(6) not null
);
-- Create/Recreate primary, unique and foreign key constraints 
alter table PERSISTENT_LOGINSadd primary key (SERIES)

登錄頁面選擇?記住我 登錄成功后,關閉瀏覽器可以實現免登錄再次訪問資源。

選擇?記住我?進行登錄,成功登錄了。此時我打開oracle數據庫生成了PERSISTENT_LOGINS表

頁面也成功訪問到資源:

此時關閉瀏覽器,再次打開瀏覽器因該可以不用登錄就可以直接訪問主頁面。但是我的想法是美好的,事實卻是訪問?http://localhost:8080/wqdemotwo_war/system/index?跳轉到了登錄頁面,經過努力查找原因是:spring-security.xml文件的?<security:intercept-url pattern="/**" access="isFullyAuthenticated()"/> 配置導致,需要改成 <security:intercept-url pattern="/**" access="isAuthenticated()"/> 這個。

isAuthenticated():Returns true if the user is not anonymous(如果用戶不是匿名的,則返回true)

isFullyAuthenticated(): Returns true if the user is not an anonymous or a remember-me user(如果用戶不是匿名用戶或記住我的用戶,則返回true)

修改后再次運行項目,便可以實現 記住我 功能,即:登錄成功后關閉瀏覽器,再次打開瀏覽器訪問資源可以免登錄訪問。(記住注釋掉spring-security.xml文件的<!--<property name="createTableOnStartup" value="true"/>-->屬性


好了,今天的記錄到此結束。

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

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

相關文章

Python列表的合并、重復、判斷與切片操作你學會了嗎

1.合并列表 通過 實現 list1 ["佛跳墻", "腸粉", "刀削面", "烤鴨"]list2 [32, 4, 5, 7.43, True]list3 list1 list2print(list3) # [佛跳墻, 腸粉, 刀削面, 烤鴨, 32, 4, 5, 7.43, True] 2.重復輸出列表中的元素 通過 * 實…

fastadmin 前端日期字段的添加和編輯

引言 fastadmin 項目中如果需要用到datetime字段的維護&#xff0c;可做如下處理&#xff1a; 1. add.html <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(開始)}:</label><div class"col-x…

vue3 中 主題定制

vue3 中 主題定制 背景 做多主題定制&#xff0c;黑/白 &#xff0c;里面還要再分各種顏色&#xff0c;每次進來都要記住上次的主題設置 效果圖 一、目錄結構 ├── generated │ ├── theme │ │ └── dark-yellow.ts │ │ └── dark-orange.ts │ │…

C++考試成績統計(類實現)

題目&#xff1a;有三名同學&#xff0c;在一次考試中三科成績分別如下表&#xff0c;請輸出三名同學的平均成績&#xff1a; 語文數學英語張三100100100李四9050100王五607080 #include <iostream> #include <string> /*考試成績統計*/ using namespace std;cla…

力扣:120. 三角形最小路徑和

動態規劃 1.先定義dp數組在下標i和下標j時的最小路徑和 &#xff0c;之后初始化dp數組值dp【0】【0】triangle.get(0).get(0)。再用for循環來遍歷數組dp【】的i&#xff0c;并賦值每行的下標為0的dp數組。之后再用for循環遍歷dp【i】【】的j&#xff0c;遞推公式來計算dp【i】…

「算法」常見位運算總結

位運算符 異或 按位異或可以實現無進位相加&#xff0c;所謂無進位相加&#xff0c;就是在不考慮進位的情況下將兩個數相加&#xff08;后面有道題需要用到這種操作&#xff09; 異或的運算律 ①a ^ 0 a ②a ^ a 0 ③a ^ b ^ c a ^ ( b ^ c ) 有符號右移>> 將一個…

IDEA切換 Springboot初始化 URL

&#x1f339;作者主頁&#xff1a;青花鎖 &#x1f339;簡介&#xff1a;Java領域優質創作者&#x1f3c6;、Java微服務架構公號作者&#x1f604; &#x1f339;簡歷模板、學習資料、面試題庫、技術互助 &#x1f339;文末獲取聯系方式 &#x1f4dd; 往期熱門專欄回顧 專欄…

Android基礎控件介紹

在Android應用程序開發中&#xff0c;使用基礎控件是非常常見的。這些控件允許您在用戶界面中顯示文本、圖像、按鈕等元素&#xff0c;以及接收用戶輸入。本文將介紹幾種常見的基礎控件&#xff0c;并給出每個控件在示例XML中使用的屬性的詳細說明。 1. TextView TextView 是…

云計算 2月20號 (認識操作系統)

1、認識操作系統 計算機系統的組成 知識點1&#xff1a;沒有軟件系統的計算機稱之為"裸機" 知識點2&#xff1a;裸機提供基本的可計算性資源 知識點3&#xff1a;操作系統是最靠近硬件的軟件層&#xff0c;負責管理和控制計算機硬件。 計算機硬件組成五大部件 運算器…

Chat GPT:智能對話的下一步

Chat GPT&#xff1a;智能對話的下一步 介紹 Chat GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一種基于Transformer架構的強大對話模型&#xff0c;可以產生自然流暢的回答&#xff0c;并實現人機對話的感覺。本文將探討Chat GPT在智能對話領域的影響和…

代碼隨想錄算法刷題訓練營day29:LeetCode(491)遞增子序列、LeetCode(46)全排列、LeetCode(47)全排列 II

代碼隨想錄算法刷題訓練營day29&#xff1a;LeetCode(491)遞增子序列、LeetCode(46)全排列、LeetCode(47)全排列 II LeetCode(491)遞增子序列 題目 代碼 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; im…

2024年AI全景預測

歡迎來到 2024 年人工智能和技術的可能性之旅。 在這里&#xff0c;每一個預測都是一個潛在的窗口&#xff0c;通向充滿創新、變革、更重要的是類似于 1950 年代工業革命的未來。 20 世紀 50 年代見證了數字計算的興起&#xff0c;重塑了行業和社會規范。 如今&#xff0c;人工…

老衛帶你學---leetcode刷題(242. 有效的字母異位詞)

242. 有效的字母異位詞 問題 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 示例 1: 輸入: s “anagram”, t “nagaram” 輸出: t…

力扣1143. 最長公共子序列(動態規劃)

Problem: 1143. 最長公共子序列 文章目錄 題目描述思路復雜度Code 題目描述 思路 我們統一標記&#xff1a;str1[i]代表text1表示的字符數組&#xff0c;str2[j]代表text2表示的字符數組&#xff1b;LCS代表最長的公共子序列&#xff1b;&#xff08;我們易得只有str1[i]和str…

Flutter中Widget的生命周期

Widget生命周期&#xff1a; createState-initState-didChangeDependency-build-deactive-dispose 可通過WidgetsBinding類對widget生命周期的回調進行監控。 createState&#xff1a;StatefulWidget 中用于創建 State&#xff1b; initState&#xff1a;State 的初始化操作&am…

CLion遠程調試C++

文件映射到 可以右鍵文件夾選擇重新Cmake 編譯

xsslabs第七關

源碼 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不錯&#xff01;"…

【刷題】Leetcode 1609.奇偶樹

Leetcode 1609.奇偶樹 題目描述廣度優先搜索&#xff08;BFS&#xff09;深度優先算法&#xff08;DFS&#xff09; 思路一&#xff08;BFS&#xff09;思路二&#xff08;DFS&#xff09;Thanks?(&#xff65;ω&#xff65;)&#xff89;謝謝閱讀&#xff01;&#xff01;&a…

ShardingSphere Narayana XA 事務不回滾問題定位

ShardingSphere Narayana XA 事務不回滾問題定位 問題背景 用戶反饋&#xff0c;在使用 ShardingSphere Narayana 執行 XA 事務時&#xff0c;發生報錯&#xff1a;java.sql.SQLException: javax.transaction.RollbackException: TransactionImple.enlistResource - ARJUNA0…

數字后端——DEF文件格式

文章目錄 MACRO的不同orientationDEF中在macro orientation定義前需要留空格 MACRO的不同orientation DEF中在macro orientation定義前需要留空格 像下圖中這種方向和分號之間沒有空格的情況&#xff0c;就是有問題的格式。