当前位置: 首页 > 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;社会的各行…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...