入门到精通Java SSO单点登录原理详解

目录
  • 1. 基础概念
  • 2. 单点登录
  • 3. CAS 流程
  • 4. OAuth 流程
  • 5. CAS和OAuth的区别

1. 基础概念

SSO单点登录(Single sign-on)

所谓单点登录就是在多个应用系统中,用户只需登录一次就可以访问所有相互信任的系统。

CAS 中央认证服务(Central Authentication Service)

CAS是由美国耶鲁大学发起的一个企业级开源项目,旨在为WEB应用系统提供一种可靠的单点登录解决方案(WEB SSO)。

OAuth2.0 开放授权(Open Authorization)

OAuth2.0是一个为用户资源授权定义的安全标准,主要用于第三方应用授权登录,由于OAuth1.0标准存在安全漏洞现在已升级到2.0版本。

SSO单点登录与CAS 和OAuth之间有什么区别

SSO仅仅是一种设计架构,而CAS和OAuth是SSO的一种实现方式,他们之间是抽象与具象的关系。

2. 单点登录

让我们用两张图来看一下阐述一下单点登录的设计流程:

打个比方,SSO 和我们去迪士尼玩时购买的通票很像,我们只要买一次通票,就可以玩所有游乐场内的设施,而不需要在过山车或者摩天轮那里重新买一次票。在这里,买票就相当于登录认证,游乐场就相当于使用一套 SSO 的公司,各种游乐设施就相当于公司的各个产品。

使用 SSO 的优点很明显:

提升用户体验

就以我厂为例。我厂有两个产品,丁香人才网和丁香园论坛,假如你是我厂用户,肯定无法忍受登录丁香园论坛的时候输入一次用户名密码,登录人才网又要输入一次用户名密码吧?

避免重复开发

假如你是我厂后端,每天任务都饱和的不行,肯定无法忍受到人才网开发一套登录逻辑,到论坛又开发一套登录逻辑吧?

提升安全系数

假如你是我厂运维,发现了一个安全隐患需要紧急修复。你肯定无法忍受给茫茫多的产品后端都发一封邮件,责令修复吧?万一漏了一个呢?。

3. CAS 流程

下面让我们用一张图来说明一下用户是如何在两个不同系统中如何实现CAS单点登录的。

  • CAS系统 (cas.qiandu.com)
  • 门户系统 (www.qiandu.com)
  • 邮箱系统(mail.qiandu.com)

1. 用户访问门户系统,门户系统是需要登录的,但用户现在没有登录。
2. 跳转到CAS认证服务,即CAS的登录系统。 CAS系统也没有登录,弹出用户登录页。
3. 用户填写用户名、密码,CAS系统进行认证后,将登录状态写入CAS的session,浏览器中写入cas.qiandu.com域下的Cookie。
4. CAS系统登录完成后会生成一个ST(Service Ticket),然后跳转到门户系统,同时将ST作为参数传递给门户系统。
5. 门户系统拿到ST后,从后台向CAS系统发送请求,验证ST是否有效。
6. 验证通过后,门户系统将登录状态写入session并设置www.qiandu.com域下的Cookie。

至此,跨域单点登录就完成了。以后我们再访问门户系统时,门户就是登录的。接下来,我们再看看访问邮箱系统时的流程。

  • 1. 用户访问邮箱系统,邮箱系统没有登录,跳转到CAS系统。
  • 2. 由于CAS系统已经登录了,不需要重新登录认证。
  • 3. CAS系统生成ST,浏览器跳转到邮箱系统,并将ST作为参数传递给邮箱系统。
  • 4. 邮箱系统拿到ST,后台访问CAS系统,验证ST是否有效。
  • 5. 验证成功后,邮箱系统将登录状态写入session,并在mail.qiandu.com域下写入Cookie。

这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。

4. OAuth 流程

OAuth2.0的四种授权方式

1. 授权码(authorization code)

这是最常用的一种方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌,项目中常用的就是这种
—这种模式算是正宗的oauth2的授权模式
—设计了auth code,通过这个code再获取token
—支持refresh token

2. 隐藏式(implicit)

允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”,一般应用于纯前端项目
—这种模式比授权码模式少了code环节,回调url直接携带token
—这种模式的使用场景是基于浏览器的应用
—这种模式基于安全性考虑,建议把token时效设置短一些
—不支持refresh token

3. 密码式(resource owner password credentials)

直接通过用户名和密码的方式申请令牌,这方式是最不安全的方式
—这种模式是最不推荐的,因为client可能存了用户密码
—这种模式主要用来做遗留项目升级为oauth2的适配方案
—当然如果client是自家的应用,也是可以
—支持refresh token

4. 凭证式(client credentials)

