多個業務系統後臺單點登錄打通的實現
每個系統的後臺管理員表都不一樣,擁有的權限也不一樣。
不是每個後臺管理員都能登錄全部系統的。有的能登錄一、兩個,有的能登錄七、八個。
現在要解決的問題是,如何從一個登錄進入,讓其能在他擁有帳號的其他系統中免登錄呢?
我是這麽解決的。
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
多個業務系統後臺單點登錄打通的實現