当前位置: 首页 > news >正文

token和JWT token区别、登录安全、页面权限、数据权限、单点登录

 直接区别:token需要查库验证token 是否有效,而JWT不用查库或者少查库,直接在服务端进行校验,并且不用查库。因为用户的信息及加密信息在第二部分payload和第三部分签证中已经生成,只要在服务端进行校验就行,并且校验也是JWT自己实现的。
 


JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

组成:
JWT包含三个部分: Header头部,Payload负载和Signature签名。由三部分生成token,三部分之间用“.”号做分割。 列如 : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. Header 在Header中通常包含了两部分:type:代表token的类型,这里使用的是JWT类型。 alg:使用的Hash算法,例如HMAC SHA256或RSA.

{ "alg": "HS256", "typ": "JWT" } 这会被经过base64Url编码形成第一部分

2. Payload token的第二个部分是荷载信息,它包含一些声明Claim(实体的描述,通常是一个User信息,还包括一些其他的元数据) 声明分三类: 1)Reserved Claims,这是一套预定义的声明,并不是必须的,这是一套易于使用、操作性强的声明。包括:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等 2)Plubic Claims, 3)Private Claims,交换信息的双方自定义的声明 { "sub": "1234567890", "name": "John Doe", "admin": true } 同样经过Base64Url编码后形成第二部分

3. signature 使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。 例如使用的是HMAC SHA256算法,大致流程类似于: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 这个signature字段被用来确认JWT信息的发送者是谁,并保证信息没有被修改 。

可参考地址:JWT实现token令牌中心__意大师的博客-CSDN博客
JWT技术简介和使用_秋天的童话_的博客-CSDN博客_jwt技术

服务端接收处理:

1. 解析JWT

2. 判断签名是否正确,根据生成签名时使用的密钥和加密算法,只要这一步过了就说明是payload是可信的

3. 判断JWT token是否过期,根据exp,判断是否是VIP,根据isVip

还有一种简单登录做法:不需要任何签名加密,直接用户名和密码登录后返回一个jwt token

token登录安全策略(中等)
(1)、首先调用服务端接口,返回一个时间有效期为5分钟的RSA公钥接口。  (2)、然后客户端按照一定格式使用公钥加密请求登录接口,返回token

(2)、首先调用服务端接口,返回一个时间有效期为5分钟的RSA公钥接口。 (2)、客户端和服务端使用一对对称秘钥AES,客户端进行按照一定格式使用AES进行签名,生成签名sign字符串,然后将登录信息和签名都加密发送到服务端   (3)、服务端先解密,然后验签,验签通过后返回token给客户端。


token续约,大概有以下几种:

1、重新设置令牌的过期时间:就和Tomcat 中的Session一样,此时令牌有状态,客户端携带令牌访问,资源服务器需要对令牌的过期时间进行判断,比如发现过期时间小于5分钟时,重新设置设置过期时间。

2、使用刷新令牌:直接重新设置访问令牌的过期时间,可能存在安全问题,如果被窃取了这个令牌,那么这个令牌可以一直用,所以可以使用刷新令牌机制,认证通过后,颁发访问令牌和刷新令牌,刷新令牌客户端自己保存,当访问令牌过期时,使用刷新令牌再申请一个新的访问令牌,这样就避免了一些安全问题。

可参考地址:Spring Security系列(27)- Spring Security Oauth2之令牌过期和续签问题解决方案(1)_云烟成雨TD的博客-CSDN博客_oauth2刷新令牌过期


经典用户角色权限老框架:spring security
可参考地址:Spring Security 详解_律二萌萌哒的博客-CSDN博客_springsecurity


服务端:返回该用户可用资源列表


前端vue:
v-if="hasPermission(['goods:list:audit'])"

根据服务端返回资源跟page页面和button进行控制是否展示。

最新用户角色权限新框架:Sa-Token
主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题,框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见业务进行N多适配,通过sa-token,你可以以一种极简的方式实现系统的权限认证部分,比spring security更加简单
官网地址:Sa-Token

MyBatis-Plus数据权限插件
实现思路:AOP注解和线程上下文变量传递参数到Mybatis-Plus SQL拦截器,使用JSqlParser AST SQL语法解析树操作Where动态添加过滤条件

