本文实例讲述了yii2
RBAC使用DbManager实现后台权限判断的方法。分享给大家供大家参考,具体如下:

本文实例讲述了YII
Framework框架使用YIIC快速创建YII应用之migrate用法。分享给大家供大家参考,具体如下:

首先根据文档生成yii2 框架中的表

yii migrate

yii migrate –migrationPath=@yii/rbac/migrations/

/*/www/yii_dev/yii/framework# php yiic migrate helpError: Unknown action: helpUSAGE yiic migrate [action] [parameter]DESCRIPTION This command provides support for database migrations. The optional 'action' parameter specifies which specific migration task to perform. It can take these values: up, down, to, create, history, new, mark. If the 'action' parameter is not given, it defaults to 'up'. Each action takes different parameters. Their usage can be found in the following examples.EXAMPLES* yiic migrateApplies ALL new migrations. This is equivalent to 'yiic migrate to'.* yiic migrate create create_user_tableCreates a new migration named 'create_user_table'.* yiic migrate up 3Applies the next 3 new migrations.* yiic migrate downReverts the last applied migration.* yiic migrate down 3Reverts the last 3 applied migrations.* yiic migrate to 101129_185401Migrates up or down to version 101129_185401.* yiic migrate mark 101129_185401Modifies the migration history up or down to version 101129_185401.No actual migration will be performed.* yiic migrate historyShows all previously applied migration information.* yiic migrate history 10Shows the last 10 applied migrations.* yiic migrate newShows all new migrations.* yiic migrate new 10Shows the next 10 migrations that have not been applied.*/

auth_assignmentauth_item_childauth_itemauth_rule

在我们开发程序的过程中,数据库的结构也是不断调整的。我们的开发中要保证代码和数据库库的同步。因为我们的应用离不开数据库。例如:
在开发过程中,我们经常需要增加一个新的表,或者我们后期投入运营的产品,可能需要为某一列添加索引。我们必须保持数据结构和代码的一致性。如果代码和数据库不同步,可能整个系统将无法正常运行。出于这个原因。yii提供了一个数据库迁移工具,可以保持代码和数据库是同步。方便数据库的回滚和更新。

使用yii的gii快速生成对应的model,但是由于auth_item表同时存储角色跟权限,由于后面我们要分角色跟权限来做curd操作,所以我这里新建了一个RoleForm和PermissionForm两个model来区分开角色与权限。由于角色跟权限紧紧相连,又在auth_item生成的model中多加一个属性$child,后面会用到现在先不管。

功能正如描述。主要提供了数据库迁移功能。

下面是角色model的相关代码

命令格式

type = Item::TYPE_ROLE;//yii-rbac-Role隐藏继承常量这里的值是1 }}

yiic migrate [action] [parameter]

下面是权限model的相关代码

action参数用来制定执行哪一个迁移任务。可以一使用

type = Item::TYPE_PERMISSION;//常量值 2 }}

up, down, to, create, history, new, mark.这些命令

另外在AuthItem模型中增加一个属性

如果没有action参数,默认为up

