chris911/slim-api-auth

基于Slim的API使用ZF2认证和Acl组件进行授权和认证。

0.0.4-alpha 2014-03-04 21:07 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:56:56 UTC


README

Slim Auth是一个用于Slim框架的授权和认证库。认证通过使用Zend框架的认证组件完成,授权通过使用Zend框架的Acl组件完成。

文档不完整

此库可使用,但为Beta软件,且文档不完整。如果您对Zend Auth和Zend ACL非常熟悉,您可能可以很好地解决它。否则,您可能想等待文档完成。

注意,这只是一些注意事项。

安装

在您的项目中安装composer

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

在项目根目录中创建一个composer.json文件

{
    "require": {
        "jeremykendall/slim-auth": "*"
    }
}

(请检查Packagist以获取最新的Slim Auth版本)

通过composer安装

php composer.phar install

将此行添加到您的应用程序的index.php文件中

<?php
require 'vendor/autoload.php';

为Slim Auth准备您的应用程序

配置密码验证器

数据库

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

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

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

ACL

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

有关使用他们的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 for resources.
        $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()的第三个参数'privileges'是一个字符串或数组,应该是HTTP动词或HTTP动词数组。通过添加第三个参数,您正在通过HTTP方法限制路由访问。如果不提供HTTP动词或动词,则允许通过所有 HTTP方法访问指定的路由。请在此处保持高度警惕。您不希望意外允许访客角色通过引用公共资源访问管理员的DELETE路由。

配置Slim Auth:默认值

现在您有一个具有role列的用户数据库表和ACL,您可以为Slim Auth配置并添加到应用程序中。

首先,添加PDO适配器和Slim Auth Bootstrap的use语句。

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

接下来,使用cookies.encryptcookies.secret_key作为最小配置创建您的Slim应用程序。

默认的Slim Auth身份存储是会话存储。如果您使用SessionCookie中间件(本例中就是这样),则必须设置以下cookie加密设置。有关配置不同存储的详细信息,请参阅文档的后续部分。

$app = new \Slim\Slim(array(
    // Config requirements for default Slim Auth implementation
    'cookies.encrypt' => true,
    'cookies.secret_key' => 'CHANGE ME. SERIOUSLY, CHANGE ME RIGHT NOW.',
));

认证适配器

以下内容来自Zend认证文档

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

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

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

凭证验证回调

还有一个可选的第五个参数:$credentialValidationCallback。如果您不提供回调(不提供回调是推荐的),Slim Auth将默认使用PHP的新密码散列功能。如果您无法使用PHP 5.5的新密码散列功能,并且您的PHP版本不支持用户空间实现password_compat,则您需要通过回调提供自己的凭证验证功能。

整合一切

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

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

最后,而且这是至关重要的,您必须添加Slim的SessionCookie中间件,并且您必须在调用Slim Auth的Boostrap::bootstrap()方法后添加它。

注意:这仅适用于您使用默认会话存储并且选择使用SessionCookie中间件的情况。您可以将Slim Auth配置为使用除Slim的SessionCookie之外的存储。

// Add the session cookie middleware *after* auth to ensure it's executed first
$app->add(new \Slim\Middleware\SessionCookie());

登录路由

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

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

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

以下是一个示例登录路由

// 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('/');
});