怎么自定义spring security对用户信息进行校验及密码的加密校验

先写一个spring security需要校验的字段类

其实UserDetails的子类的user已经有很多字段和功能,但是如果我们需要扩展的话就要重写UserDetails中的方法

package com.lzy.security;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.SpringSecurityCoreVersion;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.util.Assert;import java.util.Collection;
import java.util.Collections;
import java.util.Set;public class AccountUser implements UserDetails {//加上idprivate Long userId;private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;private static final Log logger = LogFactory.getLog(User.class);private String password;private final String username;private final Collection<?extends GrantedAuthority> authorities;private final boolean accountNonExpired;private final boolean accountNonLocked;private final boolean credentialsNonExpired;private final boolean enabled;public AccountUser(Long userId,String username, String password, Collection<? extends GrantedAuthority> authorities) {this(userId,username, password, true, true, true, true, authorities);}public AccountUser(Long userId,String username, String password, boolean enabled, boolean accountNonExpired,boolean credentialsNonExpired, boolean accountNonLocked,Collection<? extends GrantedAuthority> authorities) {Assert.isTrue(username != null && !"".equals(username) && password != null,"Cannot pass null or empty values to constructor");this.username = username;this.userId = userId;this.password = password;this.enabled = enabled;this.accountNonExpired = accountNonExpired;this.credentialsNonExpired = credentialsNonExpired;this.accountNonLocked = accountNonLocked;this.authorities = authorities;}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return this.authorities;}@Overridepublic String getPassword() {return this.password;}@Overridepublic String getUsername() {return this.username;}@Overridepublic boolean isAccountNonExpired() {return this.accountNonExpired;}@Overridepublic boolean isAccountNonLocked() {return this.accountNonLocked;}@Overridepublic boolean isCredentialsNonExpired() {return this.credentialsNonExpired;}@Overridepublic boolean isEnabled() {return this.enabled;}
}

这里获取数据行对象,并且返回我们需要校验的字段

package com.lzy.security;import com.lzy.entity.SysUser;
import com.lzy.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;import java.util.List;
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@AutowiredISysUserService sysUserService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//根据用户名查询用户信息SysUser sysUser = sysUserService.getByUsername(username);if (sysUser == null) {throw new UsernameNotFoundException("用户名不存在");}return new AccountUser(sysUser.getId(),sysUser.getUsername(),sysUser.getPassword(),getUserAuthority(sysUser.getId()));}public List<GrantedAuthority> getUserAuthority(Long userId) {//根据用户id查询用户权限return null;}
}

最后在spring security的配置文件中

注入

    @AutowiredUserDetailsServiceImpl userDetailsServiceImpl;

重写他的方法

    @Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsServiceImpl);}

最后,注释配置文件中的默认账号密码

  security:user:name: lzypassword: 123456

密码的加密校验

先引入BCryptPasswordEncoder 

    @BeanBCryptPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}

再在显示配置中对他进行一个配置

    @Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsServiceImpl).passwordEncoder(passwordEncoder());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA-常见八股文(4)-内部类和匿名内部类

【参考文献】 Java 中的内部类与匿名内部类详解_内部类和匿名内部类-CSDN博客 内部类以及匿名内部类详解_匿名内部类的作用-CSDN博客 1.内部类 将一个类 A 定义在另一个类 B 里面&#xff0c;里面的那个类 A 就称为内部类&#xff0c;B 则称为外部类。 特点&#xff1a; 内…

Git(分布式版本控制系统)

git介绍&#xff1a; git官网&#xff1a;https://gitee.com/ Git工具安装 Git 公司 (git-scm.com)https://git-scm.com/ git本地配置账号和邮箱 一般刚安装Git都要配置用户名、密码和邮箱&#xff0c;因为你提交代码到本地仓库&#xff08;上传代码到远程仓库&#xff09;时…

Nginx的Rewrite和Location配置

目录 一、Rewrite模块 1.功能概述 1.1URL重写 1.2URL重定向 1.3条件判断 1.4重写规则的执行顺序 2.语法格式 2.1Flag说明 3. Rewrite跳转实现 4.常用的Nginx正则表达式 二、Location模块 1.概述 2.分类 2.1精准匹配&#xff08;&#xff09; 2.2前缀匹配…

游戏如何对抗 IL2cppDumper逆向分析

众所周知&#xff0c;Unity引擎中有两种脚本编译器&#xff0c;分别是 Mono 和 IL2CPP 。相较于Mono&#xff0c;IL2CPP 具备执行效率高、跨平台支持等优势&#xff0c;已被大多数游戏采用。 IL2CPP 模式下&#xff0c;可以将游戏 C# 代码转换为 C 代码&#xff0c;然后编译为…

el-form只对rules中个别字段进行校验

