Hugh's Blog

Yii2 访问控制过滤器

Yii2 提供了两种授权访问方式:Access Control Filter(ACF) 和 Role-Based Access Control(RBAC,基于角色的访问授权)。

下面对 ACF 作个简单的记录。

例如在默认的 SiteController 有个 behaviors 方法,里面定义了多条 rules ,ACF 会逐条检查,直到匹配。

use yii\web\Controller;
use yii\filters\AccessControl;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['login', 'logout', 'signup'],    // 指 ACF 只应用到以下 actions 中
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['login', 'signup'],
                        'roles' => ['?'],   // ?指规则适用于游客
                    ],
                    [
                        'allow' => true,
                        'actions' => ['logout'],
                        'roles' => ['@'],   // @指规则适用于已认证的用户
                    ],
                ],
            ],
        ];
    }
    // ...
}

上面是官方文档的例子,一般来说 rules 还有其他选项可以设置。

allow 指定规则是 allow 还是 deny。

actions 指定规则适用于哪几个 actions。这应该是一个 action IDs 数组。区分大小写。如果为空或者没有设置的话,指应用到所有 actions。

controllers 基本与 actions 类似。

roles 指定规则适用于哪些用户角色,有两个用户角色可用作识别,可通过 yii\web\User::$isGuest 来检查。? 指游客 (未认证);@ 指已认证的用户。如果为空或者没有设置的话,则匹配所有用户。

ips 指定规则匹配哪些客户端 ip,ip 地址可以使用通配符 *,例如:192.168.*。为空或者没有设置的话,则匹配所有。

berbs 指定规则匹配哪些请求方式 (例如:GET,POST),区分大小写。

matchCallback 当确定应用该规则时调用。

denyCallback 当这条规则禁止访问时调用。

下面是使用 matchCallback 和 denyCallback 的一个例子

use yii\filters\AccessControl;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['special-callback'],
                'rules' => [
                    [
                        'actions' => ['special-callback'],
                        'allow' => true,
                        'matchCallback' => function ($rule, $action) {
                            return date('d-m') === '31-10';
                        },
                        'denyCallback' => function ($rule, $action) {
                            throw new \Exception('You are not allowed to access this page');
                        }
                    ],
                ],
            ],
        ];
    }

    // Match callback called! This page can be accessed only each October 31st
    public function actionSpecialCallback()
    {
        return $this->render('happy-halloween');
    }
}

除此之外,Yii2 还有 RBAC(基于角色的访问授权),需要多去了解 :)


参考

yii2-doc-guide-security-authorization