Yii2访问规则(AccessControl)奇怪的结果

时间:2015-11-11 23:01:51

标签: yii2 access-control

当我使用此类访问规则时

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['?'],
                ],
            ],
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
            'denyCallback' => function ($rule, $action) {
                echo 'Denied';
            }
        ],
    ];
}

结果是:已登录的用户可以看到该页面,但未登录的用户无法看到该页面(这很奇怪,因为未登录用户的规则是第一个和此处http://www.yiiframework.com/doc-2.0/guide-security-authorization.html我们可以阅读

  

ACF通过检查访问规则一来执行授权检查   一个从上到下,直到找到一个匹配的规则   当前执行上下文。

那么,为什么未登录用户的第一条规则不起作用,但登录用户的第二条规则有效?

1 个答案:

答案 0 :(得分:1)

这是因为你写了rules两次。因此,您可以获得具有两个相同键的关联数组。 PHP允许将具有相同键的元素添加到关联数组中,但这会导致奇怪的行为。据我记得,最新声明的元素将具有优先权。

所以你的规则实际上是:

'rules' => [
    [
        'allow' => true,
        'roles' => ['@'],
    ],
],

这就是为什么只允许登录用户,一切都正确。

应改为:

'rules' => [
    [
        'allow' => true,
        'roles' => ['?'],
    ],
    [
        'allow' => true,
        'roles' => ['@'],
    ],
],

但从逻辑上思考你想要的东西 - 它没有意义。登录用户可以访问所有操作,访客可以访问所有操作。因此所有用户都可以访问此控制器中的所有操作。作为结论 - 对于当前状态,您不需要声明任何访问规则,并且可以省略它。