【9】Spring Boot 3 集成组件 : 基于spring security的认证权限开发【认证】

目录

  • 【9】Spring Boot 3 集成组件 : 基于spring security的用户权限系统【认证】
    • 认证和权限流程【理论】
      • 认证
      • 授权
      • 鉴权
      • 权限控制
      • 认证、授权、鉴权、和权限控制关系
      • 认证和鉴权的关系
    • 认证流程【理论】
        • 1. 直接携带认证令牌访问资源
        • 2. Session认证机制
        • 3. Jwt认证机制下的认证流程
    • Spring Security的认证流程【理论】
      • 如何实现认证逻辑
      • 实现JWT认证机制
    • 认证流程实现介绍
      • 引入依赖
      • 开启@EnableWebSecurity注解
      • 初始配置
      • 项目代码

个人主页: 【⭐️个人主页】
需要您的【💖 点赞+关注】支持 💯


【9】Spring Boot 3 集成组件 : 基于spring security的用户权限系统【认证】

📖 本文核心知识点:

  • 认证和权限流程
  • 认证和权限控制说明
  • 认证流程在spring security中的相关理论知识
  • JWT认证
  • 用户名认证
  • session认证
  • 认证流程Sepring Security配置

spring boot & security version : 3.1.5

认证和权限流程【理论】

权限系统分为两部分

  1. 认证,识别身份
  2. 授权,鉴权、权限控制, 访问保护的受限资源
    在这里插入图片描述

认证

认证指确认声明者的身份。对应英文 identification 单词。

常见的认证方式:

  • 身份证
  • 用户名和密码
  • 手机:手机短息、二维码扫描、手势密码
  • 电子邮箱
  • 用户的生物学特征:指纹、虹膜
  • 等等

授权

获取用户的委派权限。对应英文 authorization 单词。

在信息安全领域,授权是指资源所有者委派执行者,赋予执行者指定范围的资源操作权限

  • 资源所有者:拥有资源的所有权限,一般就是资源的拥有者
  • 资源执行者:被委派去执行资源的相关操作
  • 操作权限:可以对资源进行的某种操作
  • 资源,有价值的信息或数据等

资源所有者执行者不限于自然人,很多时候是应用程序或者机器,例如浏览器。

授权的实现方式很广泛,在互联网应用开发领域中:

  • 通过 web 服务器的 session 机制
  • 通过 web 服务器的 cookie 机制
  • 颁发授权令牌 token

鉴权

鉴权是指对于一个声明者所声明的身份权利的真实性进行鉴别确认的过程。对应英文 authentication 单词。

授权,后鉴权。这两个“”是同一个概念,就是所委派的权利

因此鉴权的实现方式和授权的方式有一一对应关系

鉴权是一个承上启下的一个环节,上游它接受权限的输出,校验其真实性后,然后获取权限(permission),为下一步的权限控制做好准备。

权限控制

权限控制是指对可执行的各种操作组合配置权限列表,然后根据执行者的权限,若其操作在权限范围内,则允许执行,否则禁止。对应英文 access/permission control 单词。

权限(Permission),一般预先定义和配置好,以便控制的具体实现。一班情况下,会用基于角色的方式来定义权限,由角色来封装可执行的操作集合。

认证、授权、鉴权、和权限控制关系

这四个环节是一个前后依次发上、上下游的关系。

认证 -> 授权 -> 鉴权 -> 权限控制

认证和鉴权的关系

  • 认证是确认声明者的本身身份,其作为授权上游衔接而存在

    即先登录,后配置权限

  • 鉴权是对声明者所声明的真实性进行确认的过程,其作为授权下游衔接而存在

    先配置权限,才能鉴别用户的权限和后续的权限控制。

认证流程【理论】

1. 直接携带认证令牌访问资源

因为HTTP协议的无状态性,服务器每次访问都需要知道身份才能访问资源。所以每次访问都会发送身份信息进行身份验证。

在访问资源时,直接携带认证身份信息【如账号密码】,通过访问资源时,校验身份。如果身份合法,则可以访问资源
问题: 每次访问时,都要走一遍身份认证流程。携带身份信息,安全性非常低。

在这里插入图片描述

2. Session认证机制

对于为什么需要Session机制和JWT机制,并且有什么区别?推荐大家阅读这篇博文。
身份认证——session认证机制与JWT认证机制(入门到使用)
阅读关注的知识点:
1. Cookie的作用和缺点
2. Session
3. JWT
4. Session和Jwt的区别和选择时机

在这里插入图片描述

3. Jwt认证机制下的认证流程

在这里插入图片描述


Spring Security的认证流程【理论】

