Spring Security --- 自定义登录逻辑

目录

UserDetailsService详解

返回值

方法参数

异常

PasswordEncoder密码解析器详解

接口介绍

内置解析器介绍

BCryptPasswordEncoder简介

代码演示

自定义登录逻辑

编写配置类

自定义逻辑


  • UserDetailsService详解

  • 当什么也没有配置的时候,账号和密码是由Spring Security定义生成的
  • 而在实际项目中账号和密码都是从数据库中查询出来的
  • 所以我们要通过自定义逻辑控制认证逻辑
  • 如果需要自定义逻辑时,只需要实现UserDetailsService接口即可
  • 接口定义如下:

  • 返回值

  • 返回值UserDetails是一个接口,定义如下:

  • 要想返回UserDetails的实例就只能返回接口的实现类
  • Spring Security中提供了如下的实例
  • 我们只需要使用里面的User类即可
  • 注意User的全限定路径是:
  • org.springframework.security.core.userdetails.User
  • 此处经常和系统中自己开发的User类弄混
  • 在User类中提供了很多方法和属性

  • 其中构造方法有两个,调用其中任何一个都可以实例化UserDetails实现类User类的实例
  • 而三个参数的构造方法实际上也是调用7个参数的构造方法

  • username:用户名
  • password:密码
  • authorities:用户具有的权限;此处不允许为null
  • 此处的用户名应该是客户端传递过来的用户名
  • 而密码应该是从数据库中查询出来的密码
  • Spring Security会根据User中的password和客户端传递过来的password进行比较
  • 如果相同则表示认证通过,如果不相同表示认证失败
  • authorities里面的权限对于学习授权是很有必要的,包含的所有内容为此用户具有的权限,如有里面没有包含某个权限,而在做某个事情时必须包含某个权限则会出现403
  • 通常都是通过AuthorityUtils.commaSeparatedStringToAuthorityList("")来创建authorities集合对象的
  • 参数时一个字符串,多个权限使用逗号分隔
  • 方法参数

  • 方法参数表示用户名
  • 此值是客户端表单传递过来的数据
  • 默认情况下必须叫username,否则无法接收
  • 异常

  • UsernameNotFoundException 用户名没有发现异常
  • 在loadUserByUsername中是需要通过自己的逻辑从数据库中取值的
  • 如果通过用户名没有查询到对应的数据,应该抛出UsernameNotFoundException,系统就知道用户名没有查询到
  • PasswordEncoder密码解析器详解

  • Spring Security要求容器中必须有PasswordEncoder实例
  • 所以当自定义登录逻辑时要求必须给容器注入PaswordEncoder的bean对象
  • 接口介绍

  • encode():把参数按照特定的解析规则进行解析
  • matches():验证从存储中获取的编码密码与编码后提交的原始密码是否匹配
    • 如果密码匹配,则返回true
    • 如果不匹配,则返回false
    • 第一个参数表示需要被解析的密码;第二个参数表示存储的密码
  • upgradeEncoding():如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false;默认返回false

  • 内置解析器介绍

  • 在Spring Security中内置了很多解析器

  • BCryptPasswordEncoder简介

  • BCryptPasswordEncoder是Spring Security官方推荐的密码解析器
  • BCryptPasswordEncoder是对bcrypt强散列方法的具体实现
  • 是基于Hash算法实现的单向加密
  • 可以通过strength控制加密强度,默认10
  • 代码演示

  • 在项目src/test/java下新建com.msb.MyTest测试BCryptPasswordEncoder用法

  • 自定义登录逻辑

  • 当进行自定义登录逻辑时需要用到之前讲解的UserDetailsService和PasswordEncoder
  • 但是Spring Security要求:当进行自定义登录逻辑时容器内必须有PasswordEncoder实例
  • 所以不能直接new对象
  • 编写配置类

  • 新建类 com.msb.config.SecurityConfig 编写下面内容

  • 自定义逻辑

  • 在Spring Security中实现UserDetailService就表示为用户详情服务
  • 在这个类中编写用户认证逻辑

  • 重启项目后,在浏览器中输入账号:admin,密码:123,后可以正确进入到login.html页面

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机设计的呼吸灯

一、项目介绍 呼吸灯是一种常见的LED灯光效果,它可以模拟人类呼吸的变化,使灯光看起来更加柔和和自然。51单片机是一种广泛使用的微控制器,具有体积小、功耗低、成本低等优点,非常适合用于控制LED呼吸灯。本项目的呼吸灯将使用PWM(脉冲宽度调制)技术控制LED亮度,从而实…

ES6学习笔记

作用域 1.4垃圾回收机制 内存的生命周期 JS环境中分配的内存,一般有如下生命周期 内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存1.2.内存使用:即读写内存,也就是使用变量、函数等内存回收: 使用完毕,由…

BRC20赛道的刚需基础设施,BrccSwap如何延续新的造富神话?

引言 BRC20代币和去中心化交易所的背景 BRC20代币赛道的刚需SWAP BrccSwap如何延续新的造富神话 结语 引言 随着加密货币市场的不断发展,BRC20代币和去中心化交易所成为了越来越受欢迎的概念。BRC20代币是建立在比特币区块链上的代币,具有高级别的…

Dalamud 插件开发白皮书 P1 - Getting started

文章目录 从哪里开始 How do I get started?Dalamud 插件例子Dalamud 底层探究XIVLauncher 启动器 在哪里寻找帮助 Where do I ask for help?如何热重载插件 How do I hot-reload my plugin?如何调试插件,甚至游戏?如何在编码过程中使用 How do I use…

