CakePHP 身份验证组件揭秘 - 第 1 部分
如何设置基本身份验证系统。 完整教程 在当今的互联网时代,大多数 Web 开发人员都试图为其 Web 应用程序中的 Web 客户端提供基于登录/注册的功能。 通常,这种类型的功能仅在您希望对用户进行分类时才需要,一个常见的例子是访客用户和注册用户。 访客用户只能访问 Web 应用程序上的较少内容,而注册用户则享有更多特权。 在 CakePHP 中,此属性主要通过该框架的 Auth 组件实现。 Auth 组件功能强大且健壮,可以根据 Web 应用程序的需要进行自定义。 Auth 组件允许您快速设置应用程序中的安全区域。 在本系列中,我们将构建一个复杂的身份验证系统。 由于这是本系列的第 1 部分,也是开始部分,因此在本部分中,我们将实现一个非常基本但完全有效的身份验证方案。
准备就绪
首先,我们需要在我们的数据库中创建一个用户表来存储用户名和密码(用户的密码哈希版本)。 此哈希由 Auth 组件使用其方法 hashPasswords() 自动完成,当它在 $data 中找到密码时。
运行以下 SQL 来创建用户表。
CREATE TABLE `users` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL,
`password` CHAR(40) NOT NULL,
PRIMARY KEY(`id`)
);
我们将在这篇文章中创建的所有文件的列表。
- AppController.php 位于 /app/ 文件夹中
- UsersController.php 位于 /app/controllers/ 文件夹中
- login.ctp 位于 /app/views/users/ 文件夹中
- signup.ctp 位于 /app/views/users/ 文件夹中
> <h3>AppController.php 文件< h3> 此文件主要包含所有控制器使用的全局数据,在我们的示例中,我们只有一个用户控制器。 此文件将包含以下代码。
<?php
class AppController extends Controller {
var $components = array('Session','Auth');
var $helpers=array('Session');
}
?>
解释
它有两个变量,一个是 $components,另一个是 $helpers。 $components 变量包含所有控制器使用的所有组件,因此我们指定了 Auth 组件。 Session 组件和 Session 帮助程序基本上用于设置会话消息,并在视图中分别显示这些消息。
UsersController.php 文件
这是我们逻辑的核心。 它包含登录、注册和注销的功能。 此文件的内容是……
<?php
class UsersController extends AppController {
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('signup');
}
function login() {}
function logout()
{
$this->Session->setFlash('You are logged out!');
$this->redirect($this->Auth->logout());
}
function signup()
{
if (!empty($this->data)) {
$this->User->create();
if ($this->User->save($this->data)) {
$this->Session->setFlash('User saved!');
$this->redirect(array('action'=>'login'));
}
else {
$this->Session->setFlash('User not saved! There were some errors. Please rectify them and retry.');
}
}
}
}
?>
解释
首先,由于它继承自 AppController,它将默认加载 Auth 组件,该组件将处理客户端的所有请求。 Auth 组件只允许访问登录函数,因此要访问 signup() 以添加新用户,我们需要使用 beforeFilter() 向 Auth 组件发出指令,允许 signup()。 这里要学习的主要内容是在 Auth 组件开始工作之前调用 beforeFilter()。 在这里,我们使用 `parent::beforeFilter();` 调用用户控制器的两个 beforeFilters,另一个是应用程序控制器的 beforeFilters。
第二个函数是 login(),它基本上是在您将 ` http://www.your_domain_name.com/users/login/` 放入浏览器 URL 或尝试访问应用程序的受限区域时调用的。 当您通过 `login.ctp` 文件(此登录函数的视图文件)提交数据时,Auth 组件开始工作。 首先,它对 $data 的密码字段进行哈希处理,并将此 $data 变量传递给 Users 模型。 然后,模型检查并向控制器返回结果。 如果找到有效的用户,Auth 会将其添加到会话中,并授予其访问所有授权函数的权限,这些函数由 isAuthorized() 检查。 但是,如果它发现无效用户,它会重定向回 `login()`。
第三个函数是 logout(),在此函数中,我们设置会话的闪存消息,让用户知道他/她已注销。 在此函数的第二行,我们调用控制器的 redirect 方法,该方法接收来自 `$this->Auth->logout()` 的参数,该参数是一个包含登录方法 URL 的字符串。
我们最后的方法是 signup(),这是为了添加新用户而创建的。 在这里,我们使用 User 模型的 create() 和 save() 方法。 Create 方法初始化模型以写入新记录,加载未在 $data 中定义的那些字段的默认值,并清除先前的验证错误。 对于在循环中保存数据特别有用。 Save 方法将模型数据(基于白名单,如果提供)保存到数据库。 默认情况下,在保存之前会发生验证。
login.ctp 文件
它包含表示代码。 代码是…
<?php
echo $this->Form->create(array('action'=>'login));
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->end('Login');
?>
解释
此视图文件利用 Form 帮助程序来创建表单元素。
signup.ctp 文件
它也包含表示代码。 在这里,我们有一个表单,因此用户可以提交它与数据以创建新用户……
<?php
echo $this->Form->create(array('action'=>'signup));
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->end('Signup');
?>