【问题标题】:access rules by IP for all roles所有角色的 IP 访问规则
【发布时间】:2021-08-09 15:23:31
【问题描述】:

在 Yii2 上,我尝试将 create 操作限制为只允许批准的 IP,无论用户是否登录。

这是我的代码

 'access' => [
                    'class' => AccessControl::className(),
                    'only' => ['index', 'view', 'create'],
                    'rules' => [
                         [   
                             'actions' => ['index','view'],
                             'allow' => true,
                             'roles' => ['@'],
                         ],
                         [   
                            'actions' => ['create'],
                            'allow' => true,
                            'ips' => Yii::$app->params['adminIPs'], 
                            'roles' => ['?','@'],       
                        ],
                    ],
                ],  

如果用户已登录,并且不是允许的 ip。它显示forbidden permission 页面,但如果用户NOT 登录,它会重定向到登录页面。

如何让它在两种情况下都显示 403 禁止页面?

【问题讨论】:

    标签: yii yii2


    【解决方案1】:

    默认情况下,当规则拒绝访问时,会调用AccessControl::denyAccess() 方法。如果用户是访客(未登录),则通过此方法将他们重定向到登录页面。如果您想返回 403 Forbidden 页面,则必须使用 AccessRule::$denyCallback 属性覆盖此行为。

    此外,您需要为拒绝访问的规则设置denyCallback 属性,而不是为允许访问的规则。

    例如:

    'access' => [
        'class' => AccessControl::class,
        'only' => ['index', 'view', 'create'],
        'rules' => [
            // ...
            [   
                'actions' => ['create'],
                'allow' => true,
                'ips' => Yii::$app->params['adminIPs'], 
            ],
            [
                 'actions' => ['create'],
                 'allow' => false,
                 'denyCallback' => function() {
                     throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
                 }
            ]
        ],
    ],  
    

    因为规则匹配所有内容,您需要确保它是 create 操作的最后一条规则,一旦匹配,就不会到达下一个规则。

    【讨论】:

    • 我之前试过这个,结果一样。知道是什么导致它转到登录页面吗?
    • 我也加入了use yii\web\ForbiddenHttpException;
    • 我已经意识到问题出在哪里并编辑了我的答案。您必须将denyCallback 放入实际上拒绝访问的规则中,而不是允许它的规则中。
    • .'actions' 这里有错字。将其更改为'actions' 并且可以正常工作!谢谢
    【解决方案2】:

    如果您想通过 IP 限制访问并且不关心用户是否登录,您可以省略角色。

    'access' => [
      'class' => AccessControl::className(),
      'only' => ['index', 'view', 'create'],
      'rules' => [
        //....
        [   
          'actions' => ['create'],
          'allow' => true,
          'ips' => Yii::$app->params['adminIPs'],    
        ],
      ],
    ],
    

    【讨论】:

    • 这对我不起作用,知道是什么导致它转到登录页面吗?
    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2016-12-08
    • 2021-04-26
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多