单点登录概述:
多系统共存下,用户在一处地方登录,得到其他所有系统的信任,无需再次登录。

自己的理解:在前端用户点击登录触发后端登录接口,登录成功的时候,后端jwt生成一个token,后端将token返给前端,前端把token放进需要进行验证的接口的请求头(header)中去,用户带着这个token去进行验证。(token设置过期时间),验证成功则拦截器放行,否则拦截

这里介绍一些jwt基本概念

JWT:
1.认证流程
a.首先,前端通过web表单将自己的用户民和密码发送到后端的接口,这一过程一般是一个HTTP,POST请求。建议的方式是通过SSL
加密的方式传输(https协议),从而避免敏感信息被嗅探。
b.后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成
一个JWT(token),形成的JWT就是一个形同111.zzz.xxx的字符串, token,head ,payload, singurater
c.后端将JWT字符串 作为登录成功的返回结果返回给前端,前端可以返回的结果保存在localStorage 或sessionStorage上,退出登录
时前端删除保存的JWT即可。
d.前端在每次请求时将JWT放入HTTP Header中的Authoriztion 位。(放在Header中的原因是解决XSS和XSRF问题) HEADER.
e.后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确;检查Token是否过期;检查Token的接收方是否是自己(可选)
f。验证通过后,后端使用JWT包含的用户信息进行其他逻辑操作,返回相应结果。
2.JWT优势
可以通过URL,POST参数或者在HTTP,header发送 ,因为数据量小,传输速度也很快。
自包含(self-contained): 负载中包含了所有用户所需要的信息,避免了多次查询数据库。
因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。
不需要在服务端保存会话信息,特别适用于分布式微服务。

3.JWT结构
a.令牌组成
token 其实就相当于一段字符串 ==> token String ==>header.payload.singnature =token
1.标头(Header)
2.有效载荷(Payload)
3.签名(Signature)
因此,JWT通常如下所示:xxxx.yyyy.zzzz

4.JWT常见异常信息
SignatureVerificationException  签名不一致
TokenExpiredException  令牌过期异常
AlgorithmMismatchException  算法不匹配异常(也就是解密与加密的算法不一样)
InvalidClaimExeption 失效的Payload异常  (就是Payload加解密前后信息不一致)

总的来说就是登录的时候使用jwt生成一个token,用户带着这个token去其他页面进行验证,需要配合拦截器来实现。

作者有自己写的单点登录的demo源码如有需要可随时滴滴~

单点登录demo

使用原理(新手切记):

登录成功生成token后,需要将token返回前端也就是代码中的map.put("token",token),前端需要把这个token加入到请求头中去,然后后端进行接口验证,切记拦截器建议拦截所有路径,放行登录接口(如拦截无法进行登录验证)

使用postman测试时,先调用登录接口生成token,然后调用其他接口时在Header里面设置content-Type,application, token=生成的token值,就可以实现token验证了。

直接复制即可测试使用,

首先要准备好一个util包

JWTutils.java

public class JWTutils {private  static  final  String  SING="!@#$%^&";/** 生成token* */public  static  String getToken (Map<String,String> map){Calendar instance=Calendar.getInstance();instance.add(Calendar.MINUTE,15);//15分钟//创建JWT builderJWTCreator.Builder builder= JWT.create();map.forEach((k,v)->{builder.withClaim(k,v);});String token=builder.withExpiresAt(instance.getTime())//指定令牌过期时间.sign(Algorithm.HMAC256(SING)); //signreturn  token;}/** 验证token 合法性* */
//    //1.创建验证对象(采用加密时的算法)
//    JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256("!@#$%^^&")).build();
//    //2.解密(报这个错说明是token时间过期了)(com.auth0.jwt.exceptions.
//    // TokenExpiredException: The Token has expired on Sat May 14 21:28:41 CST 2022.)
//    DecodedJWT verify=jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NTI1MzU5ODEsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb2NoZW4ifQ.YGaiUwCOCmAyq0RUAA-61Et3TfTb61pZoTjgDbXiFJg");public  static DecodedJWT verify(String token){return  JWT.require(Algorithm.HMAC256(SING)).build().verify(token);}/** 获取token信息方法   (该方法可以省略),可以直接在验证token方法中 renturn 返回* */public  static  DecodedJWT getTokenInfo(String token){DecodedJWT verify=JWT.require(Algorithm.HMAC256(SING)).build().verify(token);return  verify;}}
JWTinterveptor.java(这里验证token)

public class JWTinterveptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Map<String,Object> map=new HashMap<>();
        //获取请求头中令牌
        String token =request.getHeader("token");

try {
            JWTutils.verify(token); //去JWTutils中验证令牌
            return  true; //这一步到拦截器中去进行验证
        }catch (SignatureVerificationException e){
            e.printStackTrace();
            map.put("msg","无效签名");
        } catch (TokenExpiredException e){
            e.printStackTrace();
            map.put("msg","token过期");
        }catch (AlgorithmMismatchException e){
            map.put("msg","算法不一致");
        }catch (Exception e){
            map.put("msg","token无效");
        }
        map.put("state",false);//设置状态

//将map转为json
        String json=new ObjectMapper().writeValueAsString(map);
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().println(json);
        return  false;
    }
}