这种方式的令牌是针对第三方应用,而不是针对用户的,既某个第三方应用的所有用户共用一个令牌,一般用于后台api服务消费者设计
—这种模式直接根据client的id和密钥即可获取token,无需用户参与
—这种模式比较合适消费api的后端服务,比如拉取一些用户信息等
—不支持refresh token

5. CAS和OAuth的区别

CAS的单点登录时保障客户端的用户资源的安全,客户端要获取的最终信息是,这个用户到底有没有权限访问我(CAS客户端)的资源。

CAS的单点登录,资源都在客户端这边,不在CAS的服务器那一方。用户在给CAS服务端提供了用户名密码后,作为CAS客户端并不知道这件事。随便给客户端个ST,那么客户端是不能确定这个ST是用户伪造还是真的有效,所以要拿着这个ST去服务端再问一下,这个用户给我的是有效的ST还是无效的ST,是有效的我才能让这个用户访问。

OAuth2.0则是保障服务端的用户资源的安全,获取的最终信息是,我(OAuth2.0服务提供方)的用户的资源到底能不能让你(OAuth2.0的客户端)访问。

所以在最安全的模式下,用户授权之后,服务端并不能直接返回token,通过重定向送给客户端,因为这个token有可能被黑客截获,如果黑客截获了这个token,那用户的资源也就暴露在这个黑客之下了。

于是聪明的服务端发送了一个认证code给客户端(通过重定向),客户端在后台,通过https的方式,用这个code,以及另一串客户端和服务端预先商量好的密码,才能获取到token和刷新token,这个过程是非常安全的。

如果黑客截获了code,他没有那串预先商量好的密码,他也是无法获取token的。这样oauth2就能保证请求资源这件事,是用户同意的,客户端也是被认可的,可以放心的把资源发给这个客户端了

