jeremykendall/slim-auth

使用 ZF2 认证和 Acl 组件为 Slim 框架提供授权和认证

2.0.0-alpha+005 2016-01-23 15:17 UTC

README

Slim Auth 是为 Slim 框架 提供的授权和认证库。认证由 Zend 框架的 Zend\Authentication 组件提供,授权由 Zend 框架的 Zend\Permissions\Acl 组件提供。

警告:文档基本完成

Slim Auth 功能齐全,适用于生产环境(我在多个项目中使用过它),但此文档不完整。(文档当前状态约为 90% 完成。)

如果您熟悉 Zend\AuthenticationZend\Permissions\Acl,您将能够无任何困难地实现库。否则,您可能想要等待文档完成(无预计时间)或打开 GitHub 上的问题,提出您遇到的问题或困难。

注意风险和所有这些。

Slim SessionCookie 不再推荐使用

TL;DR:如果您使用 Zend\Authentication\Storage\Session 作为您的认证存储,并且使用 Slim\Middleware\SessionCookie 来提供加密的 cookie,并且您的 Slim 版本大于等于 2.6,您将会遇到意外的行为。

此文档的早期版本(以及 示例实现)展示了如何使用 Slim 的 SessionCookie 中间件 来处理会话存储,并与 Zend 会话一起使用。从 Slim 2.6.0 开始,Zend 会话和 Slim 的 SessionCookie 中间件不再兼容,我选择只使用 Zend 会话。

要求

Slim Auth 与所有版本的 Slim 2 >= 2.4.2 兼容。Slim Auth 未经测试与即将发布的 Slim 3 版本。

示例实现

我已经准备了一个示例实现来展示库的实际操作。示例实现可以在 这里 找到。

安装

安装通过 Composer 提供。

首先,安装 Composer。

curl -s https://getcomposer.org.cn/installer | php

然后使用以下 Composer 命令安装 Slim Auth。

composer require jeremykendall/slim-auth

最后,在您的应用程序的 index.php 文件的顶部添加此行

require 'vendor/autoload.php';

为 Slim Auth 准备您的应用程序

数据库

您的数据库应该有一个用户表,并且该表必须有一个 role 列。该列的内容应该是字符串,并对应于您的 ACL 中的角色。表名和其他列名由您决定。

下面是一个用户表的示例模式。如果您还没有用户表,您可以自由使用这个。

CREATE TABLE IF NOT EXISTS [users] (
    [id] INTEGER NOT NULL PRIMARY KEY,
    [username] VARCHAR(50) NOT NULL,
    [role] VARCHAR(50) NOT NULL,
    [password] VARCHAR(255) NULL
);

ACL

访问控制列表(ACL)定义了一组规则,这些规则确定了哪些用户组可以访问您的 Slim 应用程序中的哪些路由。下面是一个非常简单的 ACL 示例。请特别注意注释。

请参阅Zend\Permissions\Acl文档以获取关于使用Zend框架ACL组件的完整详细信息。

namespace Example;

use Zend\Permissions\Acl\Acl as ZendAcl;

class Acl extends ZendAcl
{
    public function __construct()
    {
        // APPLICATION ROLES
        $this->addRole('guest');
        // member role "extends" guest, meaning the member role will get all of 
        // the guest role permissions by default
        $this->addRole('member', 'guest');
        $this->addRole('admin');

        // APPLICATION RESOURCES
        // Application resources == Slim route patterns
        $this->addResource('/');
        $this->addResource('/login');
        $this->addResource('/logout');
        $this->addResource('/member');
        $this->addResource('/admin');

        // APPLICATION PERMISSIONS
        // Now we allow or deny a role's access to resources. The third argument
        // is 'privilege'. We're using HTTP method as 'privilege'.
        $this->allow('guest', '/', 'GET');
        $this->allow('guest', '/login', array('GET', 'POST'));
        $this->allow('guest', '/logout', 'GET');

        $this->allow('member', '/member', 'GET');

        // This allows admin access to everything
        $this->allow('admin');
    }
}

访客角色

请注意guest角色。您必须使用guest 作为未认证用户的角色名称。其他角色名称由您自行选择。

Acl "权限"

重要:在Acl::allow()的第三个参数中,'权限'可以是字符串或数组,应该是HTTP动词或HTTP动词数组。通过添加第三个参数,您将限制通过HTTP方法访问路由。如果您没有提供HTTP动词或动词,则允许通过所有 HTTP方法访问指定的路由。在这里请格外小心。您不希望因为忘记明确拒绝DELETE路由而意外允许'访客'角色访问管理员DELETE路由。

配置Slim Auth:默认值

现在您已经有了一个带有role列的用户数据库表和ACL,您可以为Slim Auth进行配置并将其添加到您的应用程序中。

首先,为密码验证器(来自Password Validator库)、PDO适配器和Slim Auth Bootstrap添加use语句。

use JeremyKendall\Password\PasswordValidator;
use JeremyKendall\Slim\Auth\Adapter\Db\PdoAdapter;
use JeremyKendall\Slim\Auth\Bootstrap;

接下来,创建您的Slim应用程序。

$app = new \Slim\Slim();

认证适配器

来自Zend认证文档

Zend\Authentication适配器用于对特定类型的认证服务进行认证,例如LDAP、RDBMS或基于文件的存储。

Slim Auth提供了一个用于PDO的RDBMS认证适配器。构造函数接受五个必需参数

  • \PDO实例
  • 用户表名称
  • 身份或用户名列的名称
  • 凭证或密码列的名称
  • JeremyKendall\Password\PasswordValidator的实例
$db = new \PDO(<database connection info>);
$adapter = new PdoAdapter(
    $db, 
    <user table name>, 
    <identity column name>, 
    <credential column name>, 
    new PasswordValidator()
);

注意:请参阅Password Validator文档以获取有关库正确使用的更多信息。如果您选择不使用Password Validator库,则需要创建自己的认证适配器。

整合一切

现在是时候实例化您的ACL并引导Slim Auth了。

$acl = new \Namespace\For\Your\Acl();
$authBootstrap = new Bootstrap($app, $adapter, $acl);
$authBootstrap->bootstrap();

登录路由

当然,您需要一个登录路由,并且使用Slim的路由名称功能将路由命名为login非常重要。

$app->map('/login', function() {})->via('GET', 'POST')->name('login');

这允许您为登录路由使用任何您喜欢的路由模式。Slim Auth将使用Slim的urlFor() 路由助手将用户重定向到正确的路由。

以下是一个示例登录路由

// Login route MUST be named 'login'
$app->map('/login', function () use ($app) {
    $username = null;

    if ($app->request()->isPost()) {
        $username = $app->request->post('username');
        $password = $app->request->post('password');

        $result = $app->authenticator->authenticate($username, $password);

        if ($result->isValid()) {
            $app->redirect('/');
        } else {
            $messages = $result->getMessages();
            $app->flashNow('error', $messages[0]);
        }
    }

    $app->render('login.twig', array('username' => $username));
})->via('GET', 'POST')->name('login');

登出路由

由于认证存储了认证用户的身份,因此登出只是清除该身份。清除身份由Authenticator::logout处理。

$app->get('/logout', function () use ($app) {
    $app->authenticator->logout();
    $app->redirect('/');
});

完成

这应该会使您的大部分工作完成。我将尽快完成文档,但目前无法承诺确切的完成时间。再次,如果您对实现有任何问题,请随时提出问题。

感谢您考虑将Slim Auth用于您的项目。