单点登录简单实现

公司的业务后台系统, 快十来个了。

每个系统的后台管理员表都不一样,拥有的权限也不一样。

不是每个后台管理员都能登录全部系统的。有的能登录一、两个,有的能登录七、八个。

现在要解决的问题是,如何从一个登录进入,让其能在他拥有帐号的其他系统中免登录呢?

我是这么解决的。

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');
    }

另一部分,是在其他域都要写,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.

如还有疑问,欢迎加入 PHP技术问答群 提问交流, 让我们互相帮助,共同成长!

如果你已经高人,又愿意帮助他人。更热烈欢迎加入!

QQ群号:292626152

猜你喜欢

转载自blog.51cto.com/phpervip/2160904