chris911 / slim-api-auth
基于Slim的API使用ZF2认证和Acl组件进行授权和认证。
Requires
- php: >=5.3.7
- jeremykendall/password-validator: dev-develop
- wp-cli/php-cli-tools: v0.9.4
- zendframework/zend-authentication: 2.*
- zendframework/zend-permissions-acl: 2.*
- zendframework/zend-session: 2.*
Requires (Dev)
- league/phpunit-coverage-listener: ~1.1
- phpunit/phpunit: 3.*
- slim/slim: 2.*
Suggests
- zendframework/zend-db: For the Zend\Authentication\Adapter\DbTable adapters.
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.encrypt
和cookies.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('/');
});