in 技术与思考

UCenter同步登录YiiFramework

上文书讲了怎么让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就“失效”了。

您还可能喜欢:

Write a Comment

Comment

  1. 兄弟,看了你的总结,受益匪浅。

    想请教一句,如果自己继承一个WebUser的话,WebUser::login()主要要做哪些修改呢?我dump了一下uc的cookie,有点乱,找不到规律,不知道在Yii里要怎么去调用uc的cookie,然后用来restoreFromCookie(),望指点!

    thx!


  2. kongbai:

    请问如何从yii项目登录同步登录到dz呢?

    你还可以参看我写的那个“Yii初步整合UCenter”,结合UCenter的同步登录,UCenter的API中有一个登录的方法,利用这个方法就可以登录至UCenter。
    又因为dz是利用了UCenter做用户中心,登录了UCenter并且打开了同步登录的话,就会发现登录Yii之后dz也是已登录状态的。

  3. 最近有做到Yii跟ucenter的整合,我在做的时候,貌似只要在ucenter中注册Yii应用,然后修改yii中的登录保证登录yii即同步登录ucenter,好像没有用到lz所说的修改yii配置也可以实现同步了,望lz解释下。

  4. 呃,不知道你说的“修改yii中的登录保证登录yii”是啥意思,我没用有什么插件。这篇是指用yii框架本身要同步登录时ucenter时的操作方法。相对底层一些的操作。:)

  5. 就是,我保证Yii和ucenter的通信无误后,就可以做到登录uchome,同步登录了yii系统,没有做如楼主所说的修改。

  6. 也可能现在的ucenter有改进吧。很久之前做的东西,最近没怎么用yii写东西了。惭愧惭愧。不过yii似乎也没什么大动作,等新版qiang大给惊喜了。