如果您正在构建 CMS,您可能需要具有不同权限级别的不同用户角色(超级用户、管理员、用户)。代码太复杂?输入 CakePHP 的 ACL(访问控制列表)。通过正确的设置,您只需一行即可检查用户权限。
简介:什么是访问控制列表?
ACL 允许您创建具有各自角色的用户层次结构。这是一个简单的示例。
- 超级用户
- 用户 #1
- 管理员
- 用户#2
- 用户#3
- 用户
- 用户#4
- 用户#5
- 用户#6
- ...
在本教程中,我们将为一个简单的博客设置 ACL。如果您尚未在 Nettuts+ 上查看 CakePHP 入门(和第 2 部分),请查看后返回,因为我们将理所当然地认为框架基础知识。
通过这个层次结构,我们可以为每个角色分配多个权限:
- 超级用户可以创建、阅读、更新和删除帖子和用户。
- 管理员可以创建、阅读、更新和删除帖子。
- 用户可以创建和阅读帖子。
- 其他人都可以阅读帖子。
每个权限都会授予组,而不是用户;因此,如果用户 #6 晋升为管理员,系统将检查他的组权限——而不是他的权限。这些角色和子节点(用户)称为访问请求对象,或 ARO。
现在,在另一边,我们有了访问控制对象(ACO)。这些都是要控制的对象。上面我提到了帖子和用户。通常,这些对象与模型直接链接,因此如果我们有一个 Post 模型,我们将需要该模型的 ACO。
每个ACO都有四种基本权限:创建、读取、更新和删除。您可以使用关键字 CRUD 来记住它们。还有第五个权限,即星号,它是完全访问权限的快捷方式。
在本教程中,我们将仅使用两个 ACO:Post 和 User,但您可以根据需要创建任意多个 ACO。
ACL 表
让我们继续创建数据库表。您可以在应用程序的 config/sql
目录中的 db_acl.sql
中找到此代码。
CREATE TABLE acos (
id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INTEGER(10) DEFAULT NULL,
model VARCHAR(255) DEFAULT '',
foreign_key INTEGER(10) UNSIGNED DEFAULT NULL,
alias VARCHAR(255) DEFAULT '',
lft INTEGER(10) DEFAULT NULL,
rght INTEGER(10) DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE aros_acos (
id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
aro_id INTEGER(10) UNSIGNED NOT NULL,
aco_id INTEGER(10) UNSIGNED NOT NULL,
_create CHAR(2) NOT NULL DEFAULT 0,
_read CHAR(2) NOT NULL DEFAULT 0,
_update CHAR(2) NOT NULL DEFAULT 0,
_delete CHAR(2) NOT NULL DEFAULT 0,
PRIMARY KEY(id)
);
CREATE TABLE aros (
id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INTEGER(10) DEFAULT NULL,
model VARCHAR(255) DEFAULT '',
foreign_key INTEGER(10) UNSIGNED DEFAULT NULL,
alias VARCHAR(255) DEFAULT '',
lft INTEGER(10) DEFAULT NULL,
rght INTEGER(10) DEFAULT NULL,
PRIMARY KEY (id)
);
登录后复制
我们现在可以开始创建 ARO 和 ACO 节点,但是嘿,我们没有用户!我们必须创建一个基本的身份验证系统。
第 1 步:基本身份验证系统
由于本教程面向具有基本到中等框架知识的 CakePHP 开发人员,因此我将提供代码和简要说明。但是,身份验证系统不是本教程的目标。
MySQL 表:
CREATE TABLE users (
id INTEGER(10) UNSIGNED AUTO_INCREMENT KEY,
username TEXT,
password TEXT
);
登录后复制
用户模型 (models/user.php
)
登录后复制
用户控制器 (controllers/users_controller.php
)