JWT登录认证-项目BotBattle
实现目标:在没有判断登录认证的情况下,访问任意界面,直接跳转到登录界面。
添加Spring Security依赖来实现登录认证
session 授权认证原理
实现config.SecurityConfig类
SessionID 相当于给浏览器颁发的一张临时身份证,之后浏览器在执行业务操作的时候,都要随身携带这个身份证。
1.sessionID 生成与保存
login 页面登录成功后,后端生成 SessionID,将其同时保存在后端数据库与浏览器的 Cookie 中
2.sessionID 和请求一起传送给后端
每次向后端 Springboot 发送请求的同时,会从 Cookie 中取出将 SessionID 一起传送给后端 Springboot。Springboot 通过向数据库查询判断当前 SessionID 是否存在以及是否过期


PS:后端查询判断
如果存在,将有关 SessionID 的信息(包括对应的用户名、过期时间)从数据库中取出,判断是否过期。
若 SessionID 过期或者根本不存在,则返回给用户登录页重新登录。
若 SessionID 没有过期,则通过 SessionID 与用户信息 userInfo 的映射关系,将对应的 User 提取到上下文中(在 Contoller 中就可以通过一些 API 来拿到 User),成功进行授权页面的访问。
密码存储与加密
在config.SecurityConfig类中,实现用户密码的加密存储
放行登录、注册等接口
如果直接用明文密码来存储,需要在数据库中加上{noop}标记,代表不需要加密直接判断
BCrypt 是 一种用于密码哈希的安全算法。借助
BCryptPasswordEncoder的encode()方法更新数据库中的明文密码要在添加阶段就直接存储加密阶段的代码,用到 PasswordEncoder
jwt(JSON Web Token)验证
对于前后端分离的情况,使用 session 可能会出现跨域问题。
浏览器的同源策略(Same-Origin Policy)限制了来自不同源(即不同的协议、域名或端口)互相之间的某些操作。
想象你住在一个严格管理的小区里(浏览器),而小区有一条规定:你只能和住在同一栋楼里的邻居(同源服务器)自由交流和分享东西(数据请求)。现在,你想要和住在隔壁楼的一个邻居交换东西(跨域请求),但是物业(浏览器的同源策略)不允许你这么做,除非隔壁楼的邻居明确告诉物业,他们愿意接受你,并且确认这次交换是安全的(CORS 策略)。如果你想通过物业的特殊通行证(Cookie)证明你的身份来进行这次交换,物业还需要验证这个通行证是不是也被邻居接受的(允许携带 Cookie 的跨域请求)。在使用 Session 认证时,如果没有正确处理这些安全策略,你就无法成功地和不同楼栋的邻居交换东西了。
比如 Ajax 请求数据。当你的前端应用尝试从一个源向另一个源的服务器发送请求时,就会遇到跨域问题。
JWT 的无状态认证机制
JWT 的 T 是指包含认证信息的 Token。这个 Token 是在用户成功登录后生成的,包含了一系列的声明(Claims),例如用户的 ID、Token 的发行者、过期时间等。
这个 Token 会被服务器数字签名后发送给客户端,客户端随后的每个请求都会携带这个 Token。
服务器通过验证这个 Token 的签名来认证用户的请求,而不需要保存任何用户状态信息。服务器不需要保存任何用户状态信息,也就是“无状态的认证机制”的“无状态”。
jwt 验证的优点
- 容易实现跨域
- 不需要在服务器端存储
- 对于有多个服务器的情况,就可以实现用一个令牌来登录多个服务器
添加依赖:
jjwt-api
jjwt-impl
jjwt-jackson
对于 url 可以分为两大类:
- 公开可以访问(本项目中,对于登录和注册的 URL,公开可以访问)
- 需要授权才能访问
实践与调试
实现utils.JwtUtil类,创建、解析 jwt token
实现config.filter.JwtAuthenticationTokenFilter类,用来验证 jwt token 是否合法有效,如果验证成功,则将 User 信息注入上下文中
配置config.SecurityConfig类,放行登录、注册等接口
登录一般是 post 请求。
登录如果是 get 请求,会将用户名和密码参数放在 url 链接中,明文传输。显然不能这样。
选择 Post 请求,就没法从浏览器输入 URL 的方式进行访问,不能在浏览器中调试。有 2 种调试方式
- 前端 ajax 调试
- 用 postman(以后学习)
对于返回的 token
比如:
"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5OWE5ZThjZDNlZDI0OTI3YTZiMWMzNDk5MDU1ZDljMyIsInN1YiI6IjEiLCJpc3MiOiJzZyIsImlhdCI6MTY1ODk3MjYzMCwiZXhwIjoxNjYwMTgyMjMwfQ.iioSQLuAyzpYLPzTgGuhs1ODb6mYIzpqnz6K8VQqbWc"
在https://jwt.io/进行解析,可以得到对应的 userID。
JWT登录认证-项目BotBattle的更多相关文章
- 实战模拟│JWT 登录认证
目录 Token 认证流程 Token 认证优点 JWT 结构 JWT 基本使用 实战:使用 JWT 登录认证 Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Tok ...
- 【项目实践】一文带你搞定Session和JWT的登录认证方式
以项目驱动学习,以实践检验真知 前言 登录认证,估计是所有系统中最常见的功能了,并且也是最基础.最重要的功能.为了做好这一块而诞生了许多安全框架,比如最常见的Shiro.Spring Security ...
- 全栈项目|小书架|服务器开发-NodeJS 使用 JWT 实现登录认证
通过这篇 全栈项目|小书架|服务器开发-JWT 详解 文章我们对JWT有了深入的了解,那么接下来介绍JWT如何在项目中使用. 安装 $ npm install jsonwebtoken 生成 Toke ...
- Luffy之登录认证以及JWT
1.用户认证 在前面我们已经完成了,前端登录页面的搭建,以及路由分配,现在我们作关于登录认证部分的东西 Django提供了认证系统.认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做 ...
- 【技术博客】JWT的认证机制Django项目中应用
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...
- 10分钟简单学习net core集成jwt权限认证,快速接入项目落地使用
什么是JWT JSON Web Token(JWT)是目前最流行的跨域身份验证.分布式登录.单点登录等解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的 ...
- 基于jwt的用户登录认证
最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...
- 基于JWT的Token登录认证(一)
1.JWT简介 JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案. session登录认证方案:用户从客户端传递用户名.密码等信息,服务端认证后将信息存储在session中 ...
- JWT实现登录认证实例
JWT全称JSON Web Token,是一个紧凑的,自包含的,安全的信息交换协议.JWT有很多方面的应用,例如权限认证,信息交换等.本文将简单介绍JWT登录权限认证的一个实例操作. JWT组成 JW ...
- 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!
小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...
随机推荐
- RK3568开发笔记(二):入手RK3568开发板的套件介绍、底板介绍和外设测试
前言 本篇主要介绍RK3568芯片和入手开发板的底板介绍以及开发板的外设. 开发板 笔者的开发板是全套+10.1寸屏. 开发板实物 开发板资源 开发版本提供资料 开发 ...
- 【LeetCode回溯算法#11】解数独,这次是真的用回溯法处理二维数组
解数独 力扣题目链接(opens new window) 编写一个程序,通过填充空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出 ...
- 关于 LLM 和知识图谱、图数据库,大家都关注哪些问题呢?
自 LLM 系列文章<知识图谱驱动的大语言模型 Llama Index>.<Text2Cypher:大语言模型驱动的图查询生成>.<Graph RAG: 知识图谱结合 L ...
- 微信小程序开发:接入阿里云人像动漫化api接口
前面我已经把腾讯云的人像转动漫化接口接到了我的小程序里,但是和阿里云的对比后,发现阿里云的效果会更好一些,且支持更多特效,如下: 我比较喜欢这个3D特效风格,动画3D也可以,大家拭目以待. 话说上次接 ...
- Java与sql中的字符串表示
在 Java 中,双引号 "" 用于表示字符串字面量,而单引号 '' 用于表示字符字面量.这意味着在 Java 中,您可以使用双引号来包围包含任意数量字符的字符串,包括零个字符(空 ...
- 掌握pandas cut函数,一键实现数据分类
pandas中的cut函数可将一维数据按照给定的区间进行分组,并为每个值分配对应的标签.其主要功能是将连续的数值数据转化为离散的分组数据,方便进行分析和统计. 1. 数据准备 下面的示例中使用的数据采 ...
- c语言四则运算小程序
本文源程序代码来源于csdn一位博主: 文章链接:http://t.csdnimg.cn/L29fs 原程序简洁凝练,以简短的代码写出了一个加法运算器. 以下是运行结果(本文全程用visual stu ...
- Thinkphp6 自定义命令创建类文件
以创建控制器为例 1.先通过 think 命令创建一个make文件,效果如下图: php think make:command make/MyController 2.修改上面创建的文件[MyCont ...
- Java面向对象(中)--super/多态/向下转型/equals/toString/包装类/单元测试工具
java对象 方法重写 子类继承父类以后,可以对父类同名同参数的方法,进行覆盖操作 重写后,当创建子类对象以后,通过子类对象调用子父类中同名同参数的方法时,执行的是子类重写父类的方法. 如何区分方法重 ...
- 正则表达式 <h2>kk</h2> 替换为 <h2 id="kk">kk</h2>
`<h2>kk</h2><h2>k333k</h2>`.replace(/\<h2>(.*?)<\/h2>/g, `<h2 ...