项目中spring security与jwt

SpringBoot+Vue.js项目中使用Spring Security+JWT实现登录权限控制 目标和需求 我们的目的是在 SpringBoot+Vue.js 这样的前后端分离的项目中增加一个登录权限控制模块。这个模块的需求如下: 包含多个角色,每个角色所具有的权限不同(可以看到不同的菜单和页面) 对整个系统做登录控制,即未登录强制跳转到登录页面 登出功能 实现方案: 登录控制使用 Spring Security 框架,登录控制使用 JWT 实现,登录成功后使用 JWT 生成 token... 阅读详情

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

为什么采用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()
   ;
  }

创建Spring Security项目并实现基于JWT的身份验证和授权 项目在IntelliJ中打开后,我要做的第一件事是创建一个端点,我将其称为HelloResource,这是一个控制器类,并且包含一个简单的方法。由于我们在类中添加了Spring Security,默认情况下,Spring Security会创建一个用户,并且这个/hello端点将被放在认证墙后面,只有经过认证的用户才能访问。总的来说,这个项目实现了一个简单的Spring Boot和Spring Security应用,支持基于JWT的认证和授权,使我们能够保护API端点,确保只有经过认证的用户才能访问。 阅读详情

相关推荐

maven项目整合spring boot+mybatis+spring security+jwt(二)

接着上一篇(maven项目整合spring boot+mybatis+jwt+spring security(一))的继续。。。。 再就是整合jwt和spring security。 maven依赖: <!-- spring-security 和 jwt--> <dependency> <groupId>org.sprin...

ygynmei的博客 925

Spring Security+JWT简述

目录一. 什么是Spring Security1. 登陆校验的流程2. SpringSecurity基础案例二. Spring Security原理流程 一. 什么是Spring Security Spring Security是Spring家族的一个安全管理框架, 相比于另一个安全框架Shiro, 它具有更丰富的功能。一般中大型项目都是使用SpringSecurity做安全框架, 而Shiro上手比较简单 spring security 的核心功能: 认证(你是谁): 只有你的用户名或密码正确才能

姜守威的博客 2万+

第12章 STM32+BH1750光照传感器+OLED模块显示环境光照强度

相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,各位的传感器买到手后,赶紧跟着文章试试吧!

qq_44645742的博客 1万+

【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity与JWT实现权限管控以及登录认证指南

SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面,相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊。实际开发中还是要根据业务和项目的需求来决定使用哪一种.// 获取表单输入中返回的用户名 String userName =(String) authentication . getPrincipal();

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 1202

抖音直播“卡黑屏”技术解析:从实现原理到平台风控与合规运营

在直播技术领域,视频流推送与实时互动是核心基础。其原理在于通过编码软件(如OBS)将音视频数据封装后,经由网络协议推送到服务器,再分发给观众。这项技术的价值在于支撑了实时、高并发的在线互动场景,是直播、在线会议等应用的基石。然而,在追求流量和互动的实践中,衍生出一些非常规操作,例如通过技术手段中断或控制视频流推送,仅保留音频和互动功能,以达到特定运营目的。这便涉及到了**卡黑屏**这一具体现象。它本质上是对直播流的人为干预,常与**流量博弈**和**风险规避**等动机相关联。从工程实践角度看,实现方式多样,

weixin_29895109的博客 1283

IntelliJ IDEA 中git使用说明书

IntelliJ IDEA 中git使用说明书

junyang2012的博客 5388

Spring Security 超详细整合 JWT,能否拿下看你自己!

文章目录1.JWT 入门1.1 JWT 概念1.2 JWT 应用场景1.3 为何选择 JWT基于 Session 的传统认证基于 JWT 的认证1.4 JWT 的结构标头(Header)载荷(Payload)签名(Signature)1.5 RBAC (Role-Based Access Control)1.6 JWT 基本使用添加依赖生成 Token解析 Token2.Security 整合 JWT2.1 单独抽离 Security 模块添加相关依赖JWT 工具类JWT 相关配置JWT 登录授权过滤器自定