InterceptorConfig.java(这里进行验证)
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new JWTinterveptor()).addPathPatterns("/**")//拦截  (其他接口token验证).excludePathPatterns("/User/UserLogin");//所有用户都放行(登录接口不放行,无法进行登录)}
}

UserController.java(控制层)

package com.zufeng.lyh.controller;

import com.zufeng.lyh.domain.User;
import com.zufeng.lyh.service.UserService;
import com.zufeng.lyh.utils.JWTutils;
import jdk.nashorn.internal.parser.Token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

@GetMapping("/login")
    public Map<String,Object> login(User user){
            Map<String,Object> map=new HashMap<>();

try {
                  User userDB= userService.login(user);

Map<String,String> payload=new HashMap<>();
                  payload.put("id",userDB.getId());
                  payload.put("name",userDB.getName());
                    //生成JWT的令牌
                    String token=JWTutils.getToken(payload);
                    JWTutils.getToken(payload);

map.put("state",true);
                    map.put("msg","认证成功");
                    map.put("token",token);//传送token
                }catch (Exception e){
                e.printStackTrace();
                    map.put("state",false);
                }
            return  map;
    }

@PostMapping("/test")
        public  Map<String,Object> test(HttpServletRequest request){
                    Map<String,Object> map=new HashMap<>();

                //处理自己的业务逻辑map.put("state",true);map.put("msg","请求成功");return map;}

}

over!!!

基于JWT实现单点登录相关推荐

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

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

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

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

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

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

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

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

  5. springsecurity oauth2使用jwt实现单点登录

    Jwt方式已经分享在文章结尾处的百度网盘链接中,redis方式可以看我以前发表的文章. 文章目录 前言 一.springsecurity oauth2 + redis方式的缺点 二.oauth2认证的 ...

  6. 基于.Net的单点登录(SSO)解决方案

    基于.Net的单点登录(SSO)解决方案 前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助. ...

  7. 【No.1】基于Cookie的单点登录(SSO)

    2019独角兽企业重金招聘Python工程师标准>>> 这篇主要说明基于Cookie的单点登录实现,以及Cookie的一些特性以及使用说明. 1.Cookie是什么,如何工作的 在程 ...

  8. 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心...

    基于云端的通用权限管理系统 SAAS服务 基于SAAS的权限管理 基于SAAS的单点登录SSO 基于.Net的SSO,单点登录系统,提供SAAS服务 基于Extjs 4.2 的企业信息管理系统 基于E ...

  9. 基于Cookie的单点登录(SSO)系统介绍

    基于Cookie的单点登录(SSO)系统介绍 SSO的概念: 单点登录SSO(Single Sign-On)是身份管理中的一部分.SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保 ...

最新文章

  1. js正则表达式/replace替换变量方法
  2. SugarCRM 主表-自定义字段
  3. STC12C5A60S2笔记8(串口)
  4. 用户sa登陆失败 SQLServer 错误18456的解决方法
  5. oracle plsql 无法连接 报 ORA-12560: TNS:protocol adapter error
  6. 让自己的网站变成暗黑模式
  7. 声音加速_听,这是加速的声音
  8. matlab orderfields,matlab order
  9. 一个简单的dw网页制作作业,学生个人html静态网页制作成品代码——怪盗基德动漫主题网页成品(15页)
  10. 黑马程序员 python 数据分析 代码_2020年最新版 5.0程序员 黑马python人工智能数据分析机器学习软件测试全栈开发...
  11. JVM-运行时数据区:Java堆(Heap) 内存管理的核心区
  12. c atol()函数_atol()函数以及C ++中的示例
  13. Vue爬坑之路 二:使用Muse-UI前端框架及axios,实现简单登录页
  14. 英文学术论文写作——模式识别方向(笔记)
  15. 【tensorrt】——Network has dynamic or shape inputs, but no optimization profile has been defined.
  16. 校招linux基础知识,校招笔试整理 牛客网 2020小米校招(1)
  17. vue canvas 拖拽 放大缩小
  18. 第二台计算机,世界上第二台电脑的名称是什么
  19. 如何让网页背景图铺满整页(html+csss实现网页背景图铺满整页);a标签删下划线、禁用;innerHTMLouterHTML;css字体间距hover图片放大
  20. 什么样性格的人适合科研_什么性格的人更容易得癌症?科学研究这么看

热门文章

  1. Sublime 3 中文显示乱码解决方法
  2. U盘速度【CrystalDiskMark】
  3. CSS3 flex实现等分布局的小案例
  4. 背包九讲--完全背包
  5. 计算机考试internet应用好考吗,职称计算机考试《Internet应用》基础习题
  6. 电脑桌面云便签Windows版怎么退出软件?
  7. win7 uefi 无法对计算机,win7系统UEFi安装提示“缺少计算机所需的介质驱动程序”的方法介绍...
  8. 通俗易懂!看完你就是半个天线专家了
  9. G120变频器,运动控制程序模板。 西门子1200编程实例
  10. 分布式机器学习核心理念