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

SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity使用数据库数据完成认证

    • 5 SpringSecurity使用数据库数据完成认证
        • 5.1 认证流程分析
          • 5.1.1 UsernamePasswordAuthenticationFilter
          • 5.1.2 AuthenticationManager
          • 5.1.3 AbstractUserDetailsAuthenticationProvider
          • 5.1.4 AbstractUserDetailsAuthenticationProvider中authenticate返回值
          • 5.1.5 AbstractAuthenticationProcessingFilter
        • 5.2 初步实现认证功能
          • 5.2.1 编写UserService接口
          • 5.2.2 实现UserService接口
          • 5.2.3 在SpringSecurity主配置文件中指定认证使用的业务对象
        • 5.3 加密认证
          • 5.3.1 在IOC容器中提供加密对象
          • 5.3.2 修改认证方法
          • 5.3.3 修改添加用户的操作

5 SpringSecurity使用数据库数据完成认证

5.1 认证流程分析
5.1.1 UsernamePasswordAuthenticationFilter

还记得我们在前面将的15个过滤器吧,这个过滤器就是其中之一。
先看主要负责认证的过滤器UsernamePasswordAuthenticationFilter,看重点,注意注释。
我们首先Ctrl+N在对话框里面输入这个过滤器的名字。

在这里插入图片描述

我们点击最后一行代码的authenticate方法。看看具体的认证流程是什么样子的。

5.1.2 AuthenticationManager

我们进入这个方法之后,发现这个方法是一个接口提供的。

在这里插入图片描述

由上面源码得知,真正认证操作在AuthenticationManager里面!然后看AuthenticationManager的实现类ProviderManager:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

点击进入authenticate方法,进一步观察认证流程:

在这里插入图片描述

我们发现这个方法也是一个接口提供的方法。我们查看其实现类。

在这里插入图片描述

5.1.3 AbstractUserDetailsAuthenticationProvider

在这里插入图片描述

在DaoAuthenticationProvider这个类里面:

在这里插入图片描述

我们查看this.getUsrDetailService()方法。

在这里插入图片描述

这个方法的返回值是UserDetailService。点击UserDetailService查看源码:

在这里插入图片描述

5.1.4 AbstractUserDetailsAuthenticationProvider中authenticate返回值

按理说到此已经知道自定义认证方法的怎么写了,但咱们把返回的流程也大概走一遍,上面不是说到返回了一个UserDetails对象对象吗?跟着它,就又回到了AbstractUserDetailsAuthenticationProvider对象中authenticate方法的最后一行了。

在这里插入图片描述

点进去看看:
在这里插入图片描述

来到UsernamePasswordAuthenticationToken对象发现里面有两个构造方法。
注意:这里传递的是三个参数,开局传递的是两个参数。

在这里插入图片描述

我们看看这个类的父类做了什么?点击super

在这里插入图片描述

由此,咱们需要牢记自定义认证业务逻辑返回的UserDetails对象中一定要放置权限信息啊!可是这里面也没有doFilter呀?那就从父类找!

在这里插入图片描述

5.1.5 AbstractAuthenticationProcessingFilter

在这里插入图片描述

点击successfulAuthentication方法。

在这里插入图片描述

可见AbstractAuthenticationProcessingFilter这个过滤器对于认证成功与否,做了两个分支,成功执行successfulAuthentication,失败执行unsuccessfulAuthentication。在successfulAuthentication内部,将认证信息存储到了SecurityContext中。并调用了loginSuccess方法,这就是常见的“记住我”功能!此功能具体应用,咱们后续再研究!

5.2 初步实现认证功能
5.2.1 编写UserService接口

让我们自己的UserService接口继承UserDetailsService。

在这里插入图片描述

5.2.2 实现UserService接口

定义UserServiceImpl类,实现这个接口,编写loadUserByUsername业务。

@Service("userService")
public class UserServiceImpl implements UserService {@AutowiredUserDao userDao;@AutowiredBCryptPasswordEncoder bCryptPasswordEncoder;/*** 根据用户名查询用户信息* @param username* @return* @throws UsernameNotFoundException*/public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {UserInfo userInfo = userDao.findUserByName(username);List<Role> roles = userInfo.getRoles();User user = new User(userInfo.getUsername(),{noop}+userInfo.getPassword(),getAuthority(roles));System.out.println(user);return user;}//封装角色信息,也就是认证信息public Collection getAuthority(List<Role> roles){List<SimpleGrantedAuthority> list = new ArrayList<SimpleGrantedAuthority>();for(Role role : roles){String roleName = role.getRoleName();list.add(new SimpleGrantedAuthority("ROLE_" + roleName));}return list;}
}
5.2.3 在SpringSecurity主配置文件中指定认证使用的业务对象
<!--配置认证管理器-->
<security:authentication-manager><security:authentication-provider user-service-ref="userService"></security:authentication-provider>
</security:authentication-manager>
5.3 加密认证
5.3.1 在IOC容器中提供加密对象

