跨二級域單點登陸解決方案[php+redis]

cookie共享 + session共享

cookie共享:共享同一個session cookie,服務端接受到相同的session idphp

session共享:共享同一個session系統,這樣來自不一樣二級域的統一session id訪問同一會話數據html

需求分析

web2.0時代,富web應用層出不窮,新公司如雨後春筍般層出不窮,有的專攻一點,有的涵蓋普遍,各有各的方向,各有各的理念,嗯,專攻一點的能夠狗帶了,咱們這裏主要講一下涵蓋普遍型的web服務最基本的業務整合模式:單點登陸web

例如開源中國旗下的三個業務單元,主站,我的空間,衆包redis

www.oschina.net  my.oschina.net zb.oschina.net跨域

在任何一個站點登陸後其餘站點都是登陸狀態服務器

php+redis實現

接下來咱們使用php + redis來實現sso的二級跨域模式,如何安裝redis服務器和php的redis.so擴展這裏就不說了,請自行百度cookie

例如咱們有session

www.sso.comdom

my.sso.comtcp

設定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的內容

相關文章
相關標籤/搜索