** 直接区别: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编码形成第一部分
- 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
(1)、前端展示权限页面流程
服务端:返回该用户可用资源列表
前端vue:
v-if="hasPermission(['goods:list:audit'])"
根据服务端返回资源跟page页面和button进行控制是否展示。
(2)、服务端权限流程:用户根据角色,角色对应资源,通过拦截器或者切面方式,进行对当前用户角色包含的资源跟当前访问Controller方法的资源进行匹配,匹配成功就放行,失败就被拒
最新用户角色权限新框架: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)
登录授权时序图:
可参考地址:https://blog.csdn.net/qq_54867440/article/details/125033266
单点登录--》实现方式OAuth 2.0
最常见的例子是:
1、我们打开淘宝APP,首页就会有天猫、聚划算等服务的链接,当你点击以后就直接跳过去了,并没有让你再登录一次
后台管理系统有多个
2、是在企业内部多个应用系统(如考勤系统、财务系统、人事系统等)场景下,用户只需要登录一次,就可以访问多个应用系统
第一种类型:H5、android、ios客户端单点授权登录,如图所示
** 第二种类型,后台管理系统单点登录:如图所示:**
用户首次访问系统A时,需要进行登录。
系统A带着用户登录信息重定向给认证系统。
认证系统验证用户登录信息。
验证通过后,返回一个token
token类似一种内部的通行证,包含了用户身份信息、登录状态和过期时间,在各个系统间共享。
认证系统带着token重定向给系统A,得知用户是已登录状态。
系统A向用户返回请求的资源。
用户访问系统B时,需要进行登录。
系统B通过共享的token,得知用户是已登录状态。
系统B向用户返回请求的资源。
版权归原作者 工作QQ感冒的石头 所有, 如有侵权,请联系我们删除。