公司的业务后台系统, 快十来个了。
每个系统的后台管理员表都不一样,拥有的权限也不一样。
不是每个后台管理员都能登录全部系统的。有的能登录一、两个,有的能登录七、八个。
现在要解决的问题是,如何从一个登录进入,让其能在他拥有帐号的其他系统中免登录呢?
我是这么解决的。
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
原文地址:http://blog.51cto.com/phpervip/2160904