zoukankan      html  css  js  c++  java
  • 用户单点登录SSO和用户登录挤出

    参考:

    https://www.jianshu.com/p/75edcc05acfd(单点登录(SSO)看这一篇就够了)

    https://blog.csdn.net/xiaoguan_liu/article/details/91492110(什么是单点登录:原理与实现简介)

    1,不同域下的单点登录,其实比较复杂;

    2,需要注意:http协议的重定向其实都是浏览器重新发起的请求;和后台异步请求是不一样的;

    3,post跳转只能借助表单

    一,用户登录挤出

    1,session机制时

    //1,用户登录后
    S[session_id1] = userData;
    G[user_id]=session_id1;
    
    //2,用户在其他终端登录
    S[session_id2] = userData;
    G[user_id]=session_id2;
    S[session_id1=[state=>'已登出'];
    
    //3,用户在之前的终端继续访问
    请求验证用户信息,发现S[session_id1]已登出
    提示客户端在另一台设备登

    2,token机制时

    //1,用户登录后
    userData生成token1;
    G[user_id]=token1;
    
    //2,用户在其他终端登录
    userData生成token2;
    G[user_id]=toke2;#token被修改
    
    //3,用户在之前的终端继续访问
    token1 解析 userData;
    发现 token 不等于 G[user_id] ;
    提示用户已登出



    二,多系统下单点登

    1,同域下的单点登录

    相关知识:

    1,我们在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。

    2,session共享

    解决2个问题:

    • Cookie是不能跨域的,我们Cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求是带不上的。
    • sso、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的。
    //1
    针对第一个问题,sso登录以后,可以将Cookie的域设置为顶域
    这样所有子域的系统都可以访问到顶域的Cookie。
    //2
    共享Session的解决方案

    同域下单点登出:

    登出后需要把session_id删除,则对应的cookie失效,需要重新登录和设置cookie

    2,不同域下的单点登录

    具体流程如下:

    1,用户访问app系统,app系统是需要登录的,但用户现在没有登录。
    2,跳转(重定向:带上url参数)到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。
      SSO系统也没有登录,弹出用户登录页。
    3,用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。(全局会话)

    4,SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转(重定向:根据url参)到app系统,同时将ST作为参数传递给app系统。
    5,app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效

    6,验证通过后,app系统将登录状态写入session并设置app域下的Cookie。(局部会话)
    跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问app2系统时的流程。
    1,用户访问app2系统,app2系统没有登录,跳转(重定向:带上url2)到SSO。#用户此时访问的是SSO系统,重定向浏览器会带上SSO域的Cookie(变成全局会话)
    2,由于SSO已经登录了,不需要重新登录认证。(SSO怎么知道已经登录了?)
    3SSO生成ST,浏览器跳转(重定向:根据url2参数)到app2系统,并将ST作为参数传递给app2。
    4,app2拿到ST,后台访问SSO,验证ST是否有效。
    5,验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。(局部会话)
    这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。
     

    登出的问题

    1,可以各自登出
      销毁各自的登录态
     
    2,单点登出
      销毁sso的登录态
    1,app下请求退出,app取出令牌ST,像SSO系统发出注销请求(重定向)
    2,SSO系统校验令牌,通过ST解析出user_id, 销毁user_id对应的全局会话(也就相应的session)
    3,取出user_id对应的各个子系统的令牌ST,并销毁
    4,像各个子系统发出注销user_id的注销请求,销毁各个局部会话(异步)
    5,重定向的SSO的登录页面
  • 相关阅读:
    JAVA规范
    JMS开发指南
    JMS异步消息机制
    大型系统中使用JMS优化技巧–Sun OpenMQ
    02.MyBatis配置文件详解
    elasticsearch.yml配置文件
    04.ActiveMQ与Spring JMS整合
    01.MyBatis入门
    03.JMS深入
    02.JMS基础
  • 原文地址:https://www.cnblogs.com/tkzc2013/p/13920050.html
Copyright © 2011-2022 走看看