单点登录描述:
单点登录主要时应用在微服务架构中,在任意一个子服务中输入用户的用户名,密码进行登录时,
在跳转到其他系统的时候,就无需在进行登录,直接可以识别出用户的身份,权限以及角色等信息

.
.
JWT:全称java web token, 本质时一组加密后的字符串

JWT有三部分组成: header + payload+ sign (头+载荷+签名)
header记录: jwt使用的加密算法的类型,是一个json字符串,使用base64编码
payload载荷记录: 用户的用户名,用户角色,用户权限,jwt失效时间等循序,使用的时json字符串格式,使用了base64编码
sign签名: 包含了header+payload
JWT中三部分之间使用英文的句号隔开, 也就是 header头.paylouad载荷.sign签名
.
.
.
.
JWT实现单点登录的业务流程:
1,用户通过浏览器发送请求,访问网管,网管中有鉴权过滤器,校验之后,发现用户访问的是认证的微服务,则将请1求放行到认证微服务中
.
.
2,用户在认证微服务的登录页面中, 输入用户名, 密码, 然后登录. 登录后生成jwt字符
串, jwt字符串中有用的用户名, 用户的角色, 用户的权限信息, 返回保存到用户浏览器
cookie中

.
.
*3,用户访问其他服务时,携带token访问,每次访问校验token是否合法有效

JWT实现加密,解密:工具类

public class JwtUtil {//有效期为public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000  一个小时//设置秘钥明文public static final String JWT_KEY = "qianfeng";/*** 创建token* @param id* @param subject* @param ttlMillis* @return*/public static String createJWT(String id, String subject, Long ttlMillis) {/*获取加密类型*/SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;/*记录签发时间*/long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);if(ttlMillis==null){ttlMillis=JwtUtil.JWT_TTL;}/*记录过期时间*/long expMillis = nowMillis + ttlMillis;Date expDate = new Date(expMillis);/*拿到秘钥*/SecretKey secretKey = generalKey();/*将上面获取的变量全部设置到指定参数位置进行加密,并通过builder对象中的compact方法返回加密的字符串*/JwtBuilder builder = Jwts.builder().setId(id)              //唯一的ID.setSubject(subject)   // 主题  可以是JSON数据.setIssuer("admin")     // 签发者.setIssuedAt(now)      // 签发时间.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥.setExpiration(expDate);// 设置过期时间return builder.compact();}/*** 解析** @param jwt* @return* @throws Exception*/public static Claims parseJWT(String jwt) throws Exception {/*获取秘钥* 通过Jwts的parser方法,设置秘钥,设置前端传进来的加密的字符串jwt,底层内部实现对比*/SecretKey secretKey = generalKey();return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();}/*** 生成加密后的秘钥 secretKey* @return*/public static SecretKey generalKey() {/*对秘钥进行base64编码,防止乱码,生成字节数组* 用SecretKeySpec对象创建密文(通过有参构造方法:参数1:字节数组,参数2-3:字节的起始和终止位置,参数3:加密的算法名字)*/byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}
}

认证微服务模块的逻辑判断:


@Component
public class AuthFilter implements Ordered, GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {/*获取响应对象*/ServerHttpRequest request = exchange.getRequest();/*从请求中获取用户的url*/ServerHttpResponse response = exchange.getResponse();/*解析路径*/String path = request.getURI().getPath();if(StringUtils.isEmpty(path)){response.setStatusCode(HttpStatus.UNAUTHORIZED);return  response.setComplete();}/*判断url是否是登录路劲或者是注册路径,是就直接无条件放行*/if(path.contains("/auth/login")||path.contains("/auth/regist")){/*放行*/return chain.filter(exchange);}/*如果不是,则需要取jwt*/MultiValueMap<String, HttpCookie> cookies = request.getCookies();if(cookies==null){response.setStatusCode(HttpStatus.UNAUTHORIZED);return  response.setComplete();}/*获取第一个名字叫做token的cookie值*/HttpCookie cookie = cookies.getFirst("token");if(cookie==null){response.setStatusCode(HttpStatus.UNAUTHORIZED);return  response.setComplete();}/*判断是否能取取到jwt*/String  token = cookie.getValue();if(StringUtils.isEmpty(token)){response.setStatusCode(HttpStatus.UNAUTHORIZED);return  response.setComplete();}/*如果能取出来,则将解析jwt,然后放行*/try {Claims claims = JwtUtil.parseJWT(token);} catch (Exception e) {e.printStackTrace();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}return   chain.filter(exchange);}

