项目中spring security与jwt.腾讯面试分享

news2025/3/14 6:59:04

写这篇文章是为了记录我面试pcg时平时没有留意或者钻研的地方。

面试是根据项目问的问题:

为什么采用jwt存储token?

        我的项目是微服务项目,里面部署了资源服务和认证服务,这里选择jwt作为token一方面是可以存储用户的信息,可以将用户身份信息存储在令牌中,用户认证通过后认证服务颁发令牌给用户,用户将令牌存储在客户端,去访问应用服务时携带令牌去访问,服务端从jwt解析出用户信息。也就是所说的无状态认证。如果是session认证的话存储在服务端会加大服务端的压力,不适合运用于分布式系统。

总结来说就是:灵活性,一致性,故障发生的可用性,以及多平台维护的代价。

        另一个目的也就是去实行资源的自认证,每次经过网关的时候,就判断令牌的有效性。以此来决定是否可以访问该资源。

jwt存储信息都存储在哪里,关键信息存储在里面么?

jwt的组成部分一般为三部分,头部,负载,和签名部分。我存储的信息一般放置于负载部分,当然,肯定是不建议将密码等私密信息存储在里面的。

spring security是如何和jwt进行结合的呢?

换句话说,如何设置springsecurity的令牌?

        这里我之前都是知道怎么去运用,并没有去看过源码,只知道这么配置一下就好了。但项目被拷打了,问了我意想不到的地方,但还是要好好去琢磨琢磨。

首先我们看令牌的配置在哪里

AuthorizationServerConfigurerAdapter这个类
ClientDetailsServiceConfigurer客户端详情的配置
AuthorizationServerSecurityConfigurer安全配置,谁能允许通过

说白了这三个配置都是需要你去实现的。但是我们这里只讲令牌。

这个bean是我们自己配置的,定义了bean并指定了名字。

配置一个TokenConfig

定义令牌服务:

可以看到这两个bean的名字是一样的。refreshToken解决的其实是令牌的续期问题。当jwt令牌快过期时使用刷新令牌可以再次生成jwt令牌。

jwt的加密方式是什么?

可以知道,jwt的整体可以用HMAC算法或使用RSA的公钥/私钥对来签名。我们的整理就是

  HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret)

这样的结构。使用base64编码对header和payload两个部分进行编码,再和secret一起加密。

base64:在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64的出现就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法。 但是原理我个人认为看一遍就好了,不用去死记硬背。

数据库里的密码是明文存储的吗?前后端密码验证时如何比对的?

这个是我自己思考的问题,也是我重新看代码的时候看的。

说到这里,我们不妨从头开始顺一下spring security自带的流程。

我们输入的密码一般是变成表单提交,那么它会被封装到AUthentication里。

我们可以看到这里的调用关系AuthenticationManager调用DaoAuthenticationProvider,而DaoAuthenticationProvider里的UserDetailsService里又会调用loadUserByUsername来获取用户的信息,并将获取到的用户信息以springsecurity里的Userdetail方式返回。注意这里通过PasswordEncoder的BCryptPasswordEncoder方式,这个是暗文存储。我觉得可以记一下这个加密方式,因为被问了,我就没记住这个,因为我觉得这个不是重点但还真问了。

BCryptPasswordEncoder

配置这个来决定security框架自身的密码比对。密码的形式,这个是自带的!!

当然也可以手动的自行配置,不用框架自带的 UserDetailsService也就是可以重写loadUserByUsername方法和比对方式。

这里就会发现,encode里竟然发现了salt字样,没错,BCryptPasswordEncoder里面自带加盐操作,如果你不指定,那么他会按照自己的配置的一些值来给你加盐。

获取盐代码:

加密算法:

通过输入密码和根据密码特点获得的盐来进行加密

random.nextBytes(rnd);

因为每次的 salt 不同,因此每次的 hash 也不同。这样就可以使得相同的 明文 生成不同的 密文

那么如果这个数据库中的密码,我们是通过BCryptPasswordEncoder加密的存储在数据库当然中的。我们应该如何进行比较用户输入的是否正确呢?因为用户输入的密码也不是暗文的啊。

那么怎么知道用户输入的密码和数据库中的密码是否一致呢?

这里还是要看BCryptPasswordEncoder的源码

继续跟踪hashpw这个方法,我们会发现和加密时候的方法hashpw是一样的。

我们会发现,这个方法会将自己定义的盐取出来,并且base64解码,最后和我们的密码加密一下,然后和之前的数据库的暗文进行对比。

是否了解加盐,如何加盐,加盐的意义是什么?