在springSecurity.xml里面配置加密对象。

<!--配置加密工具类-->
<bean id="bCryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>

配置加密认证方式

<!--配置认证管理器-->
<security:authentication-manager><!--配置认证提供者--><security:authentication-provider user-service-ref="userService"><!-- 配置加密的方式--><security:password-encoder ref="bCryptPasswordEncoder"/></security:authentication-provider>
</security:authentication-manager>
5.3.2 修改认证方法

去掉{noop}。

@Service("userService")
public class UserServiceImpl implements UserService {@AutowiredUserDao userDao;@AutowiredBCryptPasswordEncoder bCryptPasswordEncoder;/*** 根据用户名查询用户信息* @param username* @return* @throws UsernameNotFoundException*/public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {UserInfo userInfo = userDao.findUserByName(username);List<Role> roles = userInfo.getRoles();User user = new User(userInfo.getUsername(),userInfo.getPassword(),userInfo.getStatus() == 0 ? false : true, true, true, true,getAuthority(roles));System.out.println(user);return user;}//封装角色信息,也就是认证信息public Collection getAuthority(List<Role> roles){List<SimpleGrantedAuthority> list = new ArrayList<SimpleGrantedAuthority>();for(Role role : roles){String roleName = role.getRoleName();list.add(new SimpleGrantedAuthority("ROLE_" + roleName));}return list;}
5.3.3 修改添加用户的操作
//新增用户信息
public void save(UserInfo userInfo) {//加密之后的密码信息String encode = bCryptPasswordEncoder.encode(userInfo.getPassword());userInfo.setPassword(encode);userDao.save(userInfo);
}执行新增操作:

在这里插入图片描述

相关文章:

SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity使用数据库数据完成认证 5 SpringSecurity使用数据库数据完成认证5.1 认证流程分析5.1.1 UsernamePasswordAuthenticationFilter5.1.2 AuthenticationManager5.1.3 AbstractUserDetailsAuthenticationProvider5.1.4 AbstractUserDetailsAuthenticationProvider中…...

英国AI大学排名

计算机学科英国Top10 “计算机科学与信息系统”学科除了最受关注的“计算机科学”专业&#xff0c;还包括了“人工智能”“软件工程”“计算机金融”等众多分支专业。 1.帝国理工学院 Imperial College London 单以计算机专业本科来讲&#xff0c;仅Computing这个专业&#x…...

渗透测试与高级攻防技术(二)网络安全技术的前沿探讨:渗透测试与高级攻防

文章目录 引言 第一章&#xff1a;入侵检测与防御系统&#xff08;IDS/IPS&#xff09;1.1 IDS与IPS的区别1.2 Cisco IDS/IPS系统 第二章&#xff1a;蜜罐技术2.1 蜜罐技术概述2.2 搭建蜜罐系统2.3 蜜罐技术的优缺点 第三章&#xff1a;社会工程攻击3.1 社会工程攻击概述3.2 社…...

Windows系统下安装mujoco环境的教程【原创】

在学习Mujoco仿真的过程中&#xff0c;我先前是在linux系统下进行的研究与学习&#xff0c;今天来试试看在windows系统中安装mujoco仿真环境。 先前在linux中的一些关于mujoco学习记录的博客&#xff1a;Mujoco仿真【xml文件的学习 3】_mujoco打开xml文件-CSDN博客 下面开始wi…...

【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍖 本次题目难度中等偏上,最后一题又是…...

2024华数杯数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;C<A<B&#xff0c;开放度&#xff1a;A<B<C。 综合评价来看 A题适合对机械臂和机器人运动学感兴趣的同学&#xff0c;尤其是有一定编程和优化算法基础的同学。不建议非相关专业同学选择。 B题挑战较大&#xff0…...

大模型的经典面试问题及答案

大语言模型&#xff08;LLM&#xff09;在人工智能中变得越来越重要&#xff0c;在各个行业都有应用。随着对大语言模型专业人才需求的增长&#xff0c;本文提供了一套全面的面试问题和答案&#xff0c;涵盖了基本概念、先进技术和实际应用。如果你正在为面试做准备&#xff0c…...

nodejs环境搭建

1.准备工作 将他解压到指定路径(我是在D:\tools)并在解压文件下建立node_global和node_cache这两个目录 注1:新建目录说明(自带的比较难找,较麻烦) node_global:npm全局安装位置 node_cache:npm缓存路径 如图: 2.配置环境变量 …...

C#基础:LINQ表达式的单独定义和编译使用

//编写表达式 Expression<Func<AlarmGroupInfo, bool>> express x > x.DataSource 1 && x.AlarmStatus2;// 编译表达式 Func<AlarmGroupInfo, bool> compiledExpression express.Compile();// 应用到 LINQ 查询 var resultlistss alarmgroupl…...

前端面试:八股文系列(一)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…...

设施农业“AutoML“时代:大模型自动调参,让农业算法模型更简单易用

&#xff08;于景鑫 北京市农林科学院智能装备技术研究中心&#xff09;设施农业是现代农业的重要发展方向,但在数字化、智能化的进程中仍面临诸多挑战。传统的农业算法模型虽然可以为设施农业提供一定的决策支持,但在实际应用中往往受限于参数调优复杂、模型泛化能力差等因素。…...

LinkedList接口源码解读

LinkedList 接口源码解读 前言 因为追求质量&#xff0c;所以写的较慢。大概在接下来的三天内会把LinkedList源码解析出完。已经出完啦&#xff01;废话不多说&#xff0c;正片开始&#xff01; &#xff08;文章最后面有后记哦~&#xff09; 大家都知道&#xff0c;LinkedL…...

nohup将代码放到后端运行查看nohup命令

tail -f nohup.outnohup python your_script.py > /path/to/your/directory/output.log 2>&1 &...

MacOS的100个超实用技巧

目录 1. 界面和导航 1.1 使用热角 1.2 多桌面切换 1.3 快速访问应用 1.4 隐藏/显示菜单栏 1.5 使用Mission Control 2. 文件管理 2.1 使用Finder标签 2.2 快速查看文件 2.3 标签式窗口管理 2.4 使用Smart Folders 2.5 文件重命名 3. 系统设置 3.1 自定义Dock 3.…...

本地调试指引文档

在开发组件库时&#xff0c;我们经常需要在真实的项目中测试组件库的功能&#xff0c;所以需要进行本地调试&#xff0c;本文介绍两种组件库本地调试流程&#xff0c; 1.使用beta版本 2.使用npm link 两种都可以作为本地调试的方案&#xff0c;本文作为一个参考资料&#xff0…...

【C++】一堆数组 冒泡排序

冒泡排序&#xff0c;一种很常见的排序法师 这章要划重点&#xff0c;很重要&#xff01;&#xff01; 排序思路为前一个元素与后一个元素比大小&#xff0c;一直循环一轮&#xff0c;找出最大/最小的那个元素后&#xff0c;进行下一轮&#xff0c;找到第二大/小的元素......…...

[最短路SPFA]--启动!!!!!

基础模板 #include<bits/stdc.h> #define ll long long #define fi first #define se second #define pb push_back #define PII pair<int,int > #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int N 1e610; int …...

大模型是否潜在地进行多跳推理?

人工智能咨询培训老师叶梓 转载标明出处 以往的研究表明&#xff0c;基于Transformer的LLMs能够在参数中存储和检索事实信息&#xff0c;以完成简单提示&#xff0c;例如“Stevie Wonder的母亲是谁”。此外&#xff0c;当必要信息明确给出时&#xff0c;LLMs表现出了显著的上下…...

人为什么不能长期待在家里?三个原因告诉你答案

在现代社会的快节奏生活中,人们时常渴望能够拥有一段长时间待在家里的闲暇时光,幻想这会是一段惬意、舒适且自由的经历。然而,实际情况往往并非如此。许多人在经历了数日甚至更长时间的居家生活后,会逐渐感受到诸多负面情绪和不良影响。以下将详细阐述人为什么不能长期待在…...

MATLAB画散点密度图(附代码和测试数据的压缩包)

1. 有关 Matlab 获取代码关注WZZHHH回复关键词&#xff0c;或者咸鱼关注&#xff1a;WZZHHH123 怀俄明探空站数据解算PWV和Tm&#xff1a;怀俄明探空站数据解算PWV和Tm 怀俄明多线程下载探空站数据&#xff08;包括检查和下载遗漏数据的代码&#xff09;&#xff1a;怀俄明多线…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...