集中认证实现(单点登录)

越看现在公司基于Thinkphp3.0的改版框架约不顺眼,先不说为了更改目录结构更改了其核心代码,光是RBAC的认证的冗余代码就让人很不舒服,并且这项目没人跟进,导致新项目用这套东西越来约中庸,现在我接手了团队,当然第一步要那这个开刀。

鉴于目前的团队成员一直都在用ThinkPHP,所以不好直接引入我前端时间做的CI的权限框架,所以还得拿ThinkPHP入手,官网一看都已经到3.2.2了,并且跟以前的差距很大,那就直接选这个了,整体的权限思路还是按照当初CI的来设置的,下面就还遇到了一个问题,目前公司里有自己的统一验证平台Ucenter,但是那几乎是上一代程序员的产物了,所以现在要重新设计,但是还要兼容旧的,所以就出现了现在的这套集中认证。

再写整个TP的权限框架的时候,里面不仅实现了子系统的认证,而且还包含了中心的验证方法,这此主要是将这套的集中认证实现。下面就来看一下。

流程:

伪代码:
中心认证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public function auth(){
If($token){
//【4】
$ainfo = Query(“SELECT * FROM center_auth WHERE token=’$token’ AND flag = 1”);
If($ainfo){
$r=array(‘flag’=1,’keys’=’’,’???’=用户信息);
}else{
$r=array(‘flag’=0);
}
echo json_encode($r);
}
else{
//【2】
Query(“INSERT INTO center_auth (callback,keys,token) VALUE(‘接收的callback’,’接收的keys’,’随机生成的token’)”);
跳转回 http://callback?token=随机生成的token;
}
}

子系统:

1
2
3
4
5
6
7
8
9
10
11
12
Public function callback(){
If($token){
//【3】
$retdata = file_get_contents(“http://auth?token=$token”);
$data = json_decode($retdata);
验证data[‘flag’],data[‘keys’],根据data[‘用户信息’]做登录处理;
}else{
//【1】
//生成随机$keys并在本地记录
跳转入中心认证http://auth?callback=http://callback&keys=$keys;
}
}