记录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.mzph.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.重复输出列表中的元素 通过 * 实…

vue3 中 主题定制

vue3 中 主题定制 背景 做多主题定制&#xff0c;黑/白 &#xff0c;里面还要再分各种颜色&#xff0c;每次进来都要记住上次的主题设置 效果图 一、目录结构 ├── generated │ ├── theme │ │ └── dark-yellow.ts │ │ └── dark-orange.ts │ │…

「算法」常见位运算总结

位运算符 异或 按位异或可以实现无进位相加&#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; 往期热门专栏回顾 专栏…

云计算 2月20号 (认识操作系统)

1、认识操作系统 计算机系统的组成 知识点1&#xff1a;没有软件系统的计算机称之为"裸机" 知识点2&#xff1a;裸机提供基本的可计算性资源 知识点3&#xff1a;操作系统是最靠近硬件的软件层&#xff0c;负责管理和控制计算机硬件。 计算机硬件组成五大部件 运算器…

代码随想录算法刷题训练营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;人工…

力扣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…

数字后端——DEF文件格式

文章目录 MACRO的不同orientationDEF中在macro orientation定义前需要留空格 MACRO的不同orientation DEF中在macro orientation定义前需要留空格 像下图中这种方向和分号之间没有空格的情况&#xff0c;就是有问题的格式。

数学学习与研究杂志社《数学学习与研究》杂志社编辑部2023年第29期目录

考试研究 提高高三数学二轮复习质量的思考与实践 佘淮青; 2-4 提升高三数学复习质量的策略探究 王飞; 5-7 核心素养背景下的高中数学命题策略研究 陈明发; 8-10 提升中考数学复习课的有效性研讨 韩兴宏; 11-13 中学教学方法《数学学习与研究》投稿&#xff1a;…

pyuic生成py文件到指定文件夹

pyuic生成py文件到指定文件夹 关于如何在pycharm配置外部工具的方法这里不做赘述&#xff0c;本文主要说明&#xff0c;如何利用pyuic将ui文件生成到指定的项目目录中。 前提条件&#xff1a;已配置的pyuic工具可以正常使用生成文件到目录中。 一、打开外部工具配置页面 打开…

如何用Python检查时间序列数据是否平稳?

时间序列数据通常以其时间性质为特征。这种时间性质为数据增加了趋势或季节性&#xff0c;使其与时间序列分析和预测兼容。如果时间序列数据不随时间变化或没有时间结构&#xff0c;则称其为静态数据。因此&#xff0c;检查数据是否平稳是非常必要的。在时间序列预测中&#xf…

用HTML5的<canvas>元素实现刮刮乐游戏

用HTML5的<canvas>元素实现刮刮乐 用HTML5的<canvas>元素实现刮刮乐&#xff0c;要求&#xff1a;将上面的“图层”的图像可用鼠标刮去&#xff0c;露出下面的“图层”的图像。 示例从简单到复杂。 简单示例 准备两张图像&#xff0c;我这里上面的图像top_imag…

7、Redis-事务、持久化、内存淘汰机制和过期key处理

目录 一、事务 二、持久化 三、内存淘汰机制 四、过期key处理 一、事务 Redis的事务本质上就是一个批量执行命令的操作。分为三个步骤&#xff1a; 开始事务&#xff1a;multi命令入队&#xff1a;正常输入命令即可执行事务&#xff08;依次执行命令&#xff09;&#xf…

不是我吹,这8道HashMap面试题让你面试时对答如流

前言 又到了一年一度的金三银四面试季&#xff0c;我们拿着自己的面试秘籍去面试&#xff0c;但是面试官的问题五花八门&#xff0c;让我们摸不清他们的套路。今天我就总结了面试时必问的hashmap面试题&#xff0c;无论面试官怎么问&#xff0c;我们都对答如流。 另外本人整理了…

java小记(2)

IS-A&#xff1a;类的父子继承关系。 default&#xff1a;关键字&#xff0c;与Java中的public&#xff0c;private等关键字一样&#xff0c;都属于修饰符关键字&#xff0c;可以用来修饰属性、方法以及类&#xff0c;但是default一般用来修饰接口中的方法。 接口与抽象类的区…