IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Open source  >

使用 CakePHP 快速打造 Web 站点,第 2 部分: 用 CakePHP 打造更大更好的站点

developerWorks
前一页第 5 页,共 14 页后一页

文档选项

样例代码


对本教程的评价

帮助我们改进这些内容


访问控制列表

到目前为止,Tor 在访问方面还是十分开放的。例如,任何人都可以添加、编辑或删除产品等等。现在需要对访问进行限制。为了实现访问控制,我们将使用 CakePHP 的访问控制列表(Access Control List,ACL)功能。

什么是 ACL?

ACL 其实是一个权限列表。这就是 ACL 的全部内容。它不是执行用户身份验证的方法,也不是解决 PHP 安全问题的灵丹妙药。ACL 只是一个指定操作者能执行哪些操作的列表。

操作者 通常是用户,但也可以是控制器之类的组件。操作者 被称为访问请求对象(Access Request Object,ARO)。这里所说的操作 通常将意味着 “执行某些代码”。操作 被称为访问控制对象(access-control object,ACO)。

因此,ACL 是一个 ARO 及它们可以访问的 ACO 的列表。很简单,是不是?它应当是很简单的,但实际上它并不简单。

“指定操作者能执行哪些操作的列表” 这个定义确实很简单,但是实际过程涉及许多三个字母的缩写词(TLA),所以可能把人弄糊涂。但是示例会帮助您。

想象在某个夜总会中正在举办一个派对,宾客云集。派对分为几个部分 — 有 VIP 休息室、舞池和主吧台。当然,很多人等着进入夜总会。门口有身形魁梧的保镖检查来宾的 ID,他们查看名单,然后,或者拒绝来宾进入夜总会,或者让其参加仅对受邀者开放的派对部分。

那些来宾就是 ARO。他们请求访问派对的不同部分。VIP 休息室、舞池和主吧台全都是 ACO。ACL 是门口身形魁梧的保镖手中的名单。身形魁梧的保镖就是 CakePHP。





回页首


创建 ACL 表

在 CakePHP V1.1 中,ACL 管理的运行方式与 Bake 一样,要通过一个直接调用的 PHP 脚本。在 CakePHP V1.2 中,ACL 管理功能已经转移到了 Cake Console 中。可以使用 Cake Console 设置一个用来存储 ACL 信息的数据库表。在 /webroot/app 目录中,从命令行运行以下命令:../cake/console/cake acl initdb。Cake Console 告诉您它已经建立了三个数据库(见图 6):acos、aros 和 aros_acos。


图 6. ACL shell 输出
ACL shell 输出

这就是开始时需要执行的所有操作。现在开始定义 ARO 和 ACO。





回页首


定义 ARO

现在有了 ACL 数据库表,并有了一个允许用户自己注册的应用程序。如何为用户创建 ARO 呢?

将此组件添加到应用程序的注册部分会更有意义。这样,当新用户注册时,系统会为其自动创建对应的 ARO。这意味着必须为已创建的用户手工创建几个 ARO,但是 CakePHP 还是能让您轻松完成这个任务。





回页首


定义组

在 CakePHP(通常是在使用 ACL 时)中,可以为了分配或撤消权限而将用户指定给组。因为无需处理单个用户权限(这在应用程序有多个用户时会变成一项艰巨的任务),这可以极大地简化权限管理任务。

对于 Tor,将定义两个组。第一个组(称为 Users)将包含仅仅注册了帐户的所有人。第二个组(称为 Dealers)将用于在 Tor 内将额外权限授予特定用户。

将使用 Cake Console 创建这两个组,操作与创建 ACL 数据库十分类似。为了创建组,需要在 /webroot/app 目录中执行以下命令。

php acl.php create aro 0 null Users
php acl.php create aro 0 null Dealers

在执行每个命令之后,Cake Console 应当会显示一个消息,指出 ARO 已经创建。

New Aro 'Users' created.
New Aro 'Dealers' created.

传入的参数(例如,'root Users')是 parent 和 node。parent 参数是 ARO 应该属于的一个组。因为这些组处于顶层,所以传递 root。node 参数是用来引用这个组的字符串。





回页首


在注册部分中添加创建 ARO 的过程

在 Tor 的用户注册部分中添加创建 ARO 的过程并不难。只需包含正确的组件并添加几行代码。回忆一下,users_controller.php 中的注册函数应当类似于清单 10。


