标签归档:Yii

Yii是一个不错的PHP开发框架,这里记录了我在用Yii开发小东西的一些记录。官方网站在…搜索一个嘛亲~

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就“失效”了。

在Yii中使用MySQL存储Session信息

非常非常简单。

在配置文件如protected/config/main.php中,加入以下

'components'=>array(
//
'session' => array(
'class' => 'system.web.CDbHttpSession',
'connectionID' => 'db',
),
//
),

这样配置的话,Yii会自动创建一个yiisession的表,用来存储Session数据。
打完收功~剩下的CDbHttpSession替我们都搞定了~~

详解Yii的RBAC权限体系

Yii还是不错的,提供了一个很不错的RBAC框架给咱们。不过之前没玩过,把玩了一下,搞定。

第一步,安装yii……
第二步,安装srbac这个扩展,这个扩展用起来是相当地销魂啊。

OK,现在我们开始解释。

RBAC即为role-based access control,它要解决的问题就是“谁能做什么”,分析此句,两大因素,人物(谁),动作(做什么)。

人物,在RBAC里分为两层,一层叫user,一层叫role。
张三是user,他可能同时拥有多个role,比如“注册用户”,“版主”,“帖子创建者”等。
user好解释,表中的某行就意味着一个user。
但角色,是由一个业务规则,或是说一个逻辑来指定的。比如“注册用户”的逻辑是“!Yii::app()->user->isGuest”,“版主”的逻辑是“in_array(Yii::app()->user->id, $board->owner_ids)”,“帖子创建者”的逻辑就是“Yii::app()->user->id == $post->user_id”。
如果这个逻辑判断为真,那么当前用户就属于这个角色。

动作,这也分两层。一层叫operation,一层叫task。
operation,是指一个原子操作。
而一个task可能包括了多个operation。
举个例子来说,“管理帖子”这个task就包括了“创建帖子”、“删除帖子”,“修改帖子”、“查看帖子”、“帖子列表”这四个operation。而“查看帖子”可能只包括了“查看帖子”、“帖子列表”这两个operation。

现在我们把用户和动作结合起来。
“版主”可以“管理帖子”,“来宾用户”可以“查看帖子”。got?

理清了基本概念,我们回到神奇的srbac。它提供了一个GUI界面来控制rbac权限表。
看到role/task/operation了没?大善。
role中你可以看到有一个字段叫Bizrule,这就是角色的业务规则。
你可以这么写版主的规则

return in_array(Yii::app()->user->id, $params['board']->owner_ids);

然后这么写帖子创建者的规则:

return (Yii::app()->user->id==$params['post']->user_id);

这样就可以表示一个业务逻辑,判断它是否为真值,就可以得到是否属于这个角色。但这个$param参数是哪里来的捏?

在controller中这样判断:

$params=array('board'=>$board, 'post'=>$post);
if(Yii::app()->user->checkAccess('postManaging',$params))
{
    //管理这个帖子,上面的postManaging可以是task,也可以是operation
}

如果当前用户是版主,或是当前用户是这个帖子的创建者,那么这个用户都可以进入管理区。

还有一种比较傻瓜的判断方法,如果一个operation名字是PostDelete这样的命名的话,那可以利用这样的语句配置一下,然后当访问http://localhost/post/delete这个网址,就会自动进行权限验证。

public function filters()
{
return array(
'accessControl',
);
}

public function accessRules()
{
return array(
array('allow',
'actions'=>array('delete'),
'roles'=>array('admin'),
),
);
}

打完收功,特此记录。查srbac中有一列是data,这列拿来做什么用的有心情还可以再看看。

Yii初步整合UCenter

下午偷空做了Yii和UCenter的整合。我不得不说,UCenter的开发者太不负责了!

前置工作:安装好ucenter和yii。下载ucenter的php开发包

然后我就按他们的操作进行了。

复制一份接口开发手册里面的 client/ 目录到你程序的根目录下。
然后复制一份开发手册里面样例程序 examples/ 目录中的 api/ 子目录到你程序的根目录下。
如果您的应用程序的根目录有 config.inc.php 文件,在此文件里定义以 UC_ 开头的常量,具体常量内容可以参考手册中“了解 UCenter”章节。
此时,你需要在 UCenter 的“应用管理”->“+添加新应用”选择“自定义安装”,“接口 URL”填写你程序的 URL 地址,通信密钥可随意填写,如“12345”,“应用类型”选择“其他”,然后创建新应用,记录下新应用的 ID 。然后在 config.inc.php 中的 UC_APPID 常量填写新应用的 ID,UC_KEY 填写刚才填写的通信密钥“12345”。这时回到应用管理,如果此时提示此应用“通信成功”,说明您的准备工作已完成。如果你的程序的配置文件不是 config.inc.php 其自行修改代码 api/uc.php 中的内容。

继续阅读

CakePHP与Yii数据库效率简单对比

CakePHPYii都算不错的PHP开发框架了。目前CakePHP稳定版是1.2.5,而Yii最新的是1.1beta。

做了简单的对比。读取相同的机子,相同的数据表,MySQL,相同的记录。随机读取。循环1000次。
页面逻辑同样用到了route, layout, view。这样下来,CakePHP使用的时间是1.6秒左右,而Yii是0.7秒左右。

Yii胜出。

原因没有深究,大概是CakePHP多了一部分兼容1.1使用的逻辑,而且Yii用上了PDO的缘故吧。