当前位置: 首页 > news >正文

记录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"/>-->属性


好了,今天的记录到此结束。

相关文章:

记录SSM项目集成Spring Security 4.X版本 之 加密验证和记住我功能

目录 前言 一、用户登录密码加密认证 二、记住我功能 前言 本次笔记的记录是接SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后补…...

[AutoSar]BSW_Com09 CAN driver 模块FULL(BASIC)CAN、FIFO选择

目录 关键词平台说明一、FULL CAN 和Basic CAN 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)autosar版本4.3.1 >>>>>回到总目录<&…...

WPF真入门教程30--顺风物流单据管理系统

1、教程回顾 到现在为止&#xff0c;真入门系列教程已完成了29刺由浅入深地讲解&#xff0c;当然不可能讲到了WPF的所有技能点&#xff0c;但读者看到了wpf的内部各种功能及之间的联系&#xff0c;在此基础上&#xff0c;提供一个完整有效的综合项目&#xff0c;本项目采用的是…...

Elasticsearch:向量相似度计算 - 可笑的速度

作者&#xff1a;Chris Hegarty 任何向量数据库的核心都是距离函数&#xff0c;它确定两个向量的接近程度。 这些距离函数在索引和搜索期间执行多次。 当合并段或在图表中导航最近邻居时&#xff0c;大部分执行时间都花在比较向量的相似性上。 对这些距离函数进行微观优化是值…...

两数相加的问题

题目是&#xff1a;给两个非空的链表&#xff0c;表示两个非负整数。它们每位数都是按照逆序的方式存储&#xff0c;并且每一个节点只能存储一位数字。现在两个数相加&#xff0c;并且以相同的形式返回一个表示和的链表。 首先回顾一下&#xff0c;什么是链表&#xff1f;链表…...

微信小程序的单位

在小程序开发中&#xff0c;rpx是一种相对长度单位&#xff0c;用于在不同设备上实现自适应布局。它是微信小程序特有的单位&#xff0c;表示屏幕宽度的 1/750。 rpx单位的好处在于可以根据设备的屏幕宽度进行自动换算&#xff0c;使得页面在不同设备上保持一致的显示效果。例…...

软考通过率真的低吗?

软考通过率有多少&#xff1f;高项有必要找培训机构吗&#xff1f; 相对来说软考的通过率的确比其他考试要低&#xff0c;因为它的知识点有点杂&#xff0c;专业知识、政策、计算机系统各个方面的知识都需要去掌握。根据以往的数据来说高项&#xff08;信息系统项目管理师&…...

国际视频编解码标准提案下载地址

H.266 相关提案下载地址&#xff1a;http://phenix.it-sudparis.eu/jvet/ 更新的地址&#xff1a;https://jvet-experts.org/ H.265 提案下载地址&#xff1a;http://phenix.int-evry.fr/jct/ 标准文档下载地址&#xff1a;http://www.itu.int/rec/T-REC-H.265 H.264 提案下载…...

程序员是如何看待“祖传代码”的?

文章目录 每日一句正能量前言祖传代码的历史与文化价值祖传代码的技术挑战与机遇祖传代码与现代开发实践的融合祖传代码的管理与维护策略后记 每日一句正能量 黎明时怀着飞扬的心醒来&#xff0c;致谢爱的又一天&#xff0c;正午时沉醉于爱的狂喜中休憩&#xff0c;黄昏时带着感…...

Python爬虫之爬取并下载哔哩哔哩视频

亲自使用过&#xff0c;太好用了 # 导入requests模块&#xff0c;模拟发送请求 import requests # 导入json import json # 导入re import re# 定义请求头 headers {Accept: */*,Accept-Language: en-US,en;q0.5,User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6…...

python 脚本设置输出颜色

在Python脚本中设置输出颜色&#xff0c;通常可以使用colorama库&#xff0c;它可以在Windows、Linux和macOS等平台上工作。colorama库扩展了Python的标准库&#xff0c;使得在控制台输出彩色文本更加简单。 首先&#xff0c;你需要安装colorama库。如果你还没有安装&#xff…...

安卓websocket(客服端和服务端写在app端) 案例

废话不多说直接上代码 首选导入 implementation "org.java-websocket:Java-WebSocket:1.4.0" package com.zx.qnncpds.androidwbsocket;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;import a…...

C++面试宝典第34题:整数反序

题目 给出一个不多于5位的整数, 进行反序处理。要求: 1、求出它是几位数。 2、分别输出每一位数字。仅数字间以空格间隔, 负号与数字之间不需要间隔。如果是负数,负号加在第一个数字之前, 与数字没有空格间隔。注意:最后一个数字后没有空格。 3、按逆序输出各位数字。逆序后…...

微信商城小程序设计

简介 完整实现了集下单、支付、物流、评价、退款等功能的微信商城版小程序以及商城的管理后台&#xff0c;涉及商品的分类、规格的配置&#xff0c;商品上架等等。 产品效果图 项目链接 java后台&#xff1a;mall微信商城: 微信商城小程序。完整实现了集下单、支付、物流、评…...

如何合理布局子图--确定MATLAB的subplot子图位置参数

确定MATLAB的subplot子图位置参数 目录 确定MATLAB的subplot子图位置参数摘要1. 问题描述2. 计算过程2.1 确定子图的大小和间距2.2 计算合适的figure大小2.3 计算每个子图的position数据 3. MATLAB代码实现3.1 MATLAB代码3.2 绘图结果 4. 总结 摘要 在MATLAB中&#xff0c;使用…...

【MySQL】基于Docker搭建MySQL一主二从集群