清单 10. 原来的 register 操作
                    
    function register()
    {
if (!empty($this->data))
{
$this->data['User']['password'] = md5($this->data['User']
			      ['password']);
if ($this->User->save($this->data))
{
$this->Session->setFlash('Your registration information 
				   was accepted');
$this->Session->write('user', $this->data['User']
				   ['username']);
$this->redirect(array('action' => 'index'), null, true);
} else {
$this->data['User']['password'] = '';
$this->Session->setFlash('There was a problem saving 
				  this information');
}
}
    }

为了开始使用 CakePHP 的 ACL 组件,需要包含该组件作为一个类变量。


清单 11. 包含组件作为一个类变量
                    
<?php
class UsersController extends AppController
{
  var $components = array('Acl');
  ...

$components 数组仅包含要使用的 CakePHP 组件的列表(按名称)。组件对于控制器的作用就如同 helper 对视图的作用。还有其他组件可用,例如将在后续教程中介绍的安全性组件。在本例中,只需要 ACL 组件。

现在您可以访问 ACL 组件提供的所有功能。创建 ARO 的方法是调用 ACL 的 ARO 对象上的 create(见清单 12)。这个方法接受的参数与从模型调用 create 方法时传递的参数相同,这两种方式本质上是相同的。在本例中,指定别名(用户名)、ACL 指向的模型(user)、记录的 foreign_key(新用户的 ID)和 parent_id(父节点的 ID,在这里是 Users ARO 组,是用下面的 findByAlias 行找到的)。要为用户创建 ARO,还需要知道保存用户后用户的 ID 是什么。当数据被保存后,可以通过 $this->User->id 来获取此信息。

register 函数现在可能类似于清单 12。


清单 12. register 函数
                    
    function register()
    {
if (!empty($this->data))
{
$this->data['User']['password'] = md5($this->data['User']
			['password']);
if ($this->User->save($this->data))
{
$this->Session->setFlash('Your registration information 
				  was accepted');
$this->Session->write('user', $this->data['User']['username']);
$parent = $this->Acl->Aro->findByAlias('Users');
$this->Acl->Aro->create(array(
    'alias' => $this->data['User']['username'],
    'model' => 'User',
    'foreign_key' => $this->User->id,
    'parent_id' => $parent['Aro']['id'])
);
$this->Acl->Aro->save();
$this->redirect(array('action' => 'index'), null, true);
} else {
$this->data['User']['password'] = '';
$this->Session->setFlash('There was a problem saving 
				  this information');
}
}
    }

您会注意到,在数据成功保存之前,不会创建 ARO。

试运行

这就是设置 ARO 并运行所需的全部操作。为了进行检验,请返回 webroot/app 目录并使用 Cake Console 查看 ARO 树:../cake/console/cake acl view aro。输出应当类似于图 7。


图 7. ACL shell view aro 对空列表的输出
ACL shell view aro 对空列表的输出

现在访问 http://localhost/users/register,并注册一个新用户。完成后,重新运行 ../cake/console/cake acl view aro 命令。输出应当类似于图 8。


图 8. ACL shell view aro 对一个用户的输出
ACL shell view aro 对一个用户的输出

从现在开始,只要有人注册新帐户,系统就会自动地为他创建一个 ARO。这个 ARO 将属于组 Users。





回页首


为现有用户创建 ARO

新的 Tor 用户已经能够创建自己的 ARO,现在需要为现有用户创建 ARO。按照与创建组几乎完全相同的方法,用 Cake Console 执行此操作。首先,使用刚创建的用户访问 http://localhost/users/knownusers 以获取已创建的用户的列表。


图 9. 现有用户列表
现有用户列表

然后,对于每个用户,需要像创建组一样执行 create aro 命令。对于 parent,指定 'Users'。对于 node,指定用户名。例如,要为图 9 中的 dentarthurdent 创建 ARO,应该执行以下命令(同样从 /webroot/app 目录执行):../cake/console/cake acl create aro Users dentarthurdent

确保对 knownusers 列表中的每个用户运行这些命令,但是在用户注册过程中为测试 ARO 创建功能而创建的用户除外。确保为每个用户指定正确的用户 ID 和用户名。完成后,../cake/console/cake acl 的结果应当类似于图 10。


图 10. ACL shell aro 的输出
ACL shell aro 的输出

通过在命令行中运行 ../cake/console/cake acl help,可以了解 Cake Console 能够执行的其他 ACL 功能。





回页首



前一页第 5 页,共 14 页后一页
    关于 IBM 隐私条约 联系 IBM 使用条款