• SSO单点登录原理与技术


    Token(令牌)

    token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

    单点登录原理:

    当用户第一次登录后,服务器生成一个token并将此token返回给客户端客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。 以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

     同域SSO原理分析

    实际上,HTTP协议是无状态的,单个系统的会话由服务端Session进行维持,Session保持会话的原理是通过Cookie把sessionId写入浏览器,每次访问都会自动携带全部Cookie,在服务端读取其中的sessionId进行验证实现会话保持。同域下单点登录其实就是手写token代替sessionId进行会话认证。

    token的生成

      token的组成uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)

    服务端生成token后,将token与user对象存储在Map结构中,token为Key,user对象为value,response.addCookie()生成新的Cookie,名为token,值为token的值。

          

    跨域SSO原理分析

    当有多个系统时,认证机制的流程如下:

    1. 提供用户登录界面,供用户进行身份认证
    2. 用户验证通过后,生成新token
    3. 将token<->user 对存入全局MAP中供校验
    4. 将token写入所有域的Cookie中
    5. 页面重定向回原始请求URL

    分析

    当系统有多个并且在不同域(domain)时,Cookie只会作用在当前域下。

    token写入所有域的Cookie中才是解决跨域SSO的核心

        

    Cookie增删改查

    如何读取Cookie?

    通过Servlet中的request对象可以读取到Cookie数组,然后foreach遍历读取,一般只是获取到nam和value,其他信息写入到浏览器后,浏览器不主动再发回来,读取并无意义。

            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    System.out.println(
                            cookie.getName() +
                            cookie.getValue() +
                            cookie.getMaxAge() +
                            cookie.getPath() +
                            cookie.getDomain() +
                            cookie.getSecure() +
                            cookie.isHttpOnly()//客户端js是否可以获取
                    );
                }
            }

    如何写入Cookie带到浏览器?

    新建Cookie对象设置一系列属性,然后添加到response中去。需要注意的是,当设置path为“/”时,表示所有路径都会被该Cookie作用到,如果设置为/path1那么由/path2发起请求就不会携带该Cookie。默认不设置只作用在当前路径下。

            Cookie cookie = new Cookie("myCookieName","myCookieValue");
            cookie.setHttpOnly(false);//Javascript不能处理
            //一个正值表示cookie将在经过许多秒之后过期。注意,值是cookie过期的最大时间,而不是cookie当前的时间。
            //负值表示cookie没有持久存储,在Web浏览器退出时将被删除。零值会导致删除cookie。
            cookie.setMaxAge(-1000);
            cookie.setSecure(false);//如果为true,仅支持HTTPS协议
            //cookie对指定目录中的所有页面以及该目录子目录中的所有页面都可见。
            cookie.setPath("/");
            //cookie.setDomain("www.a.com");//默认情况下,cookie只返回给发送cookie的服务器。
            response.addCookie(cookie);

    修改Cookie

    修改更新Cookie时,除了要保证Cookie的name是相同的,也要保证Cookie的一系列属性是相同的,否则浏览器会生成新的Cookie。

    删除Cookie

    只需要设置Cookie的MaxAge为负值,意味着是过去的Cookie,浏览器就会清除。





    参考文献---掘金

  • 相关阅读:
    高中数学相关的专业术语
    数学-高数2
    python+unittest+xlrd+request搭建API测试框架
    接口自动化,断言方法,深度定位错误
    python+requests+unittest API接口测试
    python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
    学习python的第一个小目标:通过requests+xlrd实现简单接口测试,将测试用例维护在表格中,与脚本分开。
    队列 —— 先入先出的数据结构
    卷积神经网络的简单可视化
    HOG 特征提取算法(实践篇)
  • 原文地址:https://www.cnblogs.com/JonaLin/p/12746176.html
Copyright © 2020-2023  润新知