yidas/yii2-access-router

Yii 2 用户认证与授权路由器

安装次数: 103

依赖者: 0

建议者: 0

安全性: 0

星标: 3

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

1.0.1 2018-11-22 06:19 UTC

This package is auto-updated.

Last update: 2024-08-29 04:43:12 UTC


README

   

Yii 2 Access Router


Yii 2 用户认证与授权路由器

Latest Stable Version Latest Unstable Version License

特性

  • Yii 2 路由级别的用户认证/授权集成

  • 通过访问令牌支持的RESTful API认证

  • 通过访问令牌支持的HTTP请求登录

Access Router是一个简单的用户访问过滤器,支持在路由级别进行认证和授权。与Yii2 Access Control Filter (ACF)不同,此用户授权可以指定路由,而不仅仅是控制器-操作级别。

概要

要求

此库需要以下内容

  • PHP 5.4.0+
  • Yii 2.0.0+

安装

在您的Yii2项目中通过Composer安装

composer require yidas/yii2-access-router

配置

设置一个Access Router组件,然后将其添加到您的应用程序配置的bootstrap中

return [
    'bootstrap' => ['log', 'access'],
    'components' => [
        'access' => [
            'class' => 'yidas\filters\AccessRouter',
            'except' => ['site/login', 'site/register'],
            'denyCallback' => function() {
                return Yii::$app->response->redirect(['/site/login']);
            },
        ],
        // ...
    ],
    // ...
];
  1. 创建一个名为access的组件,该组件使用yidas\filters\AccessRouter作为类并带有配置。

  2. 将此access组件添加到bootstrap列表中。

选项

使用方法

除外

Access Router实现了对必须登录的用户才能通过除指定路由外的任何路由的访问控制过滤器(ACF)。

您可以设置除外的路由以跳过用户授权。带有[*]值的except设置表示禁用用户授权

'access' => [
    'class' => 'yidas\filters\AccessRouter',
    'except' => ['site/login'], //`site/login` is the login page which can not bypass user authorization
],

HTTP认证

Access Router支持通过HTTP身份验证和带令牌的HTTP GET/POST参数自动认证客户端请求,您可以通过设置httpAuth配置来启用它

'access' => [
    'class' => 'yidas\filters\AccessRouter',
    'except' => ['site/login', 'site/register'],
    'httpAuth' => [
        'enable' => true,
        'denyCallback' => function() {
            $response = Yii::$app->response;
            $response->statusCode = 401;
            $response->format = \yii\web\Response::FORMAT_JSON;
            $response->data = ['message' => 'Access Denied'];
            return $response->send();
        },
    ],
],

HTTP认证登录将禁用一次性的会话访问,相当于\Yii::$app->user->enableSession = false;

选项

请求方法登录

Access Router还支持通过提供访问令牌自动登录客户端请求,您可以通过设置httpLogin配置来启用它

'access' => [
    'class' => 'yidas\filters\AccessRouter',
    'except' => ['site/login', 'site/register'],
    'httpLogin' => [
        'enable' => true,
        'method' => 'post'
        'only' => ['site/login'],
        // 'key' => 'access_token',
    ],
],

对于上述配置,您可以通过访问路由site/login并带有正确的access_token体值(Content-Type: application/x-www-form-urlencoded)进行登录。

请求方法登录与表单登录相同,会话是启用的,持续时间可以自定义。

对于GET方法,如果您设置'method' => 'get''only' => ['*'],则可以通过任何路由使用正确的access_token参数进行登录。例如://example.com/?access_token={有效的用户访问令牌}

出于安全原因,不建议使用在参数中传递访问令牌的GET方法。

选项

没有CSRF的POST方法

如果您使用post方法并希望禁用全局CSRF验证,您可以将request配置中的enableCsrfValidation设置为false

'components' => [
    'request' => [
        'csrfParam' => '_csrf-backend',
        'enableCsrfValidation' => false,
    ],

如果您只想禁用某些控制器/操作的CSRF,可以动态地为控制器设置enableCsrfValidation

附加

全局ACF

如果您想使用原始的 Yii 2 访问控制过滤器(ACF)用于全局路由,而不是使用访问路由器的用户授权,只需取消注释访问路由器的 except,并将 ACF 规则添加到配置中的 'as beforeRequest'。

'bootstrap' => ['log', 'access'],
'components' => [
    'access' => [
        'class' => 'yidas\filters\AccessRouter',
        'except' => ['*'], // Equal to comment out
    ],
    // ...
],
'as beforeRequest' => [
    'class' => 'yii\filters\AccessControl',
    'rules' => [
        [
            'allow' => true,
            'actions' => ['login'],
        ],
        [
            'allow' => true,
            'roles' => ['@'],
        ],
    ],
    'denyCallback' => function () {
        return Yii::$app->response->redirect(['site/login']);
    },
],

注意:ACF 只能定义 actions,而不能定义路由,这些操作可以被每个控制器应用。

对于上述设置示例,login 排除的操作可以被任何控制器匹配,例如 site/logincontroller/login

参考

Yii 2 - 应用结构 > 应用事件

RFC7617 - 'Basic' HTTP 认证方案