【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)

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

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

相关文章

python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路。 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接口测…

Unity 实现单例模式

目录 基本概念 饿汉模式(推荐) 懒汉模式: 基本概念 单例模式:类只有一个实例,一般使用static来实现单例模式; 比如:有一个Test类,实现了单例,假设这个唯一的实例名为SingTonle,实例在类内被实现并被stat…

【pycharm】Pycharm中进行Git版本控制

本篇文章主要记录一下自己在pycharm上使用git的操作,一个新项目如何使用git进行版本控制。 文章使用的pycharm版本PyCharm Community Edition 2017.2.4,远程仓库为https://gitee.com/ 1.配置Git(File>Settings) 2.去Gitee创建…

微服务——服务保护Sentinel

雪崩问题 在单体项目里面,如果某一个模块出问题会导致整个项目都有问题。 在微服务项目里面,单独一个服务出问题理论上是不会影响别的服务的。 但是如果有别的业务需要调用这一个模块的话还是会有问题。 问题产生原因和解决思路 最初那只是一个小小…

持续集成交付CICD:通过API方式上传Nexus制品

目录 一、实验 1.通过API方式上传Nexus制品 二、问题 1.如何通过API方式上传PNG图片 2.如何通过API方式上传tar.gz 与 ZIP文件 3.如何通过API方式上传Jar file文件 4.如何通过API方式上传制品(maven类型的制品)文件 5.如何下载制品 一、实验 1.通…

MySQL在Centos7环境安装

说明: • 安装与卸载中,⽤⼾全部切换成为root,⼀旦 安装,普通⽤⼾能使⽤的 1. 卸载不要的环境 [roothcss-ecs-1036 ~]# ps ajx |grep mariadb # 先检查是否有mariadb存在 13134 14844 14843 13134 pts/0 14843 S 1005 0:00 gr…

【数据结构 — 排序 — 交换排序】

数据结构 — 排序 — 交换排序 一.交换排序1.基本思想2.冒泡排序2.1.算法讲解2.2.代码实现2.2.1.函数定义2.2.2.算法接口实现2.2.3.测试代码实现2.2.4.测试展示 3.快速排序3.1.算法讲解3.2.各大算法分别单独实现3.2.1快速排序hoare版本3.2.2.快速排序hoare改进版三数取中选key法…

低多边形3D建模动画风格纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

排序算法之七:归并排序(递归)

基本思想 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#xff1…

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使共阴数码管,PCF8591 ADC模块、光敏传感器等。 主要功能: 系统运行后,数码管显示光传感器采集光照强度值&#xff…

C# 使用CancellationTokenSource 取消Task执行

写在前面 在Task创建并执行后,如果状态发生了变化,需要取消正在执行中的Task,除了使用主线程上的共享变量来判断之外,更优雅的方式就是就是用CancellationTokenSource来取消任务的执行。 代码实现 public static void CancelTas…

Linux和Windows环境下如何使用gitee?

1. Linux 1.1 创建远程仓库 1.2 安装git sudo yum install -y git 1.3 克隆远程仓库到本地 git clone 地址 1.4 将文件添加到git的暂存区(git三板斧之add) git add 文件名 # 将指定文件添加到git的暂存区 git add . # 添加新文件和修改过的…