根据上章讲的3种认证方式如何在spring security对应

  1. 直接携带认证令牌访问资源
    httpSecurity.formLogin() // 配置的就是身份认证流程【登录流程】
    该方法创建了一个UsernamePasswordAuthenticationFilter类,用户处理/login请求的处理。包括认证成功handler和失败handler,以及参数配置,失败跳转。

  2. Session 认证机制

    会话管理支持由几个组件组成,它们一起工作以提供该功能。这些组件是: SecurityContextHolderFilterSecurityContextPersistenceFilter SessionManagementFilter

    在 Spring Security 6 中,SecurityContextPersistenceFilter 和 SessionManagementFilter 默认是不设置的。除此之外,任何应用程序只能设置 SecurityContextHolderFilter 或 SecurityContextPersistenceFilter,而不能同时设置。
    spring security 6使用 SecurityContextHolderFilter ,
    HttpSessionSecurityContextRepository , 保存session信息。
    写入响应头。

  3. JWT认证流程

    spring security 默认没有JWT认证的实现Filter

如何实现认证逻辑

默认UsernamepassowrdAuthenticationFilter的用户名密码认证流程,只支持 username和密码。如果我们需要提供额外的字段则无法满足要求。需要我们自定义逻辑。
方式

  1. 重写usernamepasswordauthenticationFilter的认证逻辑Filter。注入到原有的的认证filer之前

    不好的地方:
    1. 原有的usernamefilter 无法移出。并通过httpsecurity.form()进行配置。与自己的 定义的filter 不能同时配置,比较麻烦。
    2. 需要对spring security框架比较熟悉。后续开发人员要求高
    3. 不同的继承类,不同的效果。一般继承自定义的继承类AbstractAuthenticationProcessingFilter,对其重写
    4. 使用HttpServletRequest和HttpServletResponse类,不能使用Spirng Bean自动转换的能力。增加额外的转换复杂度

  2. 禁用原有的认证。通过 提供 controller api的方式暴露身份认证【登录认证】,同时重写 /logout 【推荐】

    如同开发一个api接口一样。对于任何后端开发都能快速找到位置,并进行拓展。只需要关注业务即可。并且需要的资源类,直接IOC注入即可使用。扩展起来比较方便。

实现JWT认证机制

支持JWT认证时,需要创建定义JwtAuthenticationFilterJwtAuthenticationToken,JwtAuthenticationProvider类,完成jwt认证流程类的实现。包括Jwt生成工具和解析工具。

  • JwtAuthenticationFilter

    jwt认证准入规则校验,jwt认证流程的实现。 OncePerRequestFilter的子类

  • JwtAuthenticationToken

    jwt认证的token类。AbstractAuthenticationToken的子类。Jwt Provider认证的支持类

  • JwtAuthenticationProvider

    AuthenticationProvider的子类, 主要提供对 JwtAuthenticationToken的认证逻辑的具体实现类

在这里插入图片描述

认证流程实现介绍

引入依赖

    implementation "org.springframework.boot:spring-boot-starter-security"

开启@EnableWebSecurity注解

@EnableWebSecurity
public class Application

初始配置

认证流程需要的实例

自定义认证涉及类作用描述
UsernamePasswordAuthenticationFilter默认用户名密码认证禁用默认
PasswordEncoder密码加密器
DaoAuthenticationProvider数据库认证供应商默认
AuthenticationManager认证管理者new ProviderManager(authenticationProviders);
JwtAuthenticationFilterjwt认证过滤器自定义:主要jwt准入条件和封装认证token
JwtAuthenticationProviderjwt认证供应商自定义:主要对认证token进行验证
SecurityFilterChainspring security核心类HttpSecurity配置build
CorsConfigurationSourcecors配置类自定义配置
AccessDeniedHandler权限校验失败自定义子类实现【ExceptionTranslationFilter使用】
AuthenticationEntryPoint认证失败处理自定义子类实现【ExceptionTranslationFilter使用】
JwtAuthenticationTokenjwt token 认证凭证类AbstractAuthenticationToken子类
IdentificationService认证接口服务替代UsernamePasswordAuthenticationFilter,使用/api的方式暴露。

AuthenticationFailureHandler和AuthenticationSuccessHandler未使用。因为UsernamePasswordAuthenticationFilter禁用了。所以该两个就无效使用。

项目代码

代码 - spring3.0版本-企业web后端 - kongxiang (gitee.com)

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

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

相关文章

单调栈结构

单调栈 单调栈是一种特殊设计的栈结构,为了解决如下的问题: 给定一个可能含有重复数值的 arr[],i位置的数一定存在如下两种信息: arr[i]的左侧离 i 最近并且小于(或者大于)arr[i] 的数在哪?arr…

JVM虚拟机系统性学习-运行时数据区(堆)

