参考:http://www.yiichina.com/doc/guide/2.0/security-authorization
授权问题主要是依靠Yii框架的ACF 和 RBAC
单纯的ACF就是看一个用户是否有这个控制器的操作权利,一般情况下是不会单独的使用这个授权,更多的是使用RBAC为主,借助ACF来实现
使用框架的授权组件要在配置文件里加载:
components=>[
'authManager' => 'yii\dbrc\DbManager',
]
我使用的是依赖数据库的方式,还有一种方式是使用'authManager'=>'yii\rbac\PhpManager',是存储在脚本文件中
使用数据库依赖要用四个数据表:auth_item.auth_item_child,auth_assignment,auth_rule,
框架提供了现成的创建数据表的sql语句: vendor\yiisoft\yii2\rbac\migration\schema-mysql.sql
四个表的用途和字段
auth_item:保存要控制的原子权限和较色,type=1:角色,type=2原子权限, name:原子权限,
auth_item_child:角色和权限的对应关系的保存。 parent:角色,child:原子权限
auth_assignment:角色和用户的对应关系 item_name:角色的名称,user_id:用户的ID
auth_rule:认证的规则,
将数据库的对应数据加到ACF的实现中
在控制器中
behaviors() {
rules=> [
'actions' => 控制器的动作,
'allow'=>true,
'roles'=>原子权限
]
}
我保存的原子权限包括了action,
actions 和 roles 是从auth_item中读取出来的,
roles一般包括三个角色,?:guest, @:登录的人,
我写的原子权限是要调用Yii::$app->user->can(auth_time::name)
这样就利用了框架的功能来实现了执行动作的检测
同事实现了一个比较好的方法:把module,controller,action 和原子权限保存到一个表中,
在controller中使用Yii->$app->controller->id,Yii::$app->app->controller->module->id;来获取这个动作的原子权限
只用在保存原子权限的时候维护这个数据表。
YII很强大,要逐渐的深入才能体会.........