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

news2024/11/26 18:29:44

目录

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页面

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

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

相关文章

Vue3:计算属性、监听器

computed 计算属性 计算属性是指 基于现有状态派生 (演变) 出新的状态,现有状态发生变化,派生状态重新计算。 computed 接收回调函数作为参数,基于回调函数中使用的响应式数据进行计算属性的创建,回调函数的返回值就是基于现有状态…

软件测试什么样的技术栈才能进入大厂

我们知道,能在一线大厂工作是大多数人的目标,不仅薪酬高,技能提升快,而且能得到公司影响力背书,将来就算跳槽也能带来光环加持。 最近疫情的影响,网上也爆出了一些裁员新闻,可以说这个疫情确实…

【深入浅出密码学】RSA

RSA密码体制 引言: RSA加密的本意并不是为了取代对称密码,而且它比诸如AES的密码要慢很多,因为RSA当中涉及许多数学计算,RSA通常和类似AES的对称密码一起使用,真正用来加密大量数据的是对称密码。而RSA主要保护对称密…

Linux0.11内核源码解析-block_dev.c

目录 block_dev.c 文件的作用 int block_write(int dev, long * pos, char * buf, int count) block_dev.c 文件的作用 block_dev.c 文件的作用 block_dev.c 文件就包含两个函数,分别是block_read和block_write函数,提供给read和write系统调用 块读写…

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)

成立这个专栏的目的是,记录自己嵌入式开发遇到的问题,与成功的解决方法,方便自己回顾。 最近在学习王维波老师的《STM32Cube高效开发教程》,王老师移植的是普中科技的驱动,而我手动移植了一下正点原子的lcd驱动&#…

【Java高级语法】(三)泛型:关于泛型最全面的讲解来了~

Java高级语法详解之泛型 :one: 概念:two: 优势:three: 使用3.1 泛型类3.2 泛型接口3.3 泛型方法 :four: 通配符(Wildcards)4.1 无界通配符(Unbounded Wildcard)4.2 上限通配符(Upper Bounded Wildcard)4.3 …

aardio - 【库】http访问网页

为了简化http访问操作,提高速度,丰富功能,特封装了此库,可以根据需要进行选择。 本库带一个dll,所以建议优先选择使用 inet.http 库: 如果使用 inet.http库,直接 inet.http.get() 速度较慢。 大…

理解3ds max中的容器的概念

实验一: 在场景中创建一个容器 把这个容器保存为一个文件,在文件夹中可看到此容器文件,其大小为892KB,同时可看到生成一个同名的lock类型文件。 将场景中的某一个物体(面加多一点的)添加到容器中&#x…

框架---面经

Spring 循环依赖 概念 多个实体之间相互依赖并形成闭环的情况就叫做"循环依赖”,也叫做”循环引用。 三级缓存解决循环依赖的原理 循环依赖的解决方案--- Feild注入单例(AutoWired) 直接在类的成员变量上使用Autowired注解&#xf…

SM2椭圆曲线公钥密码算法

国家密码管理局于2010年12月17日发布了SM2椭圆曲线公钥密码算法,并要求为对现有基于RSA算法的电子认证系统、密钥管理系统、应用系统进行升级改造。关于算法标准,请参见《国家密码管理局公告(第 21 号)》,网址为​​ht…

JavaWeb【总结】——(请求和响应)浏览器发送请求的方式 服务器响应的方式

本文目录 引出JavaWeb相关知识1.网页状态码web相关背景知识如何在idea中建tomcat web项目2.Web的请求request:get和post,响应response3.同步请求和异步请求Ajax,以及异步的Json响应4.同步jsp和异步ajax的axios下,转发或重定向思考…

【图片轮播】Vue如何实现移动端图片轮播效果,支持左右滑动(附图文及代码)

【写在前面】 日常生活中,其实我们是离不开手机查看相册的,尤其是图片的轮播展示,最近我就接到我家老大给出的需求,首先是从网上下载下来之前她做的图片,然后她就希望能够在自己手机上能随时查看,这不没办法…

Java使用OpenCV进行图像操作

OpenCV图像操作 OpenCV概述下载与安装目录说明项目集成验证 Mat类创建Mat对象其他操作 常见图像API读取与输出图像显示图像图像压缩和解压缩图像转换图像缩放亮度调整图像锐化图像梯度图像二值化边缘检测图像高斯模糊图像反色 OpenCV 概述 OpenCV(开源计算机视觉库…

2023互联网高级测试工程师至少具备的能力

业务熟悉 熟悉本系统 测试人员参与测试的系统的各种业务场景,必须做到精熟 。一旦需求有改动,可以清楚快速的知道上下文。同时可以清楚的知道哪些点是需要重点测试的。 熟悉跟本系统有通讯的上下游系统业务 跟本系统有通讯的上下游系统也要非常熟悉。这…

Exception in thread “main“ java.lang.UnsupportedClassVersionError 50报错处理

之间正常走jenkinsdocker自动化部署的项目,今天改了一个文件,点了一下,竟然没有部署上去,提示如上,如下 Exception in thread "main" java.lang.UnsupportedClassVersionError: com/coocaa/tsp/sys/user/Use…

Web 自动化测试Selenium 之PO 模型

目录 1. po 模型介绍 2. PageObject 设计模式 3. PO 的核心要素 4. 非PO 实现 5. PO 实现 6. 总结 7. PO 模式的特点 总结: 1. po 模型介绍 在自动化中,Selenium 自动化测试中有一个名字经常被提及 PageObject (思想与面向对象的特征相同)&#x…

【改进算法】混合鲸鱼WOA和BAT算法(Matlab代码实现)​

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Python键盘监听:实现快捷操作和自动化脚本(监听组合键

前言 本文主要介绍一下使用Python进行事件监听功能,以实现一些特有的操作。本文旨在介绍如何实现这一功能。 笔者根据一些需求写了一个小工具,流程和功能如下图所示(实际功能有更多): 该工具主要实现了 键盘监听 和 鼠…

从Linux源码看TIME_WAIT状态的持续时间

前言 笔者一直以为在Linux下TIME_WAIT状态的Socket持续状态是60s左右。线上实际却存在TIME_WAIT超过100s的Socket。由于这牵涉到最近出现的一个复杂Bug的分析。所以,笔者就去Linux源码里面,一探究竟。 首先介绍下Linux环境 TIME_WAIT这个参数通常和五…

C++入门,一些C++基本概念介绍

文章目录 目录 前言 1.C关键字 1.1命名空间 1.2命名空间定义 1.3命名空间的使用 2.C输入&输出 3.缺省参数 3.1缺省参数的概念 3.2缺省参数分类 4.函数重载 4.1函数重载的概念 5.引用 5.1 引用特性 5.2 常引用 5.3引用的使用场景 5.4引用和指针 6.内联函数…