浅谈微前端

本文呢是我梳理的一个扫盲文,由于最近团队准备使用微前端对项目进行改造,所以我呢就先浅了解一下: 微前端到底是什么? 为什么要使用微前端? 都有哪些微前端方案? 微前端有什么不好的地方吗? 通过…

手动渲染农场和自助云渲染农场的区别

手动渲染农场和自助云渲染农场是两种常见的渲染方式,它们各有优缺点。手动渲染农场指的是在本地使用自己的硬件设备进行渲染,而自助云渲染农场则是利用云服务商提供的计算资源进行渲染。对于需要渲染大规模项目的设计师或工作室来说,选择一种…

C++11学习笔记(3)——通用工具(上)(包含重要特性智能指针Smart pointer)

1.Pair 在C11中&#xff0c;std::pair是一个模板类&#xff0c;用于将两个值组合成一个单元。它可以将两个不同的类型的值配对在一起&#xff0c;并且提供了对这对值的访问和操作。 std::pair的定义 template<class T1, class T2> struct pair{T1 first;T2 second; };…

【JAVA开发环境配置】 卸载JDK很简单, 一分钟帮你搞定!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

Context Prior for Scene Segmentation--CVPR, 2020

Context Prior for Scene Segmentation–CVPR, 2020 文章目录 Context Prior for Scene Segmentation--CVPR, 2020一、背景介绍二、方法介绍1.A的生成2.Affinity Loss3.如何从 X X X获取P4.Y操作 一、背景介绍 问题&#xff1a;现阶段&#xff0c;不少语义分割方法所限于卷积结…

Android12之如何查看hidl服务(一百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

软件项目管理需要具备哪些能力?

作为一名软件项目管理者&#xff0c;在处理许多事情时需要不断提高个人在数据分析处理、项目业务流程管理等各个领域的能力。当然作为过来人&#xff0c;我也很清楚很多软件项目管理新人也较为疑惑如何提高自己的能力和专业水平&#xff0c;以便提高工作效率。那我也想与大家唠…

开源反分裂与数字大同世界

这是一篇报告的读后感&#xff0c;这篇报告是由Linux基金会研究部门发布的&#xff0c;名为《助力全球协作——开源代码的领导者如何面对分裂的挑战》。 这份报告的主要内容包括&#xff1a; - 开源代码开发中的分裂及其利弊- 开源的国际化&#xff0c;以及项目领导者如何克服参…

Python3数据分析与挖掘建模(16)特征降维与特征衍生

1. 特征降维&#xff08;PCA&#xff09; 回顾知识点&#xff1a; 特征降维是指将高维特征空间的数据映射到低维空间的过程&#xff0c;以减少特征的数量并保留数据的主要信息。下面是特征降维的一般步骤&#xff1a; &#xff08;1&#xff09;求特征协方差矩阵&#xff1a…

可调电源LM317 的内部原理 - 特殊的电压跟随器

之前一直没想过这类LDO 内部是怎么整的&#xff0c;它似乎是用一个分压电路采集它输出的电压作为参考&#xff0c;然后却能把输出电压稳定下来&#xff0c;颇有种左脚踩右脚上天的意思。典型的LM317 电路如下&#xff1a; 如果是个普通的电压跟随器&#xff0c;无论是基于三极管…

牛客小白月赛56

今天无聊vp了一下 A.省略 B.最优肯定是全部都是1 C.直接统计每个余数下可以填多少个数&#xff0c;然后排序从小到大的排序输出即可 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #inc…

【八大排序(六)】快排终极篇-快速排序非递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 快排非递归版 1. 前情回顾2. 快排非递归基…

windows10家庭版禁用Device/Credential Guard解决方案

文章目录 背景&#xff08;禁用的原因&#xff09;解决的方式方式一&#xff1a;通过Windows本身的功能设置禁用 ( 非家庭版的使用)1. 禁用Device Guard或Credential Guard&#xff1a;2. 关闭Hyper-V选项3. 重启电脑 方式二&#xff1a;通过命令关闭Hyper-V ( Windows 10家庭版…

java三大特性之【多态】

多态 1.1 概念1.2 实现条件1.3 方法重写&#xff08;override&#xff09;与方法重载&#xff08;overload&#xff09;1.4 向上转型1.5 向下转型 1.1 概念 同样的一个方法/行为&#xff0c;经过不同的对象&#xff0c;表现出不同的行为&#xff0c;这样的现象就称为多态。 举…

二叉搜索树之AVL树

目录 1.概念 2.定义 3.插入 4.旋转 1. 新节点插入较高左子树的左侧---右单旋 2. 新节点插入较高右子树的右侧---左单旋 3. 新节点插入较高左子树的右侧&#xff1a;先左单旋再右单旋【左右双旋】 4. 新节点插入较高右子树的左侧---右左&#xff1a;先右单旋再左单旋【右…

I.MX6ULL_Linux_驱动篇(37) linux系统定时器

定时器是我们最常用到的功能&#xff0c;一般用来完成定时功能&#xff0c;本章我们就来学习一下 Linux 内核提供的定时器 API 函数&#xff0c;通过这些定时器 API 函数我们可以完成很多要求定时的应用。 Linux内核也提供了短延时函数&#xff0c;比如微秒、纳秒、毫秒延时函数…