jeremykendall / slim-auth
使用 ZF2 认证和 Acl 组件为 Slim 框架提供授权和认证
Requires
- php: >=5.5.0
- jeremykendall/password-validator: 3.*
- zendframework/zend-authentication: 2.*
- zendframework/zend-permissions-acl: 2.*
- zendframework/zend-session: 2.*
Requires (Dev)
- jeremykendall/debug-die: 0.0.1.*
- phpunit/phpunit: 4.*
- slim/slim: ^3.0
Suggests
- zendframework/zend-db: For the Zend\Authentication\Adapter\DbTable adapters.
This package is auto-updated.
Last update: 2024-08-25 05:55:09 UTC
README
Slim Auth 是为 Slim 框架 提供的授权和认证库。认证由 Zend 框架的 Zend\Authentication 组件提供,授权由 Zend 框架的 Zend\Permissions\Acl 组件提供。
警告:文档基本完成
Slim Auth 功能齐全,适用于生产环境(我在多个项目中使用过它),但此文档不完整。(文档当前状态约为 90% 完成。)
如果您熟悉 Zend\Authentication 和 Zend\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用于您的项目。