到此这篇关于入门到精通Java SSO单点登录原理详解的文章就介绍到这了,更多相关SSO单点登录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java redisson实现分布式锁原理详解

    Redisson分布式锁 之前的基于注解的锁有一种锁是基本redis的分布式锁,锁的实现我是基于redisson组件提供的RLock,这篇来看看redisson是如何实现锁的. 不同版本实现锁的机制并不相同 引用的redisson最近发布的版本3.2.3,不同的版本可能实现锁的机制并不相同,早期版本好像是采用简单的setnx,getset等常规命令来配置完成,而后期由于redis支持了脚本Lua变更了实现原理. <dependency> <groupId>org.redisson&

  • java冷知识:javac AbstractProcessor详解

    目录 它可以做什么? Processor AbstractProcessor 源码 google的 auto-service javapoet 你喜欢的lombok实现原理是怎样的呢? 它可以做什么? 它做的事情当然是生成新类或修改原始的类,比如你遇到这样的情况下就可以使用: 反射好慢,曾见过一个大厂大量是Gson,由于Gson序列化时大量使用了反射,每一个field,每一个get.set都需要用反射,由此带来了性能问题.解决方法就是使用它尽量减少反射(替换成JSONObject) 生成代码,只

  • 详解Java8与Runtime.getRuntime().availableProcessors()

    lambda表达式以及并行流.官方承诺你写出来的代码更运行得更快.流会自动通过Fork/Join池并行地执行.我听过一些关于Java 8的主题的演讲,不过在这个非常关键的点上它们都说的有点问题.我计划在后续的文章中对并行流进行下深入的讲解,在这之前我先花点时间仔细地分析下它.关于这个问题,我只想问你们一个非常简单的问题,不过也是一个非常重要的问题,因为它是很多问题的关键所在.这个问题是: 这些并行操作的线程都是从哪来的? 在Java 8里,我们有一个通用的Fork/Join池,我们可以通过For

  • java单点登录(SSO)的实现

    单点登录(SSO):SSO是指在多个应用系统中个,用户只需要登陆一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一用户的登陆的机制. SSO的实现过程: 通过上述图形,我们可以看到SSO的大体实现步骤主要分为两大步:存储登录信息,查验登录信息. 对于SSO,我们也可以将之分为两大不同的类型:同域SSO和跨域SSO:其中同域SSO又可以分为完全同域SSO和同父域SSO. 一.完全同域SSO:指的是域名完全相同的多个应用系统中实现单点登录. 其实现步骤主要分为:

  • Java编程redisson实现分布式锁代码示例

    最近由于工作很忙,很长时间没有更新博客了,今天为大家带来一篇有关Redisson实现分布式锁的文章,好了,不多说了,直接进入主题. 1. 可重入锁(Reentrant Lock) Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁. public void testReentrantLock(RedissonClient redisson){ RLock lock = redisson.getL

  • Java TokenProcessor令牌校验工具类

    关于TokenProcessor令牌校验工具类废话不多说了,直接给大家贴代码了,一切内容就在下面一段代码中,具体代码详情如下所示: public class TokenProcessor { private long privious;// 上次生成表单标识号得时间值 private static TokenProcessor instance = new TokenProcessor(); public static String FORM_TOKEN_KEY = "FORM_TOKEN_KE

  • Java使用Redisson分布式锁实现原理

    1. 基本用法 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.8.2</version> </dependency> Config config = new Config(); config.useClusterServers() .setScanInterval(2000) /

  • 入门到精通Java SSO单点登录原理详解

    目录 1. 基础概念 2. 单点登录 3. CAS 流程 4. OAuth 流程 5. CAS和OAuth的区别 1. 基础概念 SSO单点登录(Single sign-on) 所谓单点登录就是在多个应用系统中,用户只需登录一次就可以访问所有相互信任的系统. CAS 中央认证服务(Central Authentication Service) CAS是由美国耶鲁大学发起的一个企业级开源项目,旨在为WEB应用系统提供一种可靠的单点登录解决方案(WEB SSO). OAuth2.0 开放授权(Ope

  • Rust语言从入门到精通系列之Iterator迭代器深入详解

    目录 迭代器的基本概念 迭代器是什么? Iterator trait Animal示例 迭代器的常见用法 map方法 filter方法 enumerate方法 flat_map方法 zip方法 fold方法 结论 在Rust语言中,迭代器(Iterator)是一种极为重要的数据类型,它们用于遍历集合中的元素.Rust中的大多数集合类型都可转换为一个迭代器,使它们可以进行遍历,这包括数组.向量.哈希表等. 使用迭代器可以让代码更加简洁优雅,并且可以支持一些强大的操作,例如过滤.映射和折叠等. 在本

  • Java中synchronized实现原理详解

    记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字"同步",也成为了我们解决多线程情况的百试不爽的良药.但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它. 诚然,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么

  • Java静态static关键字原理详解

    这篇文章主要介绍了Java静态static关键字原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 static关键字既可以修饰成员变量,也可以修改成员方法,修饰的成员变量和成员方法可以直接通过类名调用,也可以通过对象调用(其实即使是通过对象调用,也会被翻译成类名调用),建议通过类名调用. 成员方法用static修饰后,就成为了静态方法,静态方法不属于对象,而是属于类. 注意事项: 1.静态方法中不能使用this,因为this指的是当前对象

  • Java多线程 线程状态原理详解

    这篇文章主要介绍了Java多线程 线程状态原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java.lang.Thread.State枚举定义了6种线程状态. NEW: 尚未启动(start)的线程的线程状态 RUNNABLE: 运行状态,但线程可能正在JVM中执行,也可能在等待CPU调度 BLOCKED: 线程阻塞,等待监视器锁以进入同步代码块/方法 WAITING: 等待状态.使用以下不带超时的方式时会进入:Object.wait.

  • Java接口和抽象类原理详解

    这篇文章主要介绍了Java接口和抽象类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一

  • Java钩子方法概念原理详解

    这篇文章主要介绍了Java钩子方法概念原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 钩子方法源于设计模式中模板方法(Template Method)模式,模板方法模式的概念为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤.其主要分为两大类:模版方法和基本方法,而基本方法又分为:抽象方法(Abstract Method),具体方法(Concrete Me

  • Java String 拼接字符串原理详解

    首先来一道思考题: String str1 = "111111"; String str2 = "222222"; String str = str1 + str2; System.out.println(str); 很明确,上述代码输出的结果是:"111111222222",但是它工作原理是怎样的呢? 由于字符串拼接太常用了,java才支持可以直接用+号对两个字符串进行拼接.**其真正实现的原理是中间通过建立临时的StringBuilder对象

  • Java SpringBoot自动装配原理详解及源码注释

    目录 一.pom.xml文件 1.父依赖 2.启动器: 二.主程序: 剖析源码注解: 三.结论: 一.pom.xml文件 1.父依赖 主要是依赖一个父项目,管理项目的资源过滤以及插件! 资源过滤已经配置好了,无需再自己配置 在pom.xml中有个父依赖:spring-boot-dependencies是SpringBoot的版本控制中心! 因为有这些版本仓库,我们在写或者引入一些springboot依赖的时候,不需要指定版本! 2.启动器: 启动器也就是Springboot的启动场景; 比如sp

  • Java NIO Buffer实现原理详解

    目录 1.Buffer的继承体系 2.Buffer的操作API使用案例 3.Buffer的基本原理 4.allocate方法初始化一个指定容量大小的缓冲区 5.slice方法缓冲区分片 6.只读缓冲区 7.直接缓冲区 8.内存映射 1.Buffer的继承体系 如上图所示,对于Java中的所有基本类型,都会有一个具体的Buffer类型与之对应,一般我们最经常使用的是ByteBuffer. 2.Buffer的操作API使用案例 举一个IntBuffer的使用案例: /** * @author csp

随机推荐