1、认证过程

登录:

1)第一次认证:第一次登录,用户从浏览器输入用户名/密码,提交后到服务器的登录处理的Action层(Login Action);

2)Login Action调用认证服务进行用户名密码认证,如果认证通过,Login Action层调用用户信息服务获取用户信息(包括完整的用户信息及对应权限信息);

3)返回用户信息后,Login Action从配置文件中获取Token签名生成的秘钥信息,进行Token的生成;

4)生成Token的过程中可以调用第三方的JWT Lib生成签名后的JWT数据;

5)完成JWT数据签名后,将其设置到COOKIE对象中,并重定向到首页,完成登录过程;

请求认证:

基于Token的认证机制会在每一次请求中都带上完成签名的Token信息,这个Token信息可能在COOKIE
中,也可能在HTTP的Authorization头中;

1)客户端(APP客户端或浏览器)通过GET或POST请求访问资源(页面或调用API);

2)认证服务作为一个Middleware HOOK 对请求进行拦截,首先在cookie中查找Token信息,如果没有找到,则在HTTP Authorization Head中查找;

3)如果找到Token信息,则根据配置文件中的签名加密秘钥,调用JWT Lib对Token信息进行解密和解码;

4)完成解码并验证签名通过后,对Token中的exp、nbf、aud等信息进行验证;

5)全部通过后,根据获取的用户的角色权限信息,进行对请求的资源的权限逻辑判断;

6)如果权限逻辑判断通过则通过Response对象返回;否则则返回HTTP 401;

2、部分代码

用户登录时:

用户请求时:

JWTUtils.java:

package com.sxt.sso.commons;import java.util.Date;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureException;/*** JWT工具*/
public class JWTUtils {// 服务器的key。用于做加解密的key数据。 如果可以使用客户端生成的key。当前定义的常亮可以不使用。private static final String JWT_SECERT = "test_jwt_secert" ;private static final ObjectMapper MAPPER = new ObjectMapper();public static final int JWT_ERRCODE_EXPIRE = 1005;//Token过期public static final int JWT_ERRCODE_FAIL = 1006;//验证不通过public static SecretKey generalKey() {try {// byte[] encodedKey = Base64.decode(JWT_SECERT); // 不管哪种方式最终得到一个byte[]类型的key就行byte[] encodedKey = JWT_SECERT.getBytes("UTF-8");SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;} catch (Exception e) {e.printStackTrace();return null;}}/*** 签发JWT,创建token的方法。* @param id  jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。* @param iss jwt签发者* @param subject jwt所面向的用户。payload中记录的public claims。当前环境中就是用户的登录名。* @param ttlMillis 有效期,单位毫秒* @return token, token是一次性的。是为一个用户的有效登录周期准备的一个token。用户退出或超时,token失效。* @throws Exception*/public static String createJWT(String id,String iss, String subject, long ttlMillis) {// 加密算法SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;// 当前时间。long nowMillis = System.currentTimeMillis();// 当前时间的日期对象。Date now = new Date(nowMillis);SecretKey secretKey = generalKey();// 创建JWT的构建器。 就是使用指定的信息和加密算法,生成Token的工具。JwtBuilder builder = Jwts.builder().setId(id)  // 设置身份标志。就是一个客户端的唯一标记。 如:可以使用用户的主键,客户端的IP,服务器生成的随机数据。.setIssuer(iss).setSubject(subject).setIssuedAt(now) // token生成的时间。.signWith(signatureAlgorithm, secretKey); // 设定密匙和算法if (ttlMillis >= 0) { long expMillis = nowMillis + ttlMillis;Date expDate = new Date(expMillis); // token的失效时间。builder.setExpiration(expDate);}return builder.compact(); // 生成token}/*** 验证JWT* @param jwtStr* @return*/public static JWTResult validateJWT(String jwtStr) {JWTResult checkResult = new JWTResult();Claims claims = null;try {claims = parseJWT(jwtStr);checkResult.setSuccess(true);checkResult.setClaims(claims);} catch (ExpiredJwtException e) { // token超时checkResult.setErrCode(JWT_ERRCODE_EXPIRE);checkResult.setSuccess(false);} catch (SignatureException e) { // 校验失败checkResult.setErrCode(JWT_ERRCODE_FAIL);checkResult.setSuccess(false);} catch (Exception e) {checkResult.setErrCode(JWT_ERRCODE_FAIL);checkResult.setSuccess(false);}return checkResult;}/*** * 解析JWT字符串* @param jwt 就是服务器为客户端生成的签名数据,就是token。* @return* @throws Exception*/public static Claims parseJWT(String jwt) throws Exception {SecretKey secretKey = generalKey();return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody(); // getBody获取的就是token中记录的payload数据。就是payload中保存的所有的claims。}/*** 生成subject信息* @param subObj - 要转换的对象。* @return java对象->JSON字符串出错时返回null*/public static String generalSubject(Object subObj){try {return MAPPER.writeValueAsString(subObj);} catch (JsonProcessingException e) {e.printStackTrace();return null;}}}

单点登录-基于JWT机制的单点登录相关推荐