1万+

mmdetection 实战:基于Mask R-CNN与自定义COCO数据集的目标检测全流程解析

本文详细解析了如何使用mmdetection框架和Mask R-CNN模型,基于自定义COCO数据集完成目标检测任务的全流程。内容涵盖环境搭建、数据格式转换、配置文件定制化、模型训练与评估等核心步骤,并提供了针对工业缺陷检测场景的实用调优思路与避坑指南,帮助开发者高效构建高性能检测模型。

weixin_29046611的博客 136

SpringSecurity常见面试题汇总(超详细回答)

SpringSecurity常见面试题汇总

qq_33129875的博客 1万+

避坑指南:群晖DSM 7.X挂载NTFS硬盘,为什么你的SATA口不行?从原理到实战一次讲清

本文深入解析群晖DSM 7.X系统挂载NTFS硬盘的底层原理与实战排查方法,揭示SATA接口权限配置的关键参数(如esataportcfg和internalportcfg),并提供安全修改端口配置的详细步骤。针对不同型号群晖NAS的配置差异,给出替代方案与常见故障排查技巧,帮助用户解决NTFS硬盘挂载问题。

weixin_26757925的博客 256

livox avia平台搭建

livox雷达数据采集平台搭建

Shilong的博客 1308

Spring Security与JWT

Spring Security 的认证与授权

m0_68921558的博客 3627

图神经网络实战(2)——图论基础

图论 (Graph theory) 是数学的一个基本分支,涉及对图研究。图是复杂数据结构的可视化表示,有助于理解不同实体之间的关系。图论提供了大量建模和分析现实问题的工具,如交通系统、社交网络和互联网等。在本节中,将介绍图论的基本原理,主要涉及三个方面:图属性、图概念和图算法。

盼小辉丶的博客 1万+

Spring Boot Security JWT 项目教程

Spring Boot Security JWT 项目教程 项目介绍 Spring Boot Security JWT 是一个基于 Spring Boot 和 Spring Security 的开源项目,旨在通过 JSON Web Token (JWT) 实现安全的用户认证和授权。该项目提供了一个完整的解决方案,包括用户登录、令牌生成、验证以及权限管理等功能。通过使用 JWT,可以实现无状态的认证...

gitblog_00104的博客 469

普通用户也能免费使用 SAP Joule!

点击 SAP Joule 给出的按钮之后,SAP Business Application Studio 左侧显示的界面,就从 SAP Joule 替换成了 SAP Fiori tools 的 Project Accelerator 工具。接下来就是在后者中标准的操作流程了。笔者之前的文章,有朋友提问,既然 ChatGPT,DeepSeek,Grok 这些主流 AI 工具,回答 SAP 相关问题时都经常翻车,那 SAP 自家的 Joule 表现又如何呢?还有朋友评论:如何才能使用 SAP Joule?

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1012

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring Security JWT 开源项目推荐

Spring Security JWT 开源项目推荐 1. 项目基础介绍及主要编程语言 Spring Security JWT 是一个开源项目,旨在展示如何在 Spring Security 中使用 JSON Web Tokens(JWT)进行无状态认证。该项目主要使用 Java 语言编写,并依赖于 Maven 进行构建管理。 2. 项目核心功能 项目的核心功能是利用 JWT 和 Spring S...

gitblog_00046的博客 461

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Security JWT 项目常见问题解决方案

Spring Security JWT 项目常见问题解决方案 1. 项目基础介绍和主要编程语言 该项目是一个开源的Spring Security JWT示例项目,主要展示了如何在Spring Security框架中使用JWT(JSON Web Tokens)进行无状态身份验证。项目旨在补充Spring Security和JWT的无状态身份验证教程。项目代码中还包括了添加XSRF(跨站请求伪造)保护...

gitblog_00218的博客 533

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring Boot Security JWT 项目常见问题解决方案