个人理解我觉得可以和jwt的secret部分做类比。都是通过添加随机的一部分。安全的提高就是:随机数+混入形式。

        密码加盐里包含随机值和加密方式。随机值是随机产生的,并且以随机的方式混在原始密码里面,然后按照加密方式生成一串字符串保存在服务器。换言之,这个是单向的,电脑也不知道客户的原始密码,即使知道加密方式,反向推出的加密前的字符串也是真正密码与随机值混合后的结果,从而无法解析用户的真正密码。那么是如何验证密码的呢?当你再次输入密码,会以相同的加盐方式生成字符串,如果和之前的一致,则通过。而其它用户无法获得这种加密方式:即生成哪些随机数,以什么方式混入进去,自然就很安全。

如何生成随机字符串?

可以使用org.apache.commons.lang包下有一个RandomStringUtils类,其中有一个randomAlphanumeric(int length)函数,可以随机生成一个长度为length的字符串。 

RandomStringUtils.randomAlphanumeric(10);

加盐的意义用gpt解释的来看吧。 

前后端密码验证的时候是如何比对的?

jwt的密钥存储在哪里?

这里附属上gpt

jwt的负载部分内容是从哪获得的?

这个也是自己的思考,其实我也好奇为什么这么设置就可以改变jwt里负载的内容。

这个还得跟踪spring security里代码

点击一下

JwtAccessTokenConverter 

我们可一看到这个里面实现了两个类,我们可以通过tokenenhance里的enhance编写自己的enhance方法来增强扩展这个token信息。当然这里要看的是AccessTokenConverter

一直好奇这里的负载信息哪来的,这就有个信息提取方法

终于看到了这个username

这里其实也就是我们在返回userdetail信息里的username

而extractAutentication里的其他信息我画红色的也来自于我们的客户端配置

  public void configure(ClientDetailsServiceConfigurer clients)
          throws Exception {
        clients.inMemory()
                .withClient()// client_id
                .secret()//客户端密钥
                .resourceIds()//资源列表
                .authorizedGrantTypes()// 该client允许的授权类型
                .scopes()// 允许的授权范围
                .autoApprove()//false跳转到授权页面
                //客户端接收授权码的重定向地址
                .redirectUris()
   ;
  }

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

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

相关文章

【DPDK】基于dpdk实现用户态UDP网络协议栈

文章目录 一.背景及导言二.协议栈架构设计1. 数据包接收和发送引擎2. 协议解析3. 数据包处理逻辑 三.网络函数编写1.socket2.bind3.recvfrom4.sendto5.close 四.总结 一.背景及导言 在当今数字化的世界中,网络通信的高性能和低延迟对于许多应用至关重要。而用户态网…

C++指针(四)

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三) 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…

文件批量重命名神器:按长度与区间智能管理,让文件整理更高效!

在数字化时代,电脑中堆积如山的文件常常让我们头疼不已。命名不规范、杂乱无章的文件不仅占用了大量的存储空间,更在关键时刻让我们难以迅速找到所需内容。现在,有了这款文件批量改名神器,一切烦恼将烟消云散! 首先&a…

时隔n年再度会看Vue,Git

时隔n年再度会看Vue,Git 曾经沧海难为水,除却巫山不是云。不知道这句话用在这里合不合适,好多东西在记忆中都淡化了。但是互联网确是有记忆的。研究以前项目的时候,翻看到gitee码云上托管的项目,就像是自己的孩子重新又回来了一样…

观其大略之HybridCLR学习笔记

