SSO单点登录(SpringSecurity OAuth2.0 redis mysql jwt)

news2024/11/17 10:23:45

SSO单点登录

什么是单点登录

SSO(Single Sign On)

在多系统架构中,用户只需要一次登录就可以无需再次登录(比如你在打开淘宝之后点击里边的天猫)

在以前我们的单系统中,用户如果登录多个服务需要多次登录,实现单点登录之后,可以实现一次登录,全部登录!一次注销,全部注销

原理图

用户不需要重复登录192.168.1.* 只需要通过认证系统登录一次即可访问全部内容

单点登录

实现原理(这里拿token作图)

实现方案

Cookie方案

用cookie作为媒介存放用户凭证。 用户登录系统之后,会返回一个加密的cookie,当用户访问子应用的时候会带上这个cookie,授权以解密cookie并进行校验,校验通过后即可登录当前用户。

Session方案

我们在单机服务(不涉及到分布式服务的时候,可以很好的使用seesion,可以在过滤器处加上判断,如果此时seesion中已经存在用户,则跳过认证)

Token方案

可参考实现原理

实现单点登录

我们使用Security OAuth2.0 JWT 实现单点登录

首先我们需要了解一些基础知识

JWT

什么是JWT

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

结构

  • Header
  • Payload
  • Signature

代码

    public void contextLoads() {
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND,90); //设置过期时间
        //生成令牌
        String token = JWT.create()
                .withClaim("username", "测试")//设置自定义用户名
                .withClaim("userid", 1)//设置自定义id
                .withExpiresAt(instance.getTime())//设置过期时间
                .sign(Algorithm.HMAC256("token!Q2W#E$RW"));//设置签名 保密 复杂
        //输出令牌
        System.out.println(token);
    }

    @Test
    public void getToken(){
        //创建验证对象
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("token!Q2W#E$RW")).build();
        DecodedJWT decodedJWT = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2OTIyNDA3OTcsInVzZXJpZCI6MSwidXNlcm5hbWUiOiLlsI_lj7YifQ.omSul3kKi9BL5LTXf142usxv4zE1G1DWLZlIqZJGdMo");
        System.out.println("用户名:"+decodedJWT.getClaim("username").asString());
        System.out.println("用户Id:"+decodedJWT.getClaim("userid").asInt());
        System.out.println("过期时间:"+decodedJWT.getExpiresAt());
    }

OAuth2.0

OAuth 2.0 是一个开放标准的授权协议,用于通过代表用户进行授权的令牌来保护资源的访问。它提供了一种安全、灵活和易于使用的机制,用于授权第三方客户端访问用户资源,而无需共享用户凭据。

OAuth2.0中的四个角色

  1. 资源所有者(用户):资源所有者是指拥有受保护资源的用户。这可以是一个终端用户,例如应用程序的最终用户或网站用户。

  2. 客户端应用程序:客户端应用程序是请求访问资源的第三方应用程序。这可以是一个网站、移动应用程序、桌面应用程序等。客户端应用程序必须先经过授权才能访问资源。

  3. 授权服务器:授权服务器是负责验证资源所有者身份并颁发访问令牌给客户端应用程序的服务器。客户端应用程序通过与授权服务器进行交互来获取访问令牌。授权服务器还负责验证和处理客户端应用程序的身份验证请求,并确定是否授权其访问受保护的资源。

  4. 资源服务器:资源服务器是持有受保护资源的服务器。资源服务器负责验证传递给它的访问令牌,并根据令牌中包含的权限信息来提供相应的资源服务。资源服务器在接收到请求时,会检查请求中的访问令牌以确保客户端有访问资源的权限。

OAuth2.0的授权方式

授权码模式(authorization code)

授权码模式是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与服务提供者的认证服务器交互,获取到授权码,再由授权码去交换 access_token。

  1. 用户访问客户端,客户端将用户导向服务提供商的认证地址。
  2. 用户选择是否授权客户端访问自己的数据。
  3. 用户选择授权,将授权码交到客户端。
  4. 客户端向服务提供商请求令牌,请求中携带授权码。
  5. 服务提供商向客户端响应令牌。
隐藏模式(implicit)

纯前端代码

https://wx.com/oauth/authorize?
  response_type=token&
  client_id=CLIENT_ID&
  redirect_uri=http://juejin.im/callback&
  scope=read
密码模式(resource owner password credentials)

密码模式比较好理解,用户在京东直接输入自己的WX用户名和密码,京东拿着信息直接去WX申请令牌,请求响应的 JSON结果中返回 token。grant_type 为 password 表示密码式授权。

https://wx.com/token?
  grant_type=password&
  username=USERNAME&
  password=PASSWORD&
  client_id=CLIENT_ID
凭证式模式(client credentials)

客户端模式比较简单,客户端直接向授权服务器申请令牌,请求响应的 JSON结果中返回 token。grant_type 为 client_credentials 表示客户端模式授权。

客户端模式适用于没有前台页面的后端服务,比如微信小程序、公众号、API 接口等。

客户端模式不需要用户登录,只需要提供客户端 ID 和客户端密钥即可。

https://wx.com/token?
  grant_type=client_credentials&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/888820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt:隐式内存共享

隐式内存共享 Many C classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data i…

K8s实战4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

手动发布Ingress-Nginx 1 登录到aks(dfinder-gw-aks) az login az account set --subscription ${sub ID} az aks get-credentials --resource-group ${groupname} --name ${aks name} 2 下载 ingress-nginx-4.2.5.tgz curl -LO https://github.com/kubernetes/ingress-ngi…

Hyper-V增加桥接网络设置(其他方式类同)