正常属性校验方式 const moveToErr () > {const errorDom document.getElementsByClassName(el-form-item__error);console.log(errorDom)if (errorDom.length) {errorDom[0].scrollIntoView({block: center,behavior: smooth})} };const saveItem async (formEl?: For…

android 折叠屏展开收起监听

折叠屏在展开和收起时&#xff0c;屏幕的物理尺寸会发生变化。你可以通过注册一个ComponentCallbacks2的实例来监听屏幕大小的变化。这个接口提供了onConfigurationChanged(Configuration newConfig)方法&#xff0c;当设备的配置发生变化时&#xff08;包括屏幕大小和方向&…

python爬虫——入门

一、概念 万维网之所以叫做网&#xff0c;是因为通过点击超链接或者进入URL&#xff0c;我们可以访问任何网络资源&#xff0c;从一个网页跳转到另一个网页&#xff0c;所有的相关资源连接在一起&#xff0c;就形成了一个网。 而爬虫呢&#xff0c;听名字就让人想起来一个黏糊…

string类题目(上)

string类题目 题目来源&#xff08;Leetcode&#xff09; 题目一&#xff1a;仅仅反转字母 分析 这个反转的特点在于只反转字母&#xff0c;不反转特殊字符。 法一&#xff1a;如果我们让一个正向迭代器指向第一个字符&#xff0c;让一个反向迭代器指向最后一个字符&#xf…

kafka常用命令汇总

文章目录 命令1命令2命令3命令4命令5命令6命令7命令8命令9 其他说明提示:以下是本篇文章正文内容,Kafka 0.9.x 及更高版本中使用 在使用 Kafka 命令行工具时,–zookeeper 和 --bootstrap-server 参数用于指定不同的连接信息,具体取决于你使用的命令以及 Kafka 版本。 --zo…

ch32v307vct6从头移植FreeRTOS

使用官方的ide可以直接创建带FreeRTOS的工程&#xff0c;但是不利于我们学习移植&#xff0c;所以特此记录怎么从头开始移植FreeRTOS到CH32V307VCT6芯片使用。 下载FreeRTOS源码 首先进入https://www.freertos.org/官网&#xff0c;然后找到如下Download字样&#xff0c;进入下…

华为云通过自定义域名访问桶内对象

问题&#xff1a;通过将自定义域名绑定至OBS桶实现在线预览文件 例如index.html入口文件 且记 自定义域名绑定暂时不支持HTTPS访问方式&#xff0c;只支持HTTP访问方式 自定义域名就先不用部署https证书。 配置完毕之后&#xff0c;将obs桶设置为公开的即可访问 如何在浏览…

Redis为什么会阻塞

Redis的一些阻塞点 BigKey删除&#xff0c;删除数据库&#xff0c;AOF日志同步聚合操作&#xff0c;全量查询操作&#xff0c;从库读取RDB文件。 其中删除BigKey&#xff0c;AOF日志&#xff0c;删除数据库可以异步执行。 聚合操作&#xff0c;全量查询&#xff0c;从库读取RD…

Mysql 集群技术

Mysql在服务器中的部署方法 安装MySQL依赖性 rootmysql-node10 ~]# dnf install cmake gcc-c openssl-devel \ ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 下载并解压源码包 使用命令tar zxf mysql-boost-5.7.44.tar.gz进行解压 源码编译安…

硬件面试经典 100 题(81~90)题

81、请问下图电路中二极管 D1、D2 有什么作用&#xff1f; 在 Vi 输入电压接近于零时&#xff0c;D1、D2 给三极管 T1、T2 提供偏置电压&#xff0c;使 T1、T2 维持导通&#xff0c;以消除交越失真。 陈氏解释 这道题参见&#xff1a;硬件面试经典 100 题&#xff08;51~70 题…

【自动化】一共获取6600多公司信息【逆向】一页15还加密。

一、【逆向】一页15还加密。 二、【自动化】一共获取6600多公司信息 三、对于两种方式我喜欢第二种自动化 from DrissionPage import ChromiumPage, ChromiumOptions import time # chrome:version co = ChromiumOptions().set_paths(browser_path=r"C:\Users\lenovo\A…

【Java EE】深入理解 Java 线程的生命周期与状态转换

多线程编程在 Java 中是实现高效并发的核心技术之一。每个线程在其生命周期内会经历多个状态&#xff0c;这些状态反映了线程在特定时间点的行为与系统资源的使用情况。了解线程的状态及其转换机制&#xff0c;对于编写健壮的并发程序尤为重要。本文将深入探讨 Java 线程的六种…

python 零星知识点

一、头部注释 在Python脚本中&#xff0c;头部注释&#xff08;也称为文档字符串或模块级注释&#xff09;用于提供关于脚本的元数据和描述信息。除了指定解释器和编码方式外&#xff0c;还可以包含其他信息。以下是一些常见的头部注释示例&#xff1a; 1.模块描述 "&qu…

【MySQL】MySQL表的增删改查(初阶)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 表内容操作 插入内容 按顺序插入 指定某些列插入 一次插入多行记录 插入时间 查询表内容 全列查询 指定列查询 指定表达式查询 用as取别名 ​编辑 去重查询 排序查询…

不同搜索引擎蜘蛛的功能、‌抓取策略与技术实现差异探究

搜索引擎作为互联网信息检索的重要工具&#xff0c;‌其核心功能依赖于背后的“蜘蛛”程序。‌这些蜘蛛程序负责访问互联网上的各种内容&#xff0c;‌并建立索引数据库&#xff0c;‌以便用户能够快速准确地找到所需信息。‌然而&#xff0c;‌不同搜索引擎的蜘蛛在功能、‌抓…

Axios介绍;前后端分离开发的介绍;YAPI的使用;Vue项目简介、入门;Elementui的使用;nginx介绍

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xf…