1. 程式人生 > >多個業務系統後臺單點登錄打通的實現

多個業務系統後臺單點登錄打通的實現

一個數據庫 公司 find lena vol sign sel 兩個 param

公司的業務後臺系統, 快十來個了。

每個系統的後臺管理員表都不一樣,擁有的權限也不一樣。

不是每個後臺管理員都能登錄全部系統的。有的能登錄一、兩個,有的能登錄七、八個。

現在要解決的問題是,如何從一個登錄進入,讓其能在他擁有帳號的其他系統中免登錄呢?

我是這麽解決的。

1.統一用戶名,用戶名一定是唯一的。
2.另建一個數據庫,有三張表。表前綴略。
User表,字段:uid,username,password,status,
User_website表, 字段 uid,wid
Website表,字段 wid,sitename,siteurl,sitedomain,dbname,tablename
dbname記錄該站點的數據庫名,tablename記錄該站點的管理員用戶表名。備用。

有了這三張表,就可以設置
添加,編輯用戶,
設置他們可允許訪問的站點,
各站點情況。

用戶登錄後,跳轉到,允許站點的列表頁面,再可以任意點擊一個,直接進入該站點後臺首頁。

用戶登錄後,設置
setcookie(‘username‘,$username,time()+3600,‘/‘,);

跳轉到 站點列表頁。
在此頁面,頁面名:indexall.html,寫javascript
訪問各個相關站點去setcookie. (關鍵是這裏!)

ThinkPHP框架,
關鍵代碼:

{volist name="website" id="vo"}
<script type="text/javascript" src="http://{$vo.sitedomain}/admin/login/setcookie?ticket={$username}"></script>
{/volist}

website,是由控制器傳過來的數組變量。
主要代碼是:
// 多個後臺 傳送門

    public function indexall(){
        $username = cookie(‘username‘);
        if(!$username){
            return $this->error(‘請先登錄!‘,‘admin/loginall/login‘);
        }
        $cg_user_uid = cookie(‘cg_user_uid‘);
        $this->assign(‘username‘,$username);
        $db_cg_user     = Db::connect(‘db_cg_user‘);
        $website = $db_cg_user->name(‘User_website‘)->alias(‘uw‘)
            ->join(‘cg_website w‘,‘uw.wid=w.wid‘,‘left‘)
            ->where(‘uw.uid‘,$cg_user_uid)->where(‘w.dev‘,0)->select();
        $this->setMeta(‘總後臺‘);
        $this->assign(‘website‘,$website);
        $this->assign(‘uid‘,$website[0][‘uid‘]);
        return $this->fetch(‘loginall/indexall‘);
    }

因為項目數據庫所在服務器與這個通用的用戶表不在同一個服務器,所以有
Db::connect(‘db_cg_user‘); 這樣的寫法。
如果你的放在同一個數據庫,就不用這麽寫,可以用model.

另一部分,是在其他域都要寫,setcookie方法。
下面是其他域的方法:
你根據你們的實現情況寫。

class Login extends Admin
{
    // 遠程清設置cookie
    public function setcookie(){
        $ticket = $_GET[‘ticket‘];
        setcookie("username",$ticket,time() + 3600, ‘/‘);
        Cookie(‘ticket‘, $ticket);
        $user = mAdminuser::where(‘username‘,$ticket)->find();
        $mAdminuser = new mAdminuser;
        $mAdminuser->autoLogin($user);
    }

    // 遠程清除cookie
    public function unsetcookie(){
        Cookie::clear();
        Session::clear();
    }
}

上面的autoLogin方法寫在model中。

 /**
     * 更新管理員登錄信息
     * @param integer $user 管理員信息數組
     */

    public function autoLogin($user){
        /* 更新登錄信息 */
        $data = array(
            ‘uid‘            =>  $user[‘uid‘],
            ‘login‘             =>  array(‘exp‘,‘`login`+1‘),
            ‘last_login_time‘     =>  time(),
            ‘last_login_ip‘       =>  getIp(),
        );

        $map[‘uid‘] = $user[‘uid‘];
        $this->where($map)->update($data);
        $user = $this->where($map)->find();

        /* 記錄登錄的SESSION和COOKIE */
        $auth = array(
            ‘uid‘            => $user[‘uid‘],
            ‘username‘          => $user[‘username‘],
            ‘last_login_time‘   => $user[‘last_login_time‘],
        );
        session(‘uid‘,$user[‘uid‘]);
        session(‘roleid‘,$user[‘roleid‘]);
        session(‘username‘,$user[‘username‘]);
        session(‘lock_screen‘,0);
        cookie(‘admin_username‘,$user[‘username‘]);
        cookie(‘uid‘,$user[‘uid‘]);
        cookie(‘admin_email‘,$user[‘email‘]);
        session(‘user_auth‘, $auth);
        session(‘user_auth_sign‘, data_auth_sign($auth));
    }

這樣就好了!

登出時,也是一樣。點一鍵登出(這個鏈接做到站點列表頁面右上角即可)。則通過一個過渡頁面。
十秒後跳回一鍵登錄頁面。在此時間前,
js 方法,訪問到,其他域清除cookie,session.

主要是理解邏輯,不能照抄的。關鍵在於傳遞cookie。

如還有疑問,歡迎加入 PHP技術問答群 提問交流, 讓我們互相幫助,共同成長!

如果你已經高人,又願意幫助他人。更熱烈歡迎加入!

QQ群號:292626152

多個業務系統後臺單點登錄打通的實現