自带的ACF登陆验证 - 活用can方法

  • 作者:KK

  • 发表日期:2016.11.02


一般来说User类的can方法是在控制器自动运行过滤器时自动调用的,不需要我们手动调用,要扩展什么的重写can方法的逻辑就行了

但其实可以这么玩,首先要扩展角色就重写can的逻辑做自己的校验,默认就是提供给过滤器自动调用做校验的

然后有一些权限控制比较复杂的方法就只做@角色的登陆权限校验,而在执行时再进一步通过can方法判断用户的其它权限

下面是一个示例控制器:

class XxController extends \yii\web\Controller{
	public function behaviors(){
		return [
			'access' => [
				'class' => \yii\filters\AccessControl::className(),
				'rules' => [
					[
						'allow' => true,
						'actions' => ['add-member'], //就这个方法只要@角色就可以
						'roles' => ['@'],
					],
					[
						'allow' => true,
						'roles' => ['vip1'], //其它方法全部都要vip1
					],
				],
			],
		];
	}
	
	public function actionAddMember(){
		$xxx = yyy();
		if(Yii::$app->user->can('vip1')){
			qqq($xxx);
		}else if(Yii::$app->user->can('vip2')){
			vvvv();
			/*我的项目试过这样,增加了一个 test-user 的权限角色
			其实这个就是我们员工的测试账号,做一些特殊处理,当然其实项目中应该尽量避免这样,但中途参加的项目有历史遗留问题又奈何呢……*/
			if(Yii::$app->user->can('test-user')){ 
				jjjj();
			}
		}else if(Yii::$app->user->can('vip3')){
			//干嘛干嘛的
		}
		
		//更多。。。其实真实场景比这种逻辑还复杂
	}
}

其实上面的actionAddMember就是通过can对权限校验的返回来决定要不要运行哪一块代码,这是最细的权限控制级别了,完全可以控制到每一条语句要不要执行

而从前的确有不少人受限于RBAC只能控制到控制器方法而苦恼,至少我觉得无须动不动就用RBAC吧?