服务端实现

拦截器实现:

获取用户数据权限,如图所示:


后台操作:

1、表数据



2、新增数据角色


3、给数据角色绑定数据权限


可参考其他作者文章地址:MyBatis-Plus数据权限插件_格一物的博客-CSDN博客_mybatis plus 数据权限插件

RBAC(Role-Based Access Control):基于角色的访问控制,现在主流的权限管理系统的权限设计都是 RBAC 模型,通过用户关联角色,角色关联权限,来间接的为用户赋予权限


OAuth 2.0:是一种授权机制,主要核心用来颁发令牌(token)           ----》经典单点登录技术
OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。......资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。
业务场景:CSDN登录可以使用第三方登录,QQ、微信、微博、百度等等、用户点击任何一个进行授权登录

OAuth 2.0 规定了四种获得令牌的流程。你可以选择最适合自己的那一种,向第三方应用颁发令牌。下面就是这四种授权方式。
授权码(authorization-code)
隐藏式(implicit)
密码式(password):
客户端凭证(client credentials)

登录授权时序图:

76c443109b2d5c228897fe6e996707a3.png

可参考地址:https://blog.csdn.net/qq_54867440/article/details/125033266

单点登录--》实现方式OAuth 2.0
最常见的例子是:
1、我们打开淘宝APP,首页就会有天猫、聚划算等服务的链接,当你点击以后就直接跳过去了,并没有让你再登录一次
后台管理系统有多个


2、是在企业内部多个应用系统(如考勤系统、财务系统、人事系统等)场景下,用户只需要登录一次,就可以访问多个应用系统

第一种类型:H5、android、ios客户端单点授权登录,如图所示

 第二种类型,后台管理系统单点登录:如图所示:

1. 用户首次访问系统A时,需要进行登录。

2. 系统A带着用户登录信息重定向给认证系统。

3. 认证系统验证用户登录信息。

4. 验证通过后,返回一个token

token类似一种内部的通行证,包含了用户身份信息、登录状态和过期时间,在各个系统间共享。

5. 认证系统带着token重定向给系统A,得知用户是已登录状态。

6. 系统A向用户返回请求的资源。

7. 用户访问系统B时,需要进行登录。

8. 系统B通过共享的token,得知用户是已登录状态。

9. 系统B向用户返回请求的资源。

相关文章:

  • Liteos信号量的使用
  • 基于Verilog搭建一个卷积运算单元的简单实现
  • pytorch-实现mnist手写数字识别(彩色)
  • C/C++语言100题练习计划 99——找第一个只出现一次的字符
  • Go使用Gin+mysql实现增删改查
  • PIE-Engine:房山区洪涝灾害风险评价
  • 【我的渲染技术进阶之旅】如何编译Filament的windows版本程序?
  • 03 C++ 字符串、向量和数组
  • python 代码 C 执行
  • 字节外包凭借【ui自动化测试框架】成功进入内部编制
  • 用 Plop 加快项目相似代码生成
  • Codeforces Round #822 (Div. 2) 补题 (A、B、C)
  • 【初阶与进阶C++详解】第十六篇:AVL树-平衡搜索二叉树(定义+插入+旋转+验证)
  • 去除多重共线性的5种方法,你学废了嘛?
  • Verilog的奇技淫巧[更新中]
  • JavaScript标准库系列——Math对象和Date对象(二)
  • k8s 面向应用开发者的基础命令
  • Less 日常用法
  • Linux Process Manage
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 编写符合Python风格的对象
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 终端用户监控:真实用户监控还是模拟监控?
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #define、const、typedef的差别
  • #include<初见C语言之指针(5)>
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (145)光线追踪距离场柔和阴影
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (排序详解之 堆排序)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (算法)Game
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .java 9 找不到符号_java找不到符号
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core Web APi类库如何内嵌运行?
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Standard 的管理策略
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 材料检测系统崩溃分析
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net环境下的缓存技术介绍
  • .pyc文件是什么?
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @ConfigurationProperties注解对数据的自动封装
  • @EnableAsync和@Async开始异步任务支持