SSO架构分析

SSO技术架构(Single Sign On)

1.SSO的背景

在多系统共存的环境下,用户在一处登录后,就可以不用在其他系统中重新登录,有了SSO技术,用户的使用成本更低、更加友好。

比如我们平时使用的淘宝、天猫、支护宝这三个应用,只需要登录其中一个应用,我们就可以直接访问这三个系统,而无需重新登录。

技术特点总结

一个账户,一次登录,即可访问多个系统

2.HTTP会话机制的简单介绍

2.1.http的无状态协议

http无状态协议

在http协议中,是属于无状态的,这就意味着任何用户都能够访问服务器资源!

但是对于有些系统而言,我们服务器端是需要区分出用户的,比如支付宝、淘宝等系统

2.2.http的会话(session)机制

既然http协议是无状态的,那么我们是否可以引入有状态协议呢?


http会话机制

那么会话协议怎么来实现呢?

  • cookie
  • 请求参数

2.2.多系统的复杂性

在前面的部分,我们介绍了关于单个系统,是如何实现会话机制的。那么多系统该如何处理呢?


多系统复杂性

web系统发展为多系统组成的应用群,但是这个复杂度应该由系统内部承担,而不是用户。如果每次访问一个新系统,都需要重新登录一次,对于用户体验而言,是难以接受的!

既然如此,我们是否能够实现在多系统间,登陆一次,即可所有系统都能够访问呢?


一次登录

在前面的部分,我们提到过,单系统的会话机制,可以使用请求参数cookie的技术来实现,但是在真实的环境中,基本不采用请求参数的方式,原因很简单,请求参数的方式安全性太差了,非常容易受到攻击。但是cookie是有限制的,cookie的域受限于相同的域名!比如下面的场景

用户访问(天猫)http://tmall.com/,(淘宝)http://taobao.com,(支付宝)https://www.alipay.com/三个域名时
三个域名的cookie是不能够跨域名携带传输的

也就是,如果使用常规的cookie技术,是无法解决多系统的会话机制的。
那么是否可以统一这些系统到一个顶级域名下面呢,比如:*.baidu.com?是的,该方案能够实现,但是存在一个比较大的缺点,那就是对域名有着非常严格的要求!

3.大杀器,SSO

相比较单系统登录,SSO架构需要一个单独的认证中心,用于处理用户的登录。其他的系统不提供登录入口,只需要接受认证中心的间接授权即可。

3.1.单点登录

SSO架构

用户登录成功之后,会与sso认证中心及各个子系统建立会话,用户与sso认证中心建立的会话称为全局会话,用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过sso认证中心。全局会话与局部会话存在的约束关系:

  • 局部会话存在,全局会话一定存在
  • 全局会话存在,局部会话不一定存在
  • 全局会话销毁,局部会话必须销毁

3.2.单点注销

在一个子系统中注销,那么其他子系统的会话都会被注销


单点注销

3.3.部署架构

部署架构

在这里面,很关键的一点就是区分:sso-client、sso-server

3.4.系统架构

系统架构

4.SSO的实现

sso-client的功能

  • 拦截系统的请求,如果未登录,直接跳转到sso-server登录界面
  • 接收并存储sso-server发送过来的令牌
  • 与sso-server保持通信,检验令牌的有效性
  • 建立局部会话
  • 拦截用户的注销请求,向sso-server发送注销请求
  • 接收sso-server发送的注销请求,摧毁局部会话

sso-server的功能

  • 提供登录界面
  • 认证用户的登录信息,创建授权令牌,发送令牌给sso-client
  • 创建全局会话
  • 检验sso-client发送过来的令牌有效性
  • 系统注册
  • 接收sso-client的注销请求,注销全局会话,通知sso-client注销局部会话

核心代码
1.sso-client拦截未登录请求

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    HttpSession session = req.getSession();

    if (session.getAttribute("isLogin")) {
        chain.doFilter(request, response);
        return;
    }
    //跳转至sso认证中心
    res.sendRedirect("sso-server-url-with-system-url");
}

2.sso-server创建令牌

String token = UUID.randomUUID().toString();

3.sso-client取得令牌并去sso-server校验令牌的有效性

// 请求附带token参数
String token = req.getParameter("token");
if (token != null) {
    // 去sso认证中心校验token
    boolean verifyResult = this.verify("sso-server-verify-url", token);
    if (!verifyResult) {
        res.sendRedirect("sso-server-url");
        return;
    }
    chain.doFilter(request, response);
}

参考附录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343