单点登录踩坑记

简介

因为项目需要,本渣渣需要去做单点登录相关的工作。打开谷歌搜一搜,可以看到这篇文章,号称单点登录,看这一篇就够了。事实上,也确实如此,看那一篇够了。这篇仅仅是本渣渣的思考和笔记。如果是 Java 做单点登录,那么本渣渣建议使用 Github 上的 smart-sso,千万不要使用 Apereo CAS 这种东西。Smart-sso: https://github.com/a466350665/smart-sso

Apereo CAS 官方的文档写的太糟糕,本渣渣仔细阅读了文档,文档会告诉你原理,会告诉你一些设计的好处,但是 Apereo CAS 官方文档不会告诉你应该如何去开始使用,应该如何快速上手。这时,你肯定会寻求于网上的教程,在 Github 中找寻已经配置好的项目。可是,等你开始看教程,你会发现 Apereo CAS 版本已经更新了,教程中说的“脚手架”已经关掉了。这时,仔细看了文档的你,就回去下载 Apereo CAS 提供的 Docker,这个 Dokcer 可以提供“脚手架”服务,但是会跑起来之后和教程中的不一样,甚至你只能看到的只有文本,没有 UI。经过一番折腾,本渣渣决定放弃 Apereo CAS,做得那么难用,文档写的那么不友好,本渣渣不配。

原理

关于单点登录,有两种实现方式,和朋友讨论的时候,发现最核心的问题是,服务器怎么知道这个请求是你的?先思考登录本身是怎么实现的。服务器是怎么识别一个已经登录用户的请求的呢?原理是用 Cookie,登录的时候,服务器给前端字段 jsessionid,这个字段在服务器上是唯一的,能够唯一标识这个客户端。之后,客户端在发出请求的时候,所有的请求都带上 jsessionid 这个字段,这样服务器就可以识别出这个客户端了。

单点登录实现方式一:共享 Cookie 和共享 Session。这种方式适合于同个域名,比如你有一个域名 example.com,你有两个应用 a.example.com 和 b.example.com。这时,可以利用 example.com 来实现 Cookie 共享。本渣渣没有实践过,不确定是否可以这么做,不过估计应该是可以的。客户端的逻辑是这样的,a.exmple.com 登录的时候,可以设置 example.com 的 Cookie,设置 jsessionid。当 b.example.com 发出请求的时候,可以先从 exmaple.com 那里获取 Cookie,如果有 jsessionid,那么请求的时候带上,这样服务端就可以识别了。服务端的逻辑是这样的,a.example.com 得到了登录的请求,需要在一个 b.example.com 能够访问的地方存储 Session。一般用的是 Redis。

单点登录实现方式二:CAS。谷歌上一搜,出来的会是 Apereo CAS,但是不要把一个具体的实现和一个思路搞混。CAS 是 Central Authentication Service 的缩写,即中心化的认证服务。采用一种 C/S 架构,这里客户端一般是后端程序,服务端一般是专门提供认证服务的地方。CAS 实现单点登录,单点登出,可以参考 smart-sso 在 github 上给出的泳道图,给出了一个基本的流程。我们假设存在两个应用,分析 sso 一般需要考虑四种情况:一,应用 A 第一次登录系统;二,应用 A 登录后向后端发起请求;三,应用 A 登录后,应用 B 向后端发起请求;四,单点登出。本渣渣认为,最重要的是对重定向的利用,利用重定向来获取 cookie 中的属性。下面是 Apereo CAS 官网给出的图,从这点看, Apereo CAS 并非万恶不赦,原理方面的阐述还是可以的。这里注重分析上面的情况三,图里的第三种情况。应用 B 没有登录,后端是知道的,于是返回一个重定向。重定向到了前端,此时会跳转到已经登录过的统一认证域名下面,这时统一认证域名下面的 Cookie 就可以获取了,这样就可以拿到唯一标识,这个东西回答了前面最开始说的“服务器怎么知道这个请求是你的”,服务器根据这个唯一标识可以确定已经登录了。登出,我的想法是,应用 A 前端向后端 A 发请求,后端 A 向 CAS 服务器发出登出请求,接下来有 CAS 服务器向各个应用服务器的后端分发登出。

实践

目前仅仅是下载了 smart-sso 的代码,跑了一下,发现还可以。目前的项目基本情况是,老项目用的是 SSH,前后端没有分离;新项目用的是 SSM,前后端分离。要在老项目和新项目上做单点登录。

对于老项目,前后端没有分离,整套逻辑和上面的图是比较相符的,需要修改的部分,应该只有后端登录部分。对于新项目,采用了前后端分离,当后端收到一个重定向的响应的时候,特别需要注意的地方是当重定向返回来一个 Login Form,要弹出来登录页面。

总而言之,本渣渣纸上谈兵,是时候打代码去了。

posted @ 2021-05-08 21:26  楷哥  阅读(395)  评论(0)    收藏  举报