2017-07-06 16:35:23 2831次浏览 2条回答 0 悬赏 100 金钱

控制器代码:
public function behaviors() {

    return [
        //附加行为
        'myBehavior' => [
            'class' => '\app\components\MyBehavior',
        ],
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['index', 'add'],
            'rules' => [
                [
                    'actions' => [],
                    'allow' => true,
                    'roles' => ['?'],
                ],
                [
                    'actions' => ['index', 'add'],
                    'allow' => true,
                    'roles' => ['@'],
                ]
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
            //'delete' => ['POST'],
            ],
        ],
    ];
}

public function beforeAction($action) {
    $currentaction = $action->id;
    $novalidactions = ['add-edit-inspection-area'];  //对这个action  关闭csrf
    if (in_array($currentaction, $novalidactions)) {
        $action->controller->enableCsrfValidation = false;
    }
    parent::beforeAction($action);
    return true;
}
MyBehavior代码:

public function beforeAction($action) {

    // 当前路由
    $actionId = $action->getUniqueId();
    $actionId = '/' . $actionId;

    // 当前登录用户的id
    $user = Yii::$app->getUser();
    $userId = $user->id;

    // 获取当前用户已经分配过的路由权限
    // 写的比较简单,有过基础的可自行完善,比如解决"*"的问题,看不懂的该行注释自行忽略
    $routes = [];
    $manager = Yii::$app->getAuthManager();
    foreach ($manager->getPermissionsByUser($userId) as $name => $value) {
        if ($name[0] === '/') {
            $routes[] = $name;
        }
    }
    //print_r($routes);//所有权限
    if ($actionId != '/auth/index') {//登录页面可直接访问

        // 判断当前用户是否有权限访问正在请求的路由
        if (in_array($actionId, $routes)) {
            $this->navData($routes, $actionId);
            return true;
        }
    } else {
        return true;
    }
    $this->denyAccess($user);
}

发现我不重写beforeAction()方法,就正常,否则行为就失效
  • 回答于 2017-07-06 16:49 举报

    AccessControl 代码你看了就知道为什么了

    2 条回复
    回复于 2017-07-07 08:46 回复

    额 看不懂 赐教啊

    回复于 2017-07-07 09:10 回复

    AccessControl的实现方式就是用的beforeAction 你denyAccess这个方法哪看到的,你把AccessControl的逻辑要不就加到你目前的代码里 写个function 在你的beforeAction调用下就是了
    对了 AccessControl里面还有个$denyCallback这个参数 你最好还是看下源码

  • 回答于 2017-07-07 22:33 举报

    问题解决了吗?如果没有,你能把 MyBehavior.php 完整的代码上传上来吗?另外:

    发现我不重写beforeAction()方法,就正常,否则行为就失效

    这里的“正常”指的是 MyBehavior 能成功拦截某一个禁止访问的 action 吗?"行为就失效“指的也是 MyBehavior 没有拦截住本该禁止访问的 action 吧?换句话说,你标题中的“行为失效”特指的是 behaviors() 中的 MyBehavior.

您需要登录后才可以回答。登录 | 立即注册
xyf90314
副总裁

xyf90314

注册时间:2015-03-04
最后登录:2023-03-13
在线时长:95小时23分
  • 粉丝21
  • 金钱5257
  • 威望40
  • 积分6607

热门问题