  1. 社交登陆,分布式session,单点登陆,jwt

    社交登陆,分布式session,单点登陆,jwt 一.社交登录 QQ. 微博. github 等网站的用户量非常大, 别的网站为了简化自我网站的登陆与注册逻辑, 引入社交登陆功能: 步骤: 1) . ...

  2. Redis框架(三):大众点评项目 基于Session的短信登录

    大众点评项目 基于Session的短信登录 需求:基于Session实现短信验证登录 基于Session的短信登录 发送手机验证码 实现登录 (注意MyBatisP的接口使用) 新的问题 Spring ...

  3. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebService服务中可以通过SoapHead验证机制 ...

  4. Spring Cloud入门-Oauth2授权之基于JWT完成单点登录(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 单点登录简介 创建oauth2-client模块 修改授权服务器配置 网页单点登录演示 调用接口单点登录演示 oauth2-client添加权限校 ...

  5. 基于JWT实现单点登录

    单点登录概述: 多系统共存下,用户在一处地方登录,得到其他所有系统的信任,无需再次登录. 自己的理解:在前端用户点击登录触发后端登录接口,登录成功的时候,后端jwt生成一个token,后端将token ...

  6. 初识单点登录及JWT实现

    单点登录 多系统,单一位置登录,实现多系统同时登录的一种技术 (三方登录:某系统使用其他系统的用户,实现本系统登录的方式.如微信登录.支付宝登录) 单点登录一般是用于互相授信的系统,实现单一位置登录, ...

  7. JWT实战 Spring Security Oauth2整合JWT 整合SSO单点登录

    文章目录 一.JWT 1.1 什么是JWT 1.2 JWT组成 头部(header) 载荷(payload) 签名(signature) 如何应用 1.3 JJWT 快速开始 创建token toke ...

  8. Spring Security整合JWT,实现单点登录,So Easy~!

    前面整理过一篇 SpringBoot Security前后端分离,登录退出等返回json数据,也就是用Spring Security,基于SpringBoot2.1.4 RELEASE前后端分离的情况 ...

  9. SSO单点登录-基于cookie的单点登录

    1.概述 单点登录(Single-Sign-On),简称SSO,它的解释为:在多个应用系统中,只要登陆一次,便可以访问其它相互信任的系统.早期系统由于只有一个服务,因此只需要登录一次,就可以访问系统的 ...

最新文章

  1. 8个问题全面了解5G关键技术Massive MIMO
  2. 私有5g网络_欧洲通过FUDGE5G的启动来支持工业4.0的云原生私有5G
  3. 【python】并行化的又一种思路
  4. JavaScript实现ShellSort希尔排序算法(附完整源码)
  5. 【渝粤题库】陕西师范大学200471 英汉翻译
  6. html5怎么让div集中,html – 如何集中5个div而不使用margin-left?
  7. 华为P30现身华为新加坡官网:坐实水滴屏
  8. 手写简化版printf函数
  9. Java基础之不一样的方法重载!
  10. 第一章:x264视频制作meGUI工具下载
  11. AI智能电话机器人源码搭建的原理与功能
  12. 公差基本偏差代号_基本偏差代号公差等级代号.ppt
  13. 做华为外包一年的总结
  14. [每日一氵] linux 批量删除某个名字的文件夹
  15. 自定义插入页面标签以及实现类似通讯录的首字母搜索
  16. 基于神经网络的房价预测,python数据分析房价预测
  17. ARM与Calxeda/华芯通
  18. DbVisualizer 8.0.11 出现乱码问题
  19. 从0开始实现目标检测——原理篇
  20. 前端工程师说明(仅以自勉)

热门文章

  1. linux和windows内存管理知乎,windows server 哪个版本好 知乎
  2. Head First Java资源
  3. ASP.NET4.0中 ValidateRequest=false失效
  4. 安卓Zygote详解
  5. 空间向量模型和tf-idf
  6. C++之重载:函数名的鱼塘
  7. Navicat Premium 12的过期激活,问题解决的心路历程
  8. Jedis的基本使用
  9. 在网页中添加百度分享功能
  10. Invalidate()详解