Yii2.0权限系统,使用PhpManager的方式
网上搜了一大堆yii2.0权限系统,大抵都是千篇一律,而且基本上都是DbManager。
看了半天官方文档之后,终于知道了PhpManager的方式下,是怎么引入权限系统。
介绍下我自己的使用。
首先,配置项:在配置文件中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', ], ]
使用authManager,通过$auth = Yii::$app->authManager;获得authManager句柄。
下面就是定义权限。三个名词:权限,角色,用户。
权限:说白了就是一个或者一组操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
$site_info = $auth->createPermission('site/delete');//新建一个权限,这个名字是你随便写的,但是在后面的beforeAction中会用到 $auth->add($site_info);//将权限写入,也就是写入配置文件中@web/rabc/items.php。
角色:说白了就是一个或者一组操作的集合,这些操作都可以调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
$role=$auth->createRole("Teachers");//新建一个角色 $auth->add($role);//将角色写入,也是写到配置文件中@web/rabc/items.php $auth->addChild($role,$site_info);//将权限分配给角色,
用户:即浏览器的访问者
$auth->assign($role,Yii::$app->user->getId());//将角色分配给用户,用户是通过id识别,一般权限系统都是登录之后的,所以用id识别也可以,这个配置是写到@web/rabc/assignments.php
然后就是对定义好的权限的验证。PhpManager的方式,在验证权限的时候一般与beforeAction()配合使用,beforeAction在其他action执行之前,会自动调用,注意,只是在action开头的操作执行之前会调用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public function beforeAction($action) { $action = Yii::$app->controller->id.'/'.Yii::$app->controller->action->id;//这里的$action与前面定义的权限名应该一样。 if($action=='site/login' || $action=='site/regist' || $action=='site/error'){ return true; } if(\Yii::$app->user->can($action)){//验证用户的权限,这里是需要角色分配给用户的,只有将id关联到了用户才可以验证的。 return true; }else{ echo"<script>alert('对不起,您现在还没获此操作的权限')</script>"; } }
这个验证写的不是很好,可以再else中抛出异常,或者是一些其他对没有权限的处理。
参数$action,必须带上,亲试。函数里面的局部变量$action是你定义的权限名,\Yii::$app->user->can($action)是根据user的id字段来验证用户是否有这个权限。
1.使用PhpManager的方式,权限的一些配置项都在@web/rbac/下,Linux系统下确保你在该目录有写权限。
2.@web/rbac/items.php保存的是角色以及权限的一些相关配置,@web/rbac/assignments.php保存的是角色分配给用户。完全可以不用框架提供的权限定义方式,自己手动在配置文件中定义
3.网上提到的默认角色,按照网上提的方法试过,没用,可能是我没有找到正确的方式吧。
4.权限分配给角色部分,由于是关联到id的,所以可能系统只有一张user表,user表中有个type字段来区分不同的用户,在添加用户的时候,就根据不同的type,将id分配给角色。