token和JWT token区别登录安全页面权限数据权限单点登录
Posted 工作QQ感冒的石头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
(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客户端单点授权登录,如图所示
第二种类型,后台管理系统单点登录:如图所示:
1. 用户首次访问系统A时,需要进行登录。
2. 系统A带着用户登录信息重定向给认证系统。
3. 认证系统验证用户登录信息。
4. 验证通过后,返回一个token
token类似一种内部的通行证,包含了用户身份信息、登录状态和过期时间,在各个系统间共享。
5. 认证系统带着token重定向给系统A,得知用户是已登录状态。
6. 系统A向用户返回请求的资源。
7. 用户访问系统B时,需要进行登录。
8. 系统B通过共享的token,得知用户是已登录状态。
9. 系统B向用户返回请求的资源。
Spring Security 结合了 Container Security 和 JWT Token
【中文标题】Spring Security 结合了 Container Security 和 JWT Token【英文标题】:Spring Security combine Container Security and JWT Token 【发布时间】:2021-11-12 01:57:42 【问题描述】:是否可以有一个登录休息服务,通过 Spring Security 验证容器安全性,如果成功则返回 JWT 令牌。然后调用其他服务将使用 JWT 过滤器。
基本思路是这样的。
-
我有一个有登录页面的 React 应用程序。它发送带有用户名和密码的登录请求(通过休息服务)。安全性是基于容器的(例如 Tomcat 用户)。 Spring security 应该通过容器进行身份验证,如果用户名和密码都可以,那么登录服务会返回一个 JWT Token。
所有其他服务都使用 Spring Security JWT Token Filter 安全性。
我在谷歌上找不到这种情况的例子。
【问题讨论】:
【参考方案1】:您要查找的是 Spring Security 所称的 Pre-Authentication。
您可以针对不同的场景启用它,我将展示一个示例 Java EE 容器。
@Bean
SecurityFilterChain appSecurity(HttpSecurity http) throws Exception
http
...
.jee(Customizer.withDefaults())
...
return http.build();
jee()
将做的是在您的SecurityFilterChain
中注册一个J2eePreAuthenticatedProcessingFilter
,过滤器本身将从HttpServletRequest
中提取Principal
并调用PreAuthenticatedAuthenticationProvider
对其进行身份验证。
然后,在您的控制器中,您可以注入 Principal
并使用 Principal 的详细信息构建 JWT。
【讨论】:
谢谢,非常接近。仍然没有完全工作。这是我所拥有的:在我的 Springboot 应用程序属性中,我有 spring.security.user.name=testuser spring.security.user.password=testpwd 然后我通过 Insomnia,Basic Auth 发送请求。我从 J2eePreAuthenticatedProcessingFilter 进入调试器。标头的授权值为 Basic dGVzdHVzZXI6dGVzdHB3ZA== 但是它返回的主体为 null。 我不确定我是否理解你的问题。您是尝试使用自己的用户存储使用 HTTP Basic 进行身份验证,还是尝试使用基于 Servlet 的预身份验证? 我有一个 tomcat 服务器,目前使用 tomcat-users.xml。最终客户将在 Tomcat 设置中设置用户连接 (LDAP)。所以它是基于服务器的身份验证。我有一个发送用户名和密码的登录休息服务。据我了解, PreAuthenticatedAuthenticationProvider 将对服务器进行身份验证。第一个问题这是正确的理解吗?发生的情况是原则始终为空。也许问题是我如何在请求中发送用户名和密码。也许你可以给我一些指导。非常感谢! 您必须知道用户是如何访问应用程序的。查看参考指南和AbstractPreAuthenticatedProcessingFilter
实现。 docs.spring.io/spring-security/site/docs/current/reference/…以上是关于token和JWT token区别登录安全页面权限数据权限单点登录的主要内容,如果未能解决你的问题,请参考以下文章