deisss/slim-auth

PHP Slim 框架的抽象 HTTP Basic Auth 中间件,提供简单的自定义数据库模式,以及 URL 转义的可能性

1.0.0 2014-03-08 19:55 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:24:25 UTC


README

简单的,同时强大的 PHP Slim 框架中间件认证。

原理

我们尝试使此系统尽可能简单。因此,我们提供了两个部分——极其简单——的认证

  • 我们负责认证过程,使用 HTTP Basic Auth,
  • 你扩展此抽象类,以向其中添加你的登录/业务逻辑。

最后,你将扩展的类连接到 Slim,我们就完成了。

安装

系统使用 composer 作为主要的交付系统,使用 composer.json

{
    "require": {
        "deisss/slim-auth": "1.*"
    }
}

通过命令行重新编译 composer composer update

使用方法

登录逻辑可以与每个系统都不同(如无状态、基于会话、基于 Facebook),我们决定有必要提供一个系统,你可以将其逻辑添加到其中。抽象认证类是实现此目标并保持一切简单化的最佳方式。因此,由于它是抽象的,你需要创建自己的具体类

<?php
namespace Slim\Extras\Middleware;
use Slim\Extras\Middleware\AbstractHTTPBasicAuth as AbstractHTTPBasicAuth;

/**
 * Our concrete authentification implementation
*/
class HTTPBasicAuth extends AbstractHTTPBasicAuth {
    /**
     * Constructor
     *
     * @param array $skipUrl Any revelant path to skip authentification check
    */
    public function __construct($skipUrl = null) {
        $this->setSkip($skipUrl);
    }

    /**
     * The function to handle the database/session/facebook check
     *
     * @param string $login The login supply by user
     * @param string $password The password supply by user
     * @param string $path The url user try to access
     * @return Any value 'null' for php empty function will be consider
     *         as a fail (and yet be refused), any non-empty value
     *         will be accepted
    */
    protected function getUserFromLogin($login, $password, $path) {
        // Your database/session check here

        // Any non-empty/false value will be consider as 'ok', we
        // recommand to send back full user object (as you can recover it later into route function - see below)
        return true;
    }
}
?>

现在这个类已经创建(我们考虑文件名作为 HTTPBasicAuth.php,我们可以使用它

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

$app = new \Slim\Slim();
$app->add(new \Slim\Extras\Middleware\HTTPBasicAuth(array(
    '/hello/:name'
)));
$app->get('/hello/:name', function ($name) use ($app) {
    echo 'Hello '.$name;
});
$app->get('/logged', function() use ($app) {
    $userFromAuth = $app->request()->headers('auth');
    // Same
    $userFromAuth = $app->request()->headers('user');
});

$app->run();
?>

这里我们展示了一个完整示例,其中我们跳过了对 /hello/:name 路径的认证(正如你所见,跳过处理与 Slim 相同的变量系统)。而对于 /logged 路径,我们从 getUserFromLogin 获取用户认证结果(因此,$userFromAuth === true)。当然,你可以返回对象而不是布尔值,从 getUserFromLogin 获取完整用户!

此外

我们没有提供任何 ACL 系统,但根据 Slim 的行为,使用路由中间件可以相当简单(注意:我们考虑与上述相同的示例)

<?php
function isAdministrator() {
    $app = \Slim\Slim::getInstance();

    // userFromAuth is now a $_SESSION array instead of boolean value
    $userFromAuth = $app->request()->headers('auth');

    // We test, and refuse if the role is not OK
    if($userFromAuth['role'] != 'administrator') {
        $app->status(403);
        $app->stop();
    }
}

$app->get('/this-is-acl', 'isAdministrator', function() {
});
?>

正如你所见,ACL 也以快速和简单的方式处理,这仅仅是因为一个简单的事实:'全局'中间件是在'路由'中间件之前执行的,这使得我们能够在'路由'中间件中已经了解有关用户的所有信息。

许可证

简单的 MIT 许可证,希望你喜欢!