现在到我们对应的控制器了首先我们说权限控制器写控制器的时候要用到系统自带的扩展。。。use yiirbacPermission;。。。/* * 权限添加 */public function actionCreate() { $model = new PermissionForm(); if( $model->load( Yii::$app->request->post && $model->validate { //rbac中permission对象 $permission = new Permission(); $permission->name = trim; $permission->type = $model->type; //权限添加 Yii::$app->authManager->add; }}

parameter根据action的不同而有所变化。

修改的时候 其他的不变就是换了个方法

上述例子中给出了说明。

/* * param string $name 修改的权限名 * param Object $permission 跟添加一样提交上来的数据 */Yii::$app->authManager->update;

//Returns the named permission.$permission = Yii::$app->authManager->getPermission;//Removes a permission or rule from the RBAC system.Yii::$app->authManager->remove;

官方也给出了详细的例子。

权限的cud都搞定了,查看就不写了

下面是角色控制器

这里不再详细累述。用到的时候参考使用就可以了。

use yiirbacRole;/* * 角色添加 */public function actionCreate() { $model = new RoleForm(); if ( $model->load( Yii::$app->request->post && $model->validate { //实例化角色对象 $role = new Role(); $role->name = $model->name; $role->type = $model->type; //添加角色 Yii::$app->authManager->add; } //权限列表( 添加角色的时候我们就可看到当前有没有权限来添加 ) $permissions = $this->loadPermission(); //将$model跟$permissions....渲染到视图就好了}

/* * 修改 * param string $name 修改的角色名 * param Object $role 跟添加一样提交上来的数据 */$bool = Yii::$app->authManager->update;

补充:yii2.0使用migrate创建后台登陆

删除的时候就比较麻烦了

重新创建一张数据表来完成后台登陆验证

/* * param string $name 角色名 */$role = Yii::$app->authManager->getRole;//获取当前角色对象//Returns the child roles.$childAll = Yii::$app->authManager->getChildren;if  {//逐一删除权限 foreach  { //Returns the named permission. $perObj = Yii::$app->authManager->getPermission; //Removes a child from its parent. Yii::$app->authManager->removeChild; }}Yii::$app->authManager->remove;//最后删除我们的角色了

为了大家看得明白,直接贴代码

最最关键的就是我们要给角色赋予权限对吧,如下代码

一、使用Migration创建表admin

//当前角色所拥有的权限$childArray = $this->loadRolePermission;//这个就是返回权限数组if ( !empty { $model->child = $childArray;}else { $model->child = array();}//Returns all permissions in the system.$permissions = Yii::$app->authManager->getPermissions;foreach ($permissions as $key => $value) { $perArr[$value->name] = $value->name;}if ( $model->load( Yii::$app->request->post && $model->validate { //角色对象 $child = isset( $_POST['AuthItem']['child'] ) ? $_POST['AuthItem']['child'] : NULL; //表单无法验证child所以当为空的时候跳回原页面 if  { return $this->redirect; } //判断角色是否分配权限,已分配则删除,反之增加新的 if ( !empty { //Removed all children form their parent. $bool = Yii::$app->authManager->removeChildren; if  { throw new HttpException; } } //当前角色对象 $role = Yii::$app->authManager->getRole; //child权限添加 if { foreach  { //获取权限 $childObj = Yii::$app->authManager->getPermission; //给item_child表写入数据 Yii::$app->authManager->addChild; } return $this->redirect; }}

consolemigrationsm130524_201442_init.php

最后就是我们最后一个控制器了角色与用户关联

use yiidbSchema;use yiidbMigration;class m130524_201442_init extends Migration{ const TBL_NAME = '{{%admin}}'; public function safeUp() { $tableOptions = null; if ($this->db->driverName === 'mysql') { // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; } $this->createTable(self::TBL_NAME, [ 'id' => Schema::TYPE_PK, 'username' => Schema::TYPE_STRING . ' NOT NULL', 'auth_key' => Schema::TYPE_STRING . ' NOT NULL', 'password_hash' => Schema::TYPE_STRING . ' NOT NULL', //密码 'password_reset_token' => Schema::TYPE_STRING, 'email' => Schema::TYPE_STRING . ' NOT NULL', 'role' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 10', 'status' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 10', 'created_at' => Schema::TYPE_INTEGER . ' NOT NULL', 'updated_at' => Schema::TYPE_INTEGER . ' NOT NULL', ], $tableOptions); $this->createIndex('username', self::TBL_NAME, ['username'],true); $this->createIndex('email', self::TBL_NAME, ['email'],true); } public function safeDown() { $this->dropTable; }}
/* * 创建角色跟用户之间关联的关键部分代码 *///Returns the named role.$role =Yii::$app->authManager->getRole;// Assigns a role to a user.Yii::$app->authManager->assign;/* * 权限检测 * param int| string $userId 用户id * param string $permission 权限名 */Yii::$app->authManager->checkAccess( $userId , $permission ) )

/* * 权限检测 * param int| string $userId 用户id * param string $permission 权限名 */Yii::$app->authManager->checkAccess( $userId , $permission ) )

使用命令行来创建admin数据库

相关文章