上文书讲了怎么让Yii如何与UCenter集成,如果完成,那么你登录yii的时候,相关的应用,比如discuz或是uchome就都同步登录上去了。但你会发现登录discuz/uchome的时候,并不能同步登录yii。
介素为虾米捏。介素因为ucenter的开发文档没写全。。
ok,现在我们要实现的是,登录discuz或是uchome的时候,yii能够同步登录上。
在看过CWebUser类和baidu之后。我把它简化一点。
首先,ucenter同步登录的入口是在YII_WEBROOT下的/api/uc.php中。它定义了一个类uc_note,其中的synlogin和synlogout两个方法就是同步登录和注销时候会从discuz远程调用的方法。
以synlogin为例,它在同步登录时候主要发送了一个p3p header并写入了一个名为Example_auth的cookie。我们应该在synlogin的方法的末尾加入Yii的登录方法。
如何登录Yii呢,于是就要找到CWebUser了。
yii的用户是在Yii::app()->user,也就是由CWebUser实现的。它主要操作了几个东西,一个是Yii::app()->user->id,然后Yii::app()->user->name,当然还有states。但,判断登录的,最主要是id和name。
如果你是默认配置,那么在yii登录之后,输出$_SESSION,会发现在类似$_SESSION['xxxxxxxxxxxxxxx__id']和$_SESSION['xxxxxxxxxxxxxxx__name']这样的变量,也就是说,如果我们写入这两个变量,Yii就会判断用户登录成功。这里的xxxxxxxxxx是由CWebUser::stateKeyPrefix指定的。默认是空,所以它就生成一个md5的hash,当然,这个stateKeyPrefix是可以由配置指定的。
现在找到方法了。两步修改就OK了。
1. Yii的config.php中,添加
‘user’=>array(
// enable cookie-based authentication
‘allowAutoLogin’=>true,
‘stateKeyPrefix’ => ‘mysite’,
),
这样就指定了stateKeyPrefix
2. 在Yii的web根目录下的/api/uc.php中的synlogin方法中添加如下
session_start();
$_SESSION['mysite__id'] = $uid;
$_SESSION['mysite__name'] = $username;
OK,打完收工。退出的代码也类似原则修改。
这时候你再去登录discuz,就会发现Yii登录上去了。
但实际上你应该做一个自己的WebUser,然后使用restoreFromCookie这个方法来登录用户。因为上面这样的简单配置会有一个问题:uc.php一般我们不愿意太多的地去修改它。如果uc.php的session使用的是文件系统,而Yii的session使用数据库存储,虽然两边的session_id都一样,但服务器端数据并不在同一个地方,所以session就“失效”了。