文档章节

跨二级域单点登录解决方案[php+redis]

big_cat
 big_cat
发布于 2015/11/09 16:31
字数 734
阅读 444
收藏 2

cookie共享 + session共享

cookie共享:共享同一个session cookie,服务端接受到相同的session id

session共享:共享同一个session系统,这样来自不同二级域的统一session id访问同一会话数据

需求分析

web2.0时代,富web应用层出不穷,新公司如雨后春笋般层出不穷,有的专攻一点,有的涵盖广泛,各有各的方向,各有各的理念,嗯,专攻一点的可以狗带了,我们这里主要讲一下涵盖广泛型的web服务最基本的业务整合模式:单点登录

例如开源中国旗下的三个业务单元,主站,个人空间,众包

www.oschina.net  my.oschina.net zb.oschina.net

在任何一个站点登录后其他站点都是登录状态

php+redis实现

接下来我们使用php + redis来实现sso的二级跨域模式,如何安装redis服务器和php的redis.so扩展这里就不说了,请自行百度

例如我们有

www.sso.com

my.sso.com

设定session的句柄为redis服务器,session的cookie的共同的域为一级父域 :‘.sso.com’

<?php
    error_reporting(E_ALL);
    //session的句柄设为redis
    ini_set('session.save_handler', 'redis');
    //session的保存路径设为redis服务器的tcp链接
    ini_set('session.save_path', 'tcp://your.redisserver.domian:6379');
    //使用session_set_cookie_params来设置session_start()时
    //在客户端当前域下保存的session的cookie标识的生存时间,路径,域
    session_set_cookie_params(3600, '/', '.mysso.com');
    //开启session时,session会在客户端需找当前同源域下的键名为session_name()的cookie
    //此cookie存储着session_id()的值,服务器根据此标示来识别那条session记录时当前客户端的
    //若不存在会按session_set_cookie_params给定的参数设定一条cookie在本地
    session_start();

   逻辑模块,例如:

    if (isset($_SESSION['user'])) {
        echo "welcome!" . $_SESSION['user'] . '<br/>';
        //这里讲明下redis是如何存放session的
        $redis = new Redis();
        $redis->connect('your.redisserver.domian', 6379);
        //PHPREDIS_SESSION:session_id() 的组合键为键名,以string类型存放在redis服务器中
        $session = $redis->get('PHPREDIS_SESSION:' . session_id());
        var_dump($session);
    } else {
        if (isset($_POST['submit'])) {
            $_SESSION['user] = $_POST['user];
            $_SESSION['password'] = $_POST['password'];
            header("location:/");
        } else { ?>
            <!DOCTYPE html>
            <html>
            <head>
                <title>sso_redis</title>
            </head>
            <body>
                <div>
                    <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
                    <input type="text" name="user" />
                    <input type="password" name="password" />
                    <input type="submit" name="submit" value="submit">
                    </form>
                </div>
            </body>
            </html>  
<?php
        }//end post if
    }//end user if
    ?>

 

以上两个模块分别实现了

session通过redis实现共享,session的cookie域的设置

判断用户是否登录,redis如何保存session

的功能

将以上代码放置到www.sso.com my.sso.com 上(用虚拟主机玩就可以)

在任意站点登录后都可以实现另一站点的登录

父域相同

redis端以String类型存储某session_id的内容

© 著作权归作者所有

big_cat
粉丝 49
博文 238
码字总数 162959
作品 0
长宁
后端工程师
私信 提问
完全跨域单点登录解决方案[php+redis+p3p协议]

技术要点:COOKIE跨域 + SESSION共享 cookie跨域:让不同域下的session cookie有着同样的session id session共享:同一会话系统,客户端不同域下的session id相同故可访问相同的会话状态 完全...

big_cat
2015/11/11
676
0
基于 Web 的单点登录理论研究之跨域和票据设计

最近好多朋友问我关于 SSO 的问题,其实市面上有很多成型的产品,SSO 理论本身也提了好多年了,下面是我以前写的一篇文章《基于 Web 的单点登录理论研究》里的一部分关于跨域和票据设计问题,...

青夜之衫
2017/12/08
0
0
基于 Web 的单点登录理论研究之跨域和票据设计

最近好多朋友问我关于 SSO 的问题,其实市面上有很多成型的产品,SSO 理论本身也提了好多年了,下面是我以前写的一篇文章《基于 Web 的单点登录理论研究》里的一部分关于跨域和票据设计问题,...

唐玄奘
2017/12/04
0
0
单点登录(SSO)看这一篇就够了

背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。 但随着企业的发展,用到的系统随之增多,运营人员在操作...

小忽悠
2018/09/06
0
0
PHP-多域名单点登陆方案

1.只是二级域名不同(比如a.xx.com, b.xx.com)   利用cookie, 设置domain为".xx.com"即可 2.多个本域名都不相同(比如www.a.com, www.b.com)   1).可以在www.a.com的登录界面利用隐藏ifram...

stone_
2016/10/19
87
0

没有更多内容

加载失败,请刷新页面

加载更多

目标检测中 yolo 的mAP是什么含义?

mAP定义及相关概念 P => precision,即 准确率 R => recall,即 召回率 PR曲线 = >即 以 precision 和 recall 作为 纵、横轴坐标 的二维曲线。一般来说,precision 和 recall 是 鱼与熊掌 的...

小松1
刚刚
0
0
用jdk1.8的断言来做非空判断

Assert.notNull(user, "没有获得登录用户信息"); 看源码如下: public static void notNull(Object object, String message) { if (object == null) { throw new IllegalArgum......

architect刘源源
5分钟前
2
0
免费节假日api每一时间更新 2020年 部分节假日安排

根据国务院办公厅关于2020年部分节假日安排的通知国办发明电〔2019〕16号.免费节假日api每一时间更新 2020年 部分节假日安排 http://tool.bitefu.net/jiari/ 各省、自治区、直辖市人民政府,...

xiaogg
8分钟前
2
0
2018NOIP各省一等奖分数线

提高组 普及组

SamXIAO
17分钟前
5
0
常见的PPT时间轴怎么制作,这几种方法你要知道

在PPT当中,时间轴是一个非常重要的一个版块,很多PPT会用它来表示公司的发展历程和项目进度。但是对于PPT时间轴的制作很多人做法是一条直线上添几个点,标注出事件就完成了,可是这样也太过...

TeFuiro
23分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部