Security认证要点速记

登录校验流程

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.mzph.cn/pingmian/44291.shtml

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

相关文章

HarmonyOS Next应用开发之系统概述

一、鸿蒙系统概述 鸿蒙系统可以分为华为鸿蒙系统(HUAWEI HarmonyOS)和开源鸿蒙系统(OpenHarmony),华为鸿蒙系统是基于OpenHarmony基础之上开发的商业版操作系统。他们二者的关系可以用下图来表示: 1.1、…

使用Go编写的持续下行测速脚本,快速消耗流量且不伤硬盘

介绍 使用go语言编写的持续下行测速脚本,可用于任意平台使用,通过指定URL清单文本文件自动遍历测速,支持多线程,支持多平台 特性 轻量级,无依赖采用内存进行缓存数据,不占用磁盘(如果内存较小请使用gcd项目),最大程度减少磁盘IO,保护硬盘寿命可自定义最大下载文件…

webpack之ts打包

tsconfig.json配置 // 是否对js文件进行编译,默认false"allowJs": true,// 是否检查js代码是否符合语法规范,默认false(引入的外部文件有可能语法有问题)"checkJs": true, allowJs和checkJs基本是同时出现,因为有了allowJs 这个检查…

30米全国地表覆盖数据分享

我们在《136G全国1m土地覆盖数据》一文中,为你分享过全国1米土地覆盖数据。 现在再为你分享30米全国地表覆盖数据,你可以在文末查看该数据的领取方法。 30米全国地表覆盖数据 土地覆盖数据是各项研究中经常使用的数据。 它不仅可以帮助我们快速进行用…

python批量压缩zip文件

import os import os.path as osp import zipfile import shutil import glob def extract_zip(zip_path, extract_dir): with zipfile.ZipFile(zip_path, r) as zip_file: # 首先确保提取目录存在 os.makedirs(extract_dir, exist_okTrue) …

开发个人Go-ChatGPT--6 OpenUI

开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI,旨在完全离线运行。它支持各种 LLM 运行器,包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由,OpenAI 的接口需要密钥才…

【南京蓝领新材料】水力颗粒分离器工作原理

水力颗粒分离器工作原理 在装置内部设有一个具有一定空间的滤网,雨水从进水管流入,先进入滤网过滤,雨水中的悬浮物和漂浮物将被拦截在此滤网内。 在装置底部有三个腔室,当雨水中小的颗粒物流到每个腔室挡墙前时,颗粒物…

CTFShow的36D杯

神光 还是想了一下,但那个异或搞不出来,都是对dword_41A038操作,想起开头就给了 key ,还有反调试应该是要调试的 输出的应该就是 flag ,只是为什么是乱码呢? 放 od 再试试,直接就出 flag 了&am…

最受老板欢迎的监控员工电脑软件推荐!(6款真实测评)

你有没有遇到以下这种情况: 早晨刚到公司打开电脑,老板对着旁边同事大发雷霆突然发问: 小丽,你昨天上班期间刷抖音了? 你吓得瑟瑟发抖,老板咋知道的呢? 跟其他同事讨论才晓得,原…

[终端安全]-5 移动终端之操作系统安全

1 可信体系构建 移动终端可信体系基于可信计算思想,以硬件芯片为信任根,通过可信度量、可信存储和可信报告等机制,确保移动终端操作系统在启动和运行过程中的各个部件都是可信的。 1)可信启动 1.1)硬件信任根 - 硬件…

AI绘画杀死了设计师!?恰恰相反……

与大多数人想象的不同,ChatGPT等各种AI工具爆火之后,受到冲击最大的居然是设计师、作家、翻译等具有创造性的工作,以体力劳动为主的蓝领反而最不易被替代。 以城市数据团做过的一项研究为例,他们对中国1639种职业进行了GPT替代风险…

网页报错err_connection_timed_out 怎么办?教你快速修复错误代码

遇到网页错误提示“ERR_CONNECTION_TIMED_OUT”时,通常表示你的网络浏览器无法在规定时间内从服务器获取数据。这种错误不仅会阻碍你访问特定网站,而且可能会引起一些疑惑和不便。首先,这个问题可能是由于网络连接问题、服务器响应延迟或配置…

Python 轻松生成多种条形码、二维码 (Code 128、EAN-13、QR code等)

条形码和二维码是现代信息交换和数据存储的重要工具,它们将信息以图形的形式编码,便于机器识别和数据处理,被广泛应用于物流、零售、医疗、教育等各领域。 本文将介绍如何使用Python快速生成各种常见的条形码如Code 128、EAN-13,…

从传统到智能:安全帽AI检测算法助力工地/矿山/工厂/电力巡检安全监管

随着科技的快速发展,人工智能(AI)技术已经渗透到我们生活的方方面面,特别是在建筑工地这一对安全要求极高的领域中,AI技术的应用更是显得尤为重要。其中,安全帽AI检测算法以其高效、准确的特性,…

c++ 多边形 xyz 数据 获取 中心点方法,线的中心点取中心值搞定 已解决

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

Quartus程序烧录

1. .sof文件烧录&#xff08;断电丢失&#xff09; &#xff08;1&#xff09;Programmer&#xff08;程序设计&#xff09; &#xff08;2&#xff09;Hardware Setup...&#xff08;硬件设置&#xff09; &#xff08;如无USB-Blaster[USB-0]&#xff0c;在Hardware Setup..…

buuctf被嗅探的流量

下载出来是一个流量分析题 因为题目说了是联网状态下 嗅探到 所以一定有http协议 这里设置过滤器 一个一个去找吧 目前感觉wireshark的题都是http,太难的也不会

Perl文件锁机制:守护你的数据安全

&#x1f512; Perl文件锁机制&#xff1a;守护你的数据安全 在多任务和多用户的系统环境中&#xff0c;文件锁是确保数据完整性和一致性的关键机制。Perl作为一种强大的脚本语言&#xff0c;提供了多种文件锁处理方式&#xff0c;以支持并发访问时的安全性。本文将深入探讨Pe…

腾讯混元大模型集成LangChain

腾讯混元大模型集成LangChain 获取API密钥 登录控制台–>访问管理–>API密钥管理–>新建密钥&#xff0c;获取到SecretId和SecretKey。访问链接&#xff1a;https://console.cloud.tencent.com/cam/capi python SDK方式调用大模型 可参考腾讯官方API import json…

wpf 自定义 一个事件聚合自定义示例

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace WpfLibraryEventAggregator {public class EventAggregator{/// <summary>/// 定义数据暂存/// </summary>private readonly Dic…