实现目标:在没有判断登录认证的情况下,访问任意界面,直接跳转到登录界面。

添加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),成功进行授权页面的访问。

  • 来源 https://gitee.com/XZHongAN

密码存储与加密

config.SecurityConfig类中,实现用户密码的加密存储

放行登录、注册等接口

如果直接用明文密码来存储,需要在数据库中加上{noop}标记,代表不需要加密直接判断

  • BCrypt 是 一种用于密码哈希的安全算法。借助BCryptPasswordEncoderencode()方法更新数据库中的明文密码

  • 要在添加阶段就直接存储加密阶段的代码,用到 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 种调试方式

  1. 前端 ajax 调试
  2. 用 postman(以后学习)

对于返回的 token

比如:

"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5OWE5ZThjZDNlZDI0OTI3YTZiMWMzNDk5MDU1ZDljMyIsInN1YiI6IjEiLCJpc3MiOiJzZyIsImlhdCI6MTY1ODk3MjYzMCwiZXhwIjoxNjYwMTgyMjMwfQ.iioSQLuAyzpYLPzTgGuhs1ODb6mYIzpqnz6K8VQqbWc"

https://jwt.io/进行解析,可以得到对应的 userID。

JWT登录认证-项目BotBattle的更多相关文章

  1. 实战模拟│JWT 登录认证

    目录 Token 认证流程 Token 认证优点 JWT 结构 JWT 基本使用 实战:使用 JWT 登录认证 Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Tok ...

  2. 【项目实践】一文带你搞定Session和JWT的登录认证方式

    以项目驱动学习,以实践检验真知 前言 登录认证,估计是所有系统中最常见的功能了,并且也是最基础.最重要的功能.为了做好这一块而诞生了许多安全框架,比如最常见的Shiro.Spring Security ...

  3. 全栈项目|小书架|服务器开发-NodeJS 使用 JWT 实现登录认证

    通过这篇 全栈项目|小书架|服务器开发-JWT 详解 文章我们对JWT有了深入的了解,那么接下来介绍JWT如何在项目中使用. 安装 $ npm install jsonwebtoken 生成 Toke ...

  4. Luffy之登录认证以及JWT

    1.用户认证 在前面我们已经完成了,前端登录页面的搭建,以及路由分配,现在我们作关于登录认证部分的东西 Django提供了认证系统.认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做 ...

  5. 【技术博客】JWT的认证机制Django项目中应用

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...

  6. 10分钟简单学习net core集成jwt权限认证,快速接入项目落地使用

    什么是JWT JSON Web Token(JWT)是目前最流行的跨域身份验证.分布式登录.单点登录等解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的 ...

  7. 基于jwt的用户登录认证

    最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...

  8. 基于JWT的Token登录认证(一)

    1.JWT简介 JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案. session登录认证方案:用户从客户端传递用户名.密码等信息,服务端认证后将信息存储在session中 ...

  9. JWT实现登录认证实例

    JWT全称JSON Web Token,是一个紧凑的,自包含的,安全的信息交换协议.JWT有很多方面的应用,例如权限认证,信息交换等.本文将简单介绍JWT登录权限认证的一个实例操作. JWT组成 JW ...

  10. 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!

    小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...

随机推荐

  1. 50从零开始用Rust编写nginx,原来TLS证书还可以这么申请

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...

  2. day03--实际操作演示linux系统挂载过程

    # 第一步骤: 拥有一个存储设备-光驱,使光驱加载光盘 # 第二步骤: 在linux系统中找到光驱设备 ls -l /dev/cdrom # 第三步骤: 需要将存储设备进行 挂载 挂载命令语法格式: ...

  3. 【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面

    问题描述 在App Service Linux环境中,如部署Tomcat 应用后,如果访问的页面找不到,应用会返回一个由Azure生成的404页面,那么是否可以修改它呢? PS: 如果是App Ser ...

  4. C#多线程(5):资源池限制

    目录 Semaphore.SemaphoreSlim 类 Semaphore 类 示例 示例说明 信号量 SemaphoreSlim类 示例 区别 Semaphore.SemaphoreSlim 类 ...

  5. 使用JMeter的JSON提取器:通过递归下降查找,从接口响应中提取特定字段

    在接口测试中,我们经常需要从返回的JSON数据中提取特定字段以便后续使用.JMeter提供了JSON提取器,可以帮助我们实现这一目标.本文将介绍如何使用JMeter的JSON提取器通过递归下降查找的方 ...

  6. 从零开始写 Docker(四)---使用 pivotRoot 切换 rootfs 实现文件系统隔离

    change-rootfs-by-pivot-root.png 本文为从零开始写 Docker 系列第四篇,在mydocker run 基础上使用 pivotRoot 系统调用切换 rootfs 实现 ...

  7. Java 类的结构之三 :构造器(或构造方法,constructor)的使用

    1 /* 2 * 类的结构之三 :构造器(或构造方法,constructor)的使用 3 * construct:建设 建造 4 * 5 * 一.构造器的作用: 6 * 创建对象 7 * 初始化对象的 ...

  8. elementPlus使用el-icon

    按着文档来撒 yarn add @element-plus/icons-vue main.ts import * as ElementIcons from '@element-plus/icons-v ...

  9. javascript web development es6 pdf js - Cheat Sheet 表格 [vuejs / webcomponents-cheatsheet-2021] 共3套

    ES6 预览 VUE2 预览 webcomponents 预览 ES6 2019 pdf下载: https://files.cnblogs.com/files/pengchenggang/javasc ...

  10. k8s创建Pod的流程

    Kubernetes(k8s)中Pod的创建过程是一个涉及多个组件协作的复杂流程,下面将详细描述这个过程,确保内容的详尽性和深度. 一.用户提交创建请求 Pod的创建始于用户通过kubectl命令行工 ...