本文记录了搭建mysql一主二从集群&#xff0c;这样的一个集群master为可读写&#xff0c;slave为只读。过程中使用了docker&#xff0c;便于快速搭建单体mysql。 1&#xff0c;准备docker docker的安装可以参考之前基于yum安装docker的文章[1]。 容器相关命令[2]。 查看正在…...

k8s 集群调度,标签,亲和性和反亲和性,污点和容忍,pod启动状态 排错详解

目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签&#xff08;Add Labels&#xff09;&#xff1a; 更新标签&#xff08;Update Labels&#xff09; 删除标…...

Idea 启动报错 failed to create jvm:jvm path url

1、情况 针对于在 idea 中&#xff0c;通过界面的形式改了 -Xmx 等类似的参数&#xff0c;并且设置的值过大&#xff0c;导致下次启动 idea 报错 2、解决 找到如图所示的文件 打开编辑该文件&#xff0c;把类似 -Xmx 等参数的值调小&#xff0c;保存文件并关闭&#xff0…...

20款Visual Studio实用插件推荐

前言 俗话说的好工欲善其事必先利其器&#xff0c;安装一些实用的Visual Studio插件对自己日常的开发和工作效率能够大大的提升&#xff0c;避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件&#xff0c;希望对大家有所帮助。 各位小伙伴有更好的…...

基于SpringBoot的在线拍卖系统

目录 1、 前言介绍 2、主要技术 3、系统流程和逻辑 4、系统结构设计 5、数据库设计表 6、运行截图(部分) 6.1管理员功能模块 6.2用户功能模块 6.3前台首页功能模块 7、源码获取 基于SpringBoot的在线拍卖系统录像 1、 前言介绍 随着社会的发展&#xff0c;社会的各行…...

Playwright 浏览器自动化完全指南:从入门到实战

目录 一、什么是 Playwright二、Playwright vs Selenium&#xff1a;为什么选择 Playwright三、支持的语言与浏览器四、核心架构与执行流程五、环境安装与验证六、第一个程序&#xff1a;打开网页并截图七、常用操作速查八、元素定位详解九、自动等待机制深度解析十、浏览器上…...

Python异步编程深度解析:从asyncio到实战应用

Python异步编程深度解析&#xff1a;从asyncio到实战应用 引言 异步编程是现代Python后端开发中不可或缺的技能。作为从Python转向Rust的后端开发者&#xff0c;我发现Python的异步生态非常成熟&#xff0c;尤其是asyncio库提供了强大的异步编程能力。本文将深入探讨Python异步…...

小波分析多尺度数据融合算法应用【附算法】

✨ 长期致力于小波分析、多尺度数据融合、MEMS陀螺、Allan方差研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;小波域多尺度融合定理证明与算法框架&a…...

LeetCode 930:和相同的二元子数组 | 前缀和与哈希表

LeetCode 930&#xff1a;和相同的二元子数组 | 前缀和与哈希表 引言 和相同的二元子数组&#xff08;Binary Subarrays With Sum&#xff09;是 LeetCode 第 930 题&#xff0c;难度为 Medium。题目要求在二元数组&#xff08;元素只有 0 和 1&#xff09;中找出子数组和等于 …...

14000华夏之光永存:开源:华为五大全栈硬核技术揭榜课题完整梳理(预刊抽取篇)

开源&#xff1a;华为五大全栈硬核技术揭榜课题完整梳理&#xff08;预刊抽取篇&#xff09; 摘要 本文完整收录黄大年茶思屋珠峰会战第八期5项前沿技术揭榜难题&#xff0c;原样保留技术背景、技术挑战、现有方案、现存缺陷与量化技术诉求&#xff0c;不做内容删减与篡改。本文…...

潜变量扩散模型原理解析:从宝可梦生成看LDM工程落地

1. 项目概述&#xff1a;用宝可梦讲清楚潜变量扩散模型&#xff0c;不是比喻游戏&#xff0c;是真能跑通的原理复现你有没有试过让AI画一只“皮卡丘和喷火龙杂交出来的电火属性神兽”&#xff1f;不是简单拼贴&#xff0c;而是真正理解“电系的毛发质感火系的鳞片过渡神兽级别的…...

加拿大AI治理实战:风险分级、监管沙盒与可信AI工程化落地

1. 项目概述&#xff1a;这不是一场技术秀&#xff0c;而是一场制度设计的实战演练“Canada’s AI Ambitions: Navigating the Future of AI Governance”——这个标题里没有一行代码&#xff0c;不提一个模型参数&#xff0c;却直指当前全球AI发展最棘手、最易被忽视的底层命题…...

FlashAttention的水印攻击:怎么知道你的模型被偷用或篡改了?

之前有个公司发现&#xff0c;他们的Llama-2-7B模型被人克隆了一份&#xff0c;部署在了另一个云服务上。巧的是&#xff0c;那个克隆模型的输出跟他们的一模一样——连生成风格都一样。 他们去查代码&#xff0c;发现对方的代码里也用了npu_flash_attention。他们想知道&…...

2026数字营销专业学数据分析的职业优势

一、数字营销与数据分析的融合趋势2026年数字营销领域将进一步依赖数据驱动决策。随着消费者行为数字化程度加深&#xff0c;企业需通过数据分析实现个性化营销、动态定价和实时优化。复合型人才需同时掌握营销策略与数据建模能力&#xff0c;以应对跨渠道归因、隐私安全等复杂…...

基于Multisim的四路带计分系统抢答器设计与仿真

摘要&#xff1a;本项目设计了一个四路带计分系统的智能抢答器&#xff0c;具有声光显示、计时和计分功能。使用Multisim 14.3进行电路设计 与仿真验证。项目简介本项目设计了一个基于Multisim的四路带计分系统智能抢答器&#xff0c;采用74系列数字逻辑芯片实现纯硬件电路设计…...