点击连接到的服务器,右单击或者右边点击“虚拟交换机管理器” 选择网络种类 配置虚拟交换机信息 外部网络选择物理机网卡设备

CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题

CS1988|C#无法在异步方法中使用ref,in,out类型的参数 🌀|场景: BlazorServer的场景中推荐使用异步方法,使用ref,out,in为参数前缀则报错CS1988 原因如下: ref parameters are not supported in async methods because the method may not h…

torch模型转onnx

加载模型 modeltorch.load(saved_model/moudle_best_auc.pth, map_locationcpu) model.eval().cpu()注:由于导出的模型是用于推理的,因此必须指定模型加载的位置和模型验证的位置,这里我使用了cpu做出导出的硬件 分析模型的输入和输出 这里…

基于SSH框架实现的管理系统(包含java源码+数据库)

资料下载链接 介绍 基于SSH框架的管理系统 简洁版 ; 实现 登录 、 注册 、 增 、 删 、 改 、 查 ; 可继续完善增加前端、校验、其他功能等; 可作为 SSH(Structs Spring Hibernate)项目 开发练习基础模型&#xf…

维护平衡的艺术:如何与干系人建立和谐关系以确保项目成功

在项目管理领域中,干系人的作用是无法忽视的。他们的支持和参与往往是项目成功的关键。与干系人建立和维护良好的关系成为每一位项目经理必备的技能。接下来,我们将深入探讨如何有效地与干系人互动,从而为项目的成功奠定坚实基础。 干系人的…

中国“诺贝尔奖”未来科学大奖公布2023年获奖名单

未来科学大奖委员会于8月16日公布2023年获奖名单。柴继杰、周俭民因发现抗病小体并阐明其结构和在抗植物病虫害中的功能做出的开创性工作获得“生命科学奖”,赵忠贤、陈仙辉因对高温超导材料的突破性发现和对转变温度的系统性提升所做出的开创性贡献获得“物质科学奖…

2023骨传导耳机推荐,适合运动骨传导耳机推荐

相信很多人跟我一样,随着现在五花八门的耳机品种增多,选耳机的时候真是眼花缭乱,尤其还是网购,只能看,不能试,所以选择起来比较困难, 作为一个运动达人,为了让大家在购买耳机时少走弯…

YOLO系列解读DAY1—YOLOV1预训练模型

一、说在前面 小伙伴们好,博主很久没有写博客了,略感生疏,不到之处敬请谅解,欢迎指出文中错误,大家一起探讨。欲看视频讲解,可转至博主DouYin、B站,欢迎关注,链接如下: …

Cat(1):Cat入门

1 什么是调用链监控 1.1 架构的演进历史 单体应用 架构说明: 全部功能集中在一个项目内(All in one)。 在单体应用的年代,分析线上问题主要靠日志以及系统级别的指标。 微服务架构 架构说明: 将系统服务层完全独立…

亚马逊添加心愿单对卖家有什么好处

在亚马逊平台上,卖家可以从消费者的角度来看待心愿单的好处。消费者可以将自己感兴趣的商品添加到心愿单中,这对卖家来说也是有一些潜在好处的: 1、潜在销售机会增加:当消费者将商品添加到心愿单中,这可能表示他们对这…

mySQL 视图 VIEW

简化版的创建视图 create view 视图名 as select col ...coln from 表create view 视图名(依次别名) as select col ...coln from 表create view 视图名 as select col “别名1”,。。。col "别名n" from 表show tab…

Angular安全专辑之二——‘unsafe-eval’不是以下内容安全策略中允许的脚本源

一:错误出现 这个错误的意思是,拒绝将字符串评估为 JavaScript,因为‘unsafe-eval’不是以下内容安全策略中允许的脚本源。 二:错误场景 testEval() {const data eval("var sum2 new Function(a, b, return a b); sum2(em…

挖掘优质短视频超百万条,火山引擎DataLeap助力电商平台生态治理

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 在人们的日常生活中,网购已经成为人们生活中不可或缺的购物形式。 根据《中国社交电商行业发展白皮书(2022)》的数据显示&#x…

古战策与现代项目: 孙子兵法在项目管理中的应用

项目管理在当今的商业环境中是至关重要的。从初创公司到世界500强,项目管理的策略和工具都在不断地演变。然而,我们是否可以从古老的战争策略中汲取智慧,并将它们应用于现代的项目管理实践中呢? 让我们通过孙子兵法,一个古老而又…

ui设计师工作总结及计划范文模板

ui设计师工作总结及计划范文模板【篇一】 白驹过隙,转眼间某某年已近结尾,时间伴随着我们的脚步急驰而去,到了个人工作总结的时候,蓦然回首,才发现过去的一年不还能画上圆满的句号,内心感慨万千&#xff0c…

【PySide】Pyside QtWebEngine网页浏览器打开Flash网页

说明 QWebEngineView 加载 flash插件,可成功显示Flash,如图 源代码 # -*- coding: utf-8 -*- """ @File : pyside_2.py @Time : 2023/8/17 0:11 @Author : KmBase @Version : 1.0 @Contact : @Desc : None """import…

AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 摘要模型架构Embedding层Transformer Encoder层MLP Head 整体流程 摘要 虽然Transformer体系结构已经成为自然语言处理任务的事实上的标准,但它在计算机视觉方面的应用仍然有限。在视…

传统算法是如何在销补调计划中发挥作用的

本文分享了一个「传统机器学习算法」在实际业务中的使用场景。 前言 如果嫌麻烦,你可以直接跳到正题观看~ 最近无论是在工作中的交谈,还是在日常刷屏的新闻,铺天盖地的都是大模型。我横竖是看不明白,费了大劲终于从字缝里看到了两…