当我使用此类访问规则时
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通过检查访问规则一来执行授权检查 一个从上到下,直到找到一个匹配的规则 当前执行上下文。
那么,为什么未登录用户的第一条规则不起作用,但登录用户的第二条规则有效?
答案 0 :(得分:1)
这是因为你写了rules
两次。因此,您可以获得具有两个相同键的关联数组。 PHP允许将具有相同键的元素添加到关联数组中,但这会导致奇怪的行为。据我记得,最新声明的元素将具有优先权。
所以你的规则实际上是:
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
这就是为什么只允许登录用户,一切都正确。
应改为:
'rules' => [
[
'allow' => true,
'roles' => ['?'],
],
[
'allow' => true,
'roles' => ['@'],
],
],
但从逻辑上思考你想要的东西 - 它没有意义。登录用户可以访问所有操作,访客可以访问所有操作。因此所有用户都可以访问此控制器中的所有操作。作为结论 - 对于当前状态,您不需要声明任何访问规则,并且可以省略它。