注意,这里的放行配合网关实现请求分发到指定微服务上:


server:port: 8082
spring:application:name: gateway
#注册中心cloud:nacos:discovery:server-addr: 192.168.200.129:8848
#配置网关(3个微服务模块)gateway:routes:- id: customeruri: lb://customerpredicates:- Path=/consumer/**- id: provideruri: lb://providerpredicates:- Path=/provide/**- id: loginserveruri: lb://loginserverpredicates:- Path=/auth/**

案例的微服务模块

JWT实现单点登录(sso)功能相关推荐

  1. JWT实现单点登录(SSO)

    目录 一.理论 1.SSO 2.JWT #.组成 #.如何工作 3.Redis   RSA   MD5 4.AOP 二.实现过程 #.准备工作 #.登录 #.测试类 #.插拔式注解 #.测试 最近有机 ...

  2. SpringBoot+OAuth2+JWT实现单点登录SSO完整教程,竟如此简单优雅!

    作者:狂乱的贵公子 来源:https://www.cnblogs.com/cjsblog/p/10548022.html 1.前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题, ...

  3. jwt单点登录_单点登录SSO技术选型

    一些人存在的意义总归是让另一些人成长,然后消失. --刘同<谁的青春不迷茫> 1.单点登录是什么? 单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这 ...

  4. 基于Spring Security与JWT实现单点登录

    基于RBAC的权限管理 RBAC(Role-Based Access Control):基于角色的访问控制 当前项目中,RBAC具体的表现为: 管理员表:ams_admin 角色表:ams_role ...

  5. 单点登录SSO(Single Sign On)

    文章目录 一.什么是Session 跨域问题 二.Token 机制 1.传统身份认证 2.Token 身份认证 三.Session跨域共享实现方案 1.Nginx Session共享 2.Spring ...

  6. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离

    在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理. ...

  7. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  8. 使用Spring Security OAuth2实现单点登录(SSO)系统

    一.单点登录SSO介绍   目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的 ...

  9. 单点登录SSO的原理和实现

    背景 SSO,英文全称Single Sign On,单点登录,一般应用于多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源.如登录访问 blog.baidu.com 后,对于 ...

最新文章

  1. 为什么在把多维数组传递给函数时必须要指定除第一维之外的其他维
  2. Spring Mvc返回html页面404错误解决记录--转载
  3. 1.物理系统PhysicsWorld,RayCast
  4. python 运算符重载_Python3面向对象-运算符重载
  5. Cookie知识总结(-)
  6. 如何备份和还原Firefox设置
  7. 为什么现在越来越多的人不愿换新机?最后一个原因扎心了
  8. 移动端布局:视口viewport的理解
  9. linux模块builtin是什么意思,Linux命令手册
  10. USACO 3.2.6 Sweet Butter 香甜的黄油(最短路)
  11. 一款基于易语言的搜题软件
  12. 如何使用Linux匿名上网-四大法宝
  13. CSS border dashed 虚线调整
  14. 天昊16S扩增子绝对定量测序项目文章登陆《Bioresource Technology》
  15. SNF快速开发平台--多组织+多平台+多系统处理方案
  16. 22牛客多校1 J.Serval and Essay (启发式合并)
  17. 小白兔笑话全集笑死人不偿命(转+转)
  18. 实现一个CAN通讯上位机
  19. 非磺化花菁和磺化花菁有机染料Cyanine dyes的说明应用
  20. 解决myeclipse导入maven工程时问题:No marketplace entries found to handle maven-compiler-plugin:2.3.2

热门文章

  1. 关于MFC的一些疑问
  2. 利用Idea中Gson插件快速编辑POJO类
  3. c语言发牌器(斗地主)
  4. IOS隐藏手机号码****显示
  5. opensips介绍
  6. 如何用百分比设置页面的高度
  7. 【鸽子木·每日一题】蛇形矩阵(3月23日)
  8. 使用win10的画图将照片变为2寸大小
  9. c语言皮尔森系数程序,pearson coefficient (皮儿森相关系数)计算及R语言实现 zz
  10. Java计算机毕业设计体育馆数据管理系统源码+系统+数据库+lw文档