运行时数据区 JVM 由三部分组成:类加载系统、运行时数据区、执行引擎 下边讲一下运行时数据区中的构成 根据线程的使用情况分为两类: 线程独享(此区域不需要垃圾回收) 虚拟机栈、本地方法栈、程序计数器 线程共享(数…

二叉搜索树中第K小的元素[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个二叉搜索树的根节点root,和一个整数k,请你设计一个算法查找其中第k个最小元素(从1开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出&#x…

编译Android14 AOSP原生代码并运行X86模拟器镜像过程记录

最近在研究Android Entreprise部分的特性,需要在Android手机上分析WorkProfile相关的源码,因为新买的Pixel样机还未到货,看了几天Android源码,迫切需要上真机对比分析。 又听说最近几年Android模拟器已经有些进步,至少…

【利用二手车数据进行可视化分析】

利用二手车数据进行可视化分析 查看原始数据去除重复数据需求分析1.统计全国总共有多少量二手车,用KPI图进行展示2.统计安徽总共有多少量二手车,用KPI图进行展示3.统计合肥总共有多少量二手车,用KPI图进行展示4.取最贵的10辆二手车信息&#…

游戏提示找不到d3dx10_43.dll怎么办?5种方法教你如何修复

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“缺少d3dx10_43.dll文件”。这个错误提示通常出现在运行某些游戏或应用程序时,它意味着系统无法找到所需的动态链接库文件。本文将详细介绍d3dx10_43.dll文件的作用以及导致其丢…

class066 一维动态规划【算法】

class066 一维动态规划 算法讲解066【必备】从递归入手一维动态规划 code1 509斐波那契数列 // 斐波那契数 // 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 // 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。…

从关键新闻和最新技术看AI行业发展(2023.11.20-12.3第十一期) |【WeThinkIn老实人报】

Rocky Ding 公众号:WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术,同时Rocky会对这些关键信息进行解读,力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议,一起交流学习&…

睡觉时总在凌晨3、4点醒来,再无睡意,一般暗示四大疾病,别忽视!

良好的睡眠是人体健康的重要因素,正常情况下的八小时睡眠时间在人们一天的时间中占比三分之一,睡眠是人体器官进行自我修复和调整的关键时间,睡眠质量不好,则会影响各个器官的健康,人们可以从睡眠中发现身体的异常&…

常见web漏洞的流量分析

常见web漏洞的流量分析 文章目录 常见web漏洞的流量分析工具sql注入的流量分析XSS注入的流量分析文件上传漏洞流量分析文件包含漏洞流量分析文件读取漏洞流量分析ssrf流量分析shiro反序列化流量分析jwt流量分析暴力破解流量分析命令执行流量分析反弹shell 工具 攻击机受害机wi…

midwayjs从零开始创建项目,连接mikro-orm框架(必须有java的springboot基础)

前言: 我一直都是用java的springboot开发项目,然后进来新公司之后,公司的后端是用node.js,然后框架用的是 midwayjs ,然后网上的资料比较少,在此特地记录一波 文档: 1.官方文档:介绍…

Linux C/C++ 从内存转储中恢复64位ELF可执行文件

ELF(Executable and Linking Format)是一种对象文件的格式,它主要用于定义ELF(Executable and Linking Format)是一种对象文件的格式,它主要用于定义不同类型的对象文件中的内容以及它们的存储方式。一个EL…

深入了解对象与内置构造函数

1. 深入对象 1.1 创建对象的三种方式 1.2 构造函数 语法约定: 总结 构造函数可以快速创建多个对象大写字母开头的函数使用new关键字将对象实例化构造函数不需要返回值自动返回新的对象 new实例化的执行过程 创建空对象this指向对象执行代码,追加新…

class069 从递归入手三维动态规划【算法】

class069 从递归入手三维动态规划 code1 474. 一和零 // 一和零(多维费用背包) // 给你一个二进制字符串数组 strs 和两个整数 m 和 n // 请你找出并返回 strs 的最大子集的长度 // 该子集中 最多 有 m 个 0 和 n 个 1 // 如果 x 的所有元素也是 y 的元素,集合 x 是…

SVN修改已提交版本的日志方法

1.在工做中一直是使用svn进行項目的版本控制的,有时候因为提交匆忙,或是忘了添加Log,或是Log内容有错误。遇到此类状况,想要在查看项目的日志时添加log或是修改log内容,遇到以下错误: Repository has not b…

2023最新最全【Wireshark 】 安装教程(附安装包)

简介 wireshark是非常流行的网络封包分析工具,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。 为了安全考虑,wireshark只能查看封包,而…

公式识别任务各个链条全部打通

目录 引言公式识别任务是什么?公式识别任务解决方案初探使用建议写在最后 引言 随着LaTeX-OCR模型转换问题的解决,公式识别任务中各个链条已经全部打通。小伙伴们可以放开膀子干了。 解决业界问题的方案,并不是单独训练一个模型就完事了&am…

汽车网络安全--关于UN R155认证的思考

1.UN R155概述 2020年6月25日,联合国颁布了全球首个汽车网络安全强制性法规 -- UN 155,详细规定了关于评估网络安全措施的审核条款、制造商和供应商降低网络安全风险的方法以及实施风险评估的义务等。 法规适用于与信息安全相关的M类(4轮及以上载客汽车)、N类(四轮载货汽车)…

[MySQL--进阶篇]存储引擎的体系结构、简介、特点、选择

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录:不要在乎别人怎么看你,因为他们根本就没有时间,他们只关心他们自己。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 MySQL数据库 存储引擎 前言MySQL体…

Leetcode刷题笔记题解(C++):25. K 个一组翻转链表

思路&#xff1a;利用栈的特性&#xff0c;K个节点压入栈中依次弹出组成新的链表&#xff0c;不够K个节点则保持不变 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …