Security认证要点速记

news2024/9/24 9:22:49

登录校验流程

springSecurity已经为我们默认实现了一个用不着的登录功能,我们需要自己实现个符合我们需求的登录功能,所以我们需要去了解默认登录功能的流程,对其中的部分进行替换

SpringSecurity底层就是过滤器链,包含实现了各种功能的过滤器

  1. UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请
  2. 求。入门案例的认证工作主要有它负责。
  3. ExceptionTranslationFilter处理过滤器链中抛出的任何AccessDeniedException和
  4. AuthenticationException 。
  5. FilterSecurityInterceptor:负责权限校验的过滤器。

认证流程详解

  • Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。
  • AuthenticationManager接口:定义了认证Authentication的方法
  • UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。
  • UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。

解决问题

登录

  1. 自定义登录接口

调用ProviderManager的方法进行认证,如果认证通过,生成jwt

把用户信息存入redis

  1. 自定义UserDetailsService实现类

在这个实现类中完成根据username查询数据库

校验

  1. 定义Jwt认证过滤器

获取token,解析token中的userid

从redis中获取用户信息

如果能成功获取,将其存入SecurityContextHolder供其他过滤器使用

认证要点记录

登录部分

  1. 用户想要进行登录,那用户必然处于未登录状态,需要我们配置SecurittyConfig,登录接口只能匿名访问
  2. 当调用登录接口的时候,由我们自己在Service层调用过滤器的一部分(AuthentionManager的authenticate方法)。
  3. 我们应该提供自己的UserDetailService的实现类(根据用户名查询用户信息)并注入到spring容器中,以供authenticate调用的部分调用。
  4. 我们还应该提供PasswordEncoder类(常见的就是BC),注入到spring容器中,以供authenticate调用的部分调用进行密码校验
  5. authenticate方法的调用,会帮我们完成用户信息查询与密码校验,我们只需要根据返回的结果Authentication是否为空就可以知道登录是否成功
  6. 如果登录成功,我们从Authentication中获取userid,生成jwt,以键值对形式作为响应体返回给前端
  7. 同时以"login:"+id作为键,以loginUser作为值存入redis,这样当下一次前端传来token,解析出id,就可以从redis中查到用户信息。

校验部分

  1. 我们不能让用户每次发起请求都带上用户名密码,所以当用户第一次登录之后,我们可以让用户在一段时间内处于一个登录的状态(可以通过jwt或者redis设置过期时间),处于这个时间段内都可以通过请求头中携带token的方式,直接以此用户的身份访问服务
  2. 使用此方案一方面方便用户,另一方面也可以解决后端的一些问题,访问鉴权是一个很高频的行为,比如我们可以把对关系型数据库的查询转移到对redis的访问,这能降低关系型数据库的压力,也能让用户获得更快的访问速度
  3. 那么我们对token的验证的Filter就应该放在使用用户名密码验证的Filter(UsernamePasswordAuthenticationFilter)的前边,这一步需要在SecurityConfig中进行配置。
  4. 我们在jwtFilter的验证中,会先判断请求是否携带token,不携带token就直接放行(要么是非法的访问,要么是通过用户名密码的访问),交给后边的过滤器处理即可
  5. 如果拿到token,首先尝试解析token,可能会出现jwt解析失败(伪造失败的token或者过期的token),那么就记录并放行即可,后边的过滤器会驳回请求并返回403
  6. 如果token解析成功拿到userid,那么我们就去redis中查询是否存在用户信息(用户是否处于登录状态,我们可以通过redis来控制),如果我们没有拿到,那么就记录并放行
  7. 最后如果顺利拿到了用户信息,说明用户处于登陆状态,根据信息构造authentication,然后存入SecurityContextHolder,其他过滤器能够知道此请求已经经过认证

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

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

相关文章

滑动变阻器在实际应用中需要注意哪些安全事项?

滑动变阻器在实际应用中,为了确保其正常运作及保护电路安全,需要注意以下安全事项: 一、了解并遵守规格参数 最大电阻值和允许通过的最大电流值:使用前,必须清楚滑动变阻器的最大电阻值和允许通过的最大电流值&#x…

RISC-V异常处理流程概述(2):异常处理机制

RISC-V异常处理流程概述(2):异常处理机制 一、异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册一、异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先需要执…

软件工程(下)

目录 需求工程 概述 需求获取 分层 获取方法 项目管理维度 需求开发---需求分析 UML(统一建模语言):平台无关、语言无关 UML 41视图 需求的定义、验证、跟踪、变更 需求定义 需求验证 需求跟踪 需求变更管理 软件系统建模 软件…

.NET周刊【7月第1期 2024-07-07】

国内文章 学习.NET 8 MiniApis入门 https://www.cnblogs.com/hejiale010426/p/18280441 MiniApis是ASP.NET Core中的轻量级框架,用最少的代码和配置创建HTTP API。其特点包括简洁明了、性能卓越、灵活多变、易于学习使用,并与ASP.NET Core生态系统完美…

深入了解java锁升级可以应对各种疑难问题

对于java锁升级,很多人都停留在比较浅层的表面理解,一定程度下也许够用,但如果学习其中的细节,我们更好地理解多线程并发时各种疑难问题的应对方式! 因此我将锁升级过程中可能涉及的大部分细节或者疑问都整合成了一篇…

01MFC建立单个文件类型——画线

文章目录 选择模式初始化文件作用解析各初始化文件解析类导向创建鼠标按键按下抬起操作函数添加一个变量记录起始位置注意事项代码实现效果图虚实/颜色线选择模式 初始化文件作用解析 运行: 各初始化文件解析 MFC(Microsoft Foundation Classes)是一个C++类库,用于在Win…

fm足球经理Football Manager 2022 for mac 下载安装包

《Football Manager 2022》(足球经理2022)是一款由Sports Interactive开发并由SEGA发行的足球管理模拟游戏。这款游戏让玩家扮演足球俱乐部的 manager(经理),负责球队的所有管理工作,包括战术制定、球员转会…

美业收银系统怎么选?哪些功能实用?美业门店管理系统|拓客系统

选择美业会员系统时,你可以考虑以下几个方面的功能来确定哪些对你最实用: 1.会员管理: 系统应该能够轻松管理会员资料、积分、消费记录等信息,以便更好地了解客户需求并提供个性化服务。 2.促销与营销工具: 包括发…

RS NGP804 直流电源

直流电源 R&S NGP804 -借助四核功率提升效率- R&SNGP800 直流电源系列共有五种不同型号,功率为 400 W 或 800 W,可在多种操作条件下提供最大功率。该电源系列具有两个或四个 200 W 输出通道,每通道的输出电压和电流可达 64 V 及 …

C++入门基础篇(下)

目录 6.引用 6.1 引用的特性 6.2 const引用 7.指针和引用的关系 8.内联函数 9.nullptr 6.引用 引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。比如&a…

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…

JAVA--SpringCloud

SpringCloud基础 为什么需要spring cloud 单体结构--Monolith 首先请回想一下我们所开发的服务是什么样子的。通常情况下,这个服务所对应的代码由多个项目(模块)所组成,各个项目会根据自身所提供功能的不同具有一个明确的边界。…

Mosh|初学者SQL教程第二弹

using子句(如果匹配的两个字段在两个表中的名字相同可以使用) 多条件使用using 自然连接( NATURAL JOIN),它意味着让搜索引擎基于共同列自行去尝试join,可能会出现意想不到的结果,不要轻易尝试 交叉连接&am…

DNS 杂谈

一、定义 DNS(Domain Name System),域名系统,该系统记录域名和Ip地址的相互映射关系。用户访问互联网时,通过域名地址得到对应的IP地址,这个过程称为域名解析。DNS运行于UDP协议之上,使用的端口…

HomeAssistant HAOS安装HACS集成

1. HAOS安装HACS集成 1.1 手动安装HACS 下载HACS压缩包 加载项安装samba,可能需要特殊网络环境不然非常慢 配置->加载项->加载项商店-> 搜索samba,并安装,配置用户名密码 Samba配置完成之后,如果启动不起来就需要重启HomeAssis…

图文讲解IDEA如何导入JDBC驱动包

前言 学习JDBC编程,势必要学会如何导入驱动包,这里笔者用图文的方式来介绍 视频版本在这里 50秒教你怎么导入驱动包然后进行JDBC编程的学习_哔哩哔哩_bilibili 忘记录音频了,大伙凑合着看 下载驱动包 https://mvnrepository.com/artifact/mysql/mysql-connector-java 去中…

SpringCloud代码实战

项目结构 实例实现功能:实现通过id查询用户的订单信息 OrderCommon:公共的一些模块类型,此处为一个user对象 Eureka-Service:配置Eureka的启动类,服务端 Order-Service:提供查询功能的服务端 Order-Client:查询的客户端 OrderCommon代码…

C++类与对象-基础篇

目录 一、什么是类 1.1 语法定义 1.2 访问限定符 1.3 类域 二、类的实例化 2.1 什么是实例化 2.2 类的大小 三、this指针 3.1 引入 3.2 this指针的使用 一、什么是类 1.1 语法定义 class 类名 {}; 说明 类似于C语言中的结构体,括号后分号不能丢类内成员可…

类型“RouteRecordName”上不存在属性“includes”。 类型“symbol”上不存在属性“includes”

确定 route.name 运行时是 字符串,强制转换 为字符串。 removeRoute(id: string) { this.dynamRoute this.dynamRoute.filter(route > !(route.name as string).includes(id)) localStorage.setItem(dynamRoute, JSON.stringify(this.dynamRoute)) delete this.t…

[leetcode] shortest-subarray-with-sum-at-least-k 和至少为 K 的最短子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int shortestSubarray(vector<int>& nums, int k) {int n nums.size();vector<long> preSumArr(n 1);for (int i 0; i < n; i) {preSumArr[i 1] preSumArr[i] nums[i];}int res n…