一、单点登录SSO介绍
目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的用户名密码,同时,管理员也需要为同一个用户设置多套系统登录账号,这对系统的使用者来说显然是不方便的。我们期望的是如果存在多个系统,只需要登录一次就可以访问多个系统,只需要在其中一个系统执行注销登录操作,则所有的系统都注销登录,无需重复操作,这就是单点登录(Single Sign On 简称SSO)系统实现的功能。
单点登录是系统功能的定义,而实现单点登录功能,目前开源且流行的有CAS和OAuth2两种方式,过去我们用的最多的是CAS,现在随着SpringCloud的流行,更多人选择使用SpringSecurity提供的OAuth2认证授权服务器实现单点登录功能。
OAuth2是一种授权协议的标准,任何人都可以基于这个标准开发Oauth2授权服务器,现在百度开放平台、腾讯开放平台等大部分的开放平台都是基于OAuth2协议实现, OAuth2.0定义了四种授权类型,最新版OAuth2.1协议定义了七种授权类型,其中有两种因安全问题已不再建议使用:
【OAuth2.1 建议使用的五种授权类型】
- Authorization Code 【授权码授权】:用户通过授权服务器重定向URL返回到客户端后,应用程序从URL中获取授权码,并使用授权码请求访问令牌。
- PKCE【Proof Key for Code Exchange 授权码交换证明密钥】:授权码类型的扩展,用于防止CSRF和授权码注入攻击。
- Client Credentials【客户端凭证授权】:直接由客户端使用客户端 ID 和客户端密钥向授权服务器请求访问令牌,无需用户授权,通常用与系统和系统之间的授权。
- Device Code【设备代码授权】:用于无浏览器或输入受限的设备,使用提前获取好的设备代码获取访问令牌。
- Refresh Token【刷新令牌授权】:当访问令牌失效时,可以通过刷新令牌获取访问令牌,不需要用户进行交互。
【OAuth2.1 不建议/禁止使用的两种授权类型】
- Implicit Flow【隐式授权】:隐式授权是以前推荐用于本机应用程序和 JavaScript 应用程序的简化 OAuth 流程,其中访问令牌立即返回,无需额外的授权代码交换步骤。其通过HTTP重定向直接返回访问令牌,存在很大的风险,不建议使用,有些授权服务器直接禁止使用此授权类型。
- Password Grant【密码授权】:客户端通过用户名密码向授权服务器获取访问令牌。因客户端需收集用户名和密码,所以不建议使用,最新的 OAuth 2 安全最佳实践完全不允许密码授权。
【SpringSecurity对OAuth2协议的支持】:
相关文章
spring事务传递特性-REQUIRES_NEW和NESTED
spring对于事务的实现的确是它的一大优点,节省了程序员不少时间。 关于交易有很多要谈的,比如实现方法、实现原则、交付特征等。[En]There is a lot to talk about abo...
Lamda(拉姆达)表达式演化过程
HI!小伙伴们,好久没见了,4月份开始断更,中途有点事儿,今天开始更新了,整理一篇Lamda表达式演化过程,希望喜欢的一如既往的支持! 传统集合过滤 现在有2个需求:在一组学生集合中, 1.找出年龄大...
Fizz企业级微服务网关-服务编排,祭出终结BFF层的大杀器
概述 服务编排是Fizz网关提供的一个强大的功能,能够基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口,减少中间层胶水代码以及降低编码投入。本文介绍服务编排三个常见场景的使用:单API结果...
数据类型(Java)
数据类型分类 1.基本数据类型 数值类型: 整数类型: byte【(1个字节),范围:-128-127】 short【(2个字节),范围:-32768-32767】 int【(4个字节),范围:-21...
IDEA使用Gittee提交代码
今天给大家分享一下如何从idea提交代码到gitee上面。 1.先在gitee上创建仓库 2.填写相应的信息 3.下载git 直接next一站式安装 4.鼠标右键点击 Git Bash Here, 通...
【Java分享客栈】一个包装过简历的新同事写完微信支付引起事故后果断离职了
挺长时间没发文了,因为公司有一个紧急项目要赶进度,加班如吃饭喝水,久违的进入到码农的状态。 我之所以花时间发送论文,是因为项目刚刚启动,但一位新同事的代码在短时间内在生产环境中造成了事故,导致了一批短...
ShenYu 网关开发:在本地启用运行
1.先决条件 无论什么方式安装,都需要先初始化数据库,这里我选择了在本地通过 Docker 启用一个 mysql 5.7 docker run -d \ --name mysql \ -p 3306:...
Java基础学习总结
写的这个博客是学习B站狂神说的Java教学视频的学习记录,记录了重点知识以及以前易混淆理解的知识点。本博客可能缺少部分基础知识点,适合像我一样学习Java过程中曾经半途而废的学生。 Java的注释分为...
MongoDB 分片规则
生命本身毫无意义,只有死亡才能让你邃晓人性的真谛! Ideal is the beacon. Without ideal, there is no secure direction; without ...
识别 UTF-8 编码
思路:如果GBK中文字节流我们使用 UTF-8 编码,会出现未知字符�,字节代表数字为 -65, -67。 所以先尝试用 utf-8 编码,然后获取字节流,判断其中是否存在未知字符。 流程:当直接使用...
Java学习 (10)Java流程控制篇(01)Scanner
Java学习 (10)Java流程控制篇(01)Scanner Scanner对象 Scanner对象基本内容 关于next() 和 nextLine() 方式的区别 next() nextLine(...
Go gin 接入 prometheus
Prometheus 的 go sdk 是由官方提供的,地址:https://github.com/prometheus/client_golang ,里面包含了生成 prometheus metri...
哈夫曼树的构建与最小带权路径长度
注意:哈夫曼树并不唯一,但带权路径长度一定是相同的。 二叉树:每个结点最多含有两个子树的树称为二叉树。 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点。 哈夫曼树介绍 1哈夫曼树的定义 哈夫...
Netty源码分析之ChannelPipeline(三)—入站事件的传播
之前的文章中我们说过ChannelPipeline作为Netty中的数据管道,负责传递Channel中消息的事件传播,事件的传播分为入站和出站两个方向,分别通知ChannelInboundHandle...