Spring Boot Security JWT 项目常见问题解决方案 该项目是一个使用 Spring Boot 和 JWT (JSON Web Tokens) 实现的基于 Token 的认证示例。主要编程语言是 Java。 新手常见问题及解决方案 问题一:项目依赖和环境搭建 问题描述: 新手在搭建项目环境时可能会遇到依赖配置错误或环境搭建不成功的问题。 解决步骤: 确保你的开发环境已经安装了 ...

gitblog_01035的博客 450

常见问题解决方案:Spring Security JWT 项目

常见问题解决方案:Spring Security JWT 项目 1. 项目基础介绍 本项目是基于 Spring Boot 的一个示例项目,主要集成了 Spring Security 和 JWT(JSON Web Token)进行用户登录验证。它包含了权限管理、Token 刷新功能以及心跳机制。项目使用了 Java 作为主要的编程语言,并且通过 Maven 进行依赖管理。 2. 新手常见问题及解决步...

gitblog_00450的博客 599

Spring Boot 项目中实现 JWT + Security 的完整流程

Spring Security 本质是。

qq_62024906的博客 699

Spring Boot + Security + JWT 项目复盘:从零构建一个安全的 RESTful API

本文介绍了一个基于SpringBoot和JWT的用户-水果管理系统,采用三层架构实现用户认证和授权功能。系统核心模块包括用户注册/登录/信息更新/注销,以及水果添加和分页查询功能。技术栈整合了SpringSecurity、MyBatis、MySQL和PageHelper,通过JwtAuthenticationFilter实现无状态认证。重点阐述了安全配置、JWT工具类、统一响应格式等关键组件,展示了如何通过SpringSecurity上下文获取当前用户信息进行业务操作。系统采用BCrypt密码加密和事务管理

m0_58211807的博客 1379

使用Spring Boot、Spring Security和JWT实现认证授权:Bezkoder开源项目详解

使用Spring Boot、Spring Security和JWT实现认证授权:Bezkoder开源项目详解 在开发Web应用时,安全和认证是不可或缺的部分。 提供了一个开源项目,它结合了Spring Boot、Spring Security和JSON Web Token(JWT)技术,为开发者提供了一套完整的身份验证和授权解决方案。本文将深入探讨该项目的技术细节、用途及其独特之处。 项目简介 该...

gitblog_00076的博客 402

Spring Security + JWT 实战:前后端分离项目的认证授权方案(从入门到落地)

本文介绍了SpringSecurity与JWT结合的认证授权方案。,JWT负责无状态传递用户信息,避免ACM的Session共享问题。文章详细说明了实现步骤:1)引入SpringSecurity和JJWT依赖;2)自定义UserDetailsService查询用户;3)编写JWT工具类处理Token生成与验证;4)配置JWT过滤器拦截请求;5)设置SecurityConfig处理接口权限和跨域问题。特别强调了密码必须BCryptisar加密存储、需要关闭CSRF防护、可通过Redis实现Token黑名单等注

Pretend________的博客 1167

推荐项目:Spring Boot Security Jwt Authentication - 强力的JWT认证解决方案

推荐项目:Spring Boot Security Jwt Authentication - 强力的JWT认证解决方案 在这个数字化的时代,安全是任何Web应用程序的核心,而Spring Boot Security Jwt Authentication为我们提供了一个优雅且强大的解决方案。该项目作为一个样例,详细展示了如何在Spring Boot应用中集成JWT(JSON Web Tokens)进...

gitblog_00065的博客 504

Spring Security+JWT+Redis实现项目级前后端分离认证授权

本文介绍了一种前后端分离架构下,基于Spring security框架进行用户认证授权的方法,其中包括登录、登出、认证、授权、密码加密、jwt等知识点

weixin_71894495的博客 2126
上一篇: juc并发线程学习笔记(一)
下一篇: 数据结构的美之链表和树
happystudy_neu
博客等级 码龄4年 1140粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值