问题背景 1 现有热更方案的开发效率、性能没有到达极限,还有提升的空间 2 ios多平台政策导致热更新受限问题,ios禁止jit。根据我查找的资料,ios的代码段启动的时候就确定了,不能增加新的代码段。IOS封了内存(或者堆&…

如何摆脱水印困扰?三款神器助您清爽无烦恼!

水印常常成为我们图片处理的一大难题,让我们苦恼不已。那么,如何能轻松摆脱这些烦人的水印呢?本文将向您推荐三款强大的去水印工具,让您清爽无烦恼,图片重焕光彩! 1. 水印云 如何快速而准确地去除各类水印…

Stable Diffusion 解析:探寻 AI 绘画背后的科技神秘

AI 绘画发展史 在谈论 Stable Diffusion 之前,有必要先了解 AI 绘画的发展历程。 早在 2012 年,华人科学家吴恩达领导的团队训练出了当时世界上最大的深度学习网络。这个网络能够自主学习识别猫等物体,并在短短三天时间内绘制出了一张模糊但…

【RK3288 Android6, T8PRO 快捷按键 gpio 配置上拉输入】

文章目录 【RK3288 Android6, T8PRO 快捷按键 gpio 配置上拉输入】需求开发过程尝试找到没有用的上拉gpio尝试修改pwm1的gpio的默认上拉模式 改动 【RK3288 Android6, T8PRO 快捷按键 gpio 配置上拉输入】 需求 T8pro想要模仿T10 的 快捷按键&#xff…

嵌入式开发的常用软件、学习资源网站推荐

1、软件推荐 1.1、文本编辑软件 ——Notepad 1、适合编写和查看文本文件,也可以安装插件来查看二进制文件、对比文件 2、参考博客:《Notepad实用小技巧》; 1.2、PDF文件阅读软件——福昕PDF阅读器 福昕PDF阅读器,在官网就可以下载…

电商店群系统的搭建需要用到的官方接口如何申请?

电商电子商务企业往往都会需要再很多平台上面铺货,上传商品。 高科技的今天,我们已经不需要手动一个个品去上传了。那通过官方接口,如何实现快速铺货呢? 1688官方开放平台的API接口类型众多,并不是所有的企业都能申请…

springboot3.x集成nacos踩坑,并实现多环境配置

一、nacos安装部署 springboot3.x集成Nacos首先需要将Nacos从1.x升级到2.x,建议直接安装2.x版本,手动将1.x的配置信息迁移到2.x中,先并行一段时间,待全部迁移完成稳定运行之后再停掉1.x,升级和安装、操作请查看官方文…

HBuilder X删除之前登录的账号

打开目录 C:\Users\Administrator\AppData\Roaming\HBuilder X 用 HBuilder X 打开文件 prefs 将账号删除 保存文件 重启HBuilder X即可

开发手札:unity2022+vscode1.87联合开发

不得不说,时间的力量是很强大的,同时熵增理论适用于任何地方。 在现在的公司干了五年多了,五年前配置的内网开发机,i7 870016g1t hddgtx1080已经卡爆了,特别是硬盘掉速严重,开机开软件没有一两分钟都…

班主任管理班级的策略与措施

在教育的世界里,班主任不仅是知识的传递者,更是学生心灵的引路人。那么,如何在这个充满挑战和机遇的岗位上,舞动管理的翅膀,让班级飞得更高更远呢? 深入了解学生。这不仅仅是了解学生的姓名、成绩&#xff…

网络编程:TCP机械臂,UDP文件传输

1.TCP机械臂测试 程序代码&#xff1a; 1 #include<myhead.h>2 #define SER_IP "192.168.126.112" //服务器IP3 #define SER_PORT 8888 //服务器端口号4 5 #define CLI_IP "192.168.126.121" //客户端IP6 #define CLI_PORT 9999 //…

阿里云服务器2核2G性能测评99元一年和61元一年

阿里云2核2G服务器多少钱&#xff1f;99元一年&#xff0c;轻量云服务器是61元一年。2核2G服务器性能如何&#xff1f;性能很不错&#xff0c;不限制CPU性能&#xff0c;99元2核2G服务器是ECS经济型e实例&#xff0c;61元2核2G服务器是轻量应用服务器&#xff0c;都是3M公网带宽…

【智慧互联,有序充电,多场景充电】企业微电网能效及充电管理解决方案

企业需求&#xff08;目的地充电&#xff09; 站在企业的角度&#xff0c;除了要主动承担碳达峰、碳中和的社会责任&#xff0c;也需要考虑自身的经营和利润&#xff0c;需要结合企业的现状进行改造 01用能可靠、清洁 02用能安全怎么重视都不为过 03专业全面的能源管理需求…

windows无界鼠标,多机共享一套键鼠

原因 当前使用一台笔记本和一个台式机。用起来很麻烦。想要找到共享键鼠的方案。找到了无界鼠标这个软件。 安装 在两台电脑上都安装powertoy应用。 https://github.com/microsoft/PowerToys csdn下载 安装完成后找到无界鼠标打开 配置 多台电脑配置相同的key,刷新识别设…

ETAS工具链ISOLAR-AB重要概念,RTE配置,ECU抽取

RTE配置界面&#xff0c;包含ECU抽取关联 首次配置RTE&#xff0c;出现需要勾选的抽取EXTRACT 创建System System制作SWC到ECU的Mapping System制作System Data 的Mapping

简洁实用的wordpress外贸网站模板

坚果蜜饯wordpress跨境电商模板 木瓜干、菠萝干、夏威夷果、芒果干、椰片、巴旦木等wordpress跨境电商模板。 https://www.jianzhanpress.com/?p3944 珠宝手饰wordpress外贸网站模板 金银手饰、珍珠手饰、翡翠手饰、钻石手饰、玉石珠宝手饰wordpress外贸网站模板。 https:…