2018-08-31 14:18:03 2012次浏览 1条回答 0 悬赏 300 金钱

我现在有个文章的控制(ArticleController)器继承了公用控制器 (BaseController)
在BaseController中做了行为处理

public function behaviors()
{
     $behaviors = parent::behaviors();
     $behaviors['class'] = Cors::className();
     $behaviors['authenticator'] = [
         'class' => CompositeAuth::className(),
         'authMethods' => [
             [
                 'class' => QueryParamAuth::className(),
                 'tokenParam' => 'accessToken'
             ],
         ],
         // 不进行认证登录
         'optional' => [],
     ];

     $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
     // 定义返回格式是:JSON
     $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
     return $behaviors;
}

在文章控制器里有index,create,edit,view 4个actions
想让index和view不用登入就可一访问
在代码 : // 不进行认证登录 的optional 该怎么设置?或者该怎么做?
文档说只要填写action 可以了,但是不同控制器有不同的权限,改怎么设置?

填了 'optional' => ['article/index'] 没作用

补充于 2018-09-03 10:13

现在把验证放在每个控制里了,就是觉得不舒服。
忽然想到把不需要认证的放在一个数组里以控制器名称为key,获取当前controller Id 然后获取对应的数组

//不需要验证的action
$this->optional = [

'controllerName'=>['index','view'],
....

],
public function behaviors()
{

$controller_name = \Yii::$app->controller->id;
$optional = empty($this->optional[$controller_name])? []:$this->optional[$controller_name];
 $behaviors = parent::behaviors();
 $behaviors['class'] = Cors::className();
 $behaviors['authenticator'] = [
     'class' => CompositeAuth::className(),
     'authMethods' => [
         [
             'class' => QueryParamAuth::className(),
             'tokenParam' => 'accessToken'
         ],
     ],
     // 不进行认证登录
     'optional' => $optional,
 ];

 $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
 // 定义返回格式是:JSON
 $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
 return $behaviors;

}

还不到是否可行,等有时间了试试

最佳答案

  • forecho 发布于 2018-09-02 14:59 举报

    optional 值只能为 action name,所以你应该这么写 'optional' => ['index']

    如果你这个 behaviors 在 BaseController 里面的话,你就要像其他办法了,比方说

    if(true) {
        $behaviors['authenticator'] = [
             'class' => CompositeAuth::className(),
             'authMethods' => [
                 [
                     'class' => QueryParamAuth::className(),
                     'tokenParam' => 'accessToken'
                 ],
             ],
             // 不进行认证登录
             'optional' => [],
         ];
     }
    
    1 条回复
    回复于 2018-09-03 10:45 回复

    感谢提醒,现在在外面添加了获取 控制器名称,通过控制器名称获取对应的optional

    没有找到数据。
您需要登录后才可以回答。登录 | 立即注册
nswindlights
总监

nswindlights 江苏太仓

注册时间:2014-09-18
最后登录:2020-03-30
在线时长:74小时58分
  • 粉丝5
  • 金钱986
  • 威望80
  • 积分2526

热门问题