基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问),的有前景的代替受到广泛的控制。

这里我使用的是高级版的Yii框架,首先在common文件夹中config文件夹中的main-local.php中加入这段:

'authManager' => [
    'class' => 'yii\rbac\DbManager',
    'itemTable' => 'auth_item',
    'assignmentTable' => 'auth_assignment',
    'itemChildTable' => 'auth_item_child',
],
Rbac支持两种类,PhpManager和DbManager,这里我使用的是DbManager,是对数据库进行的操作,使用PhpManager操作需要在backend文件夹中创建rbac文件夹创建items.php进行操作。
框架中只需要进入Cmd到框架根目录输入:yii migrate(运行这个命令,生成user表),
yii migrate - [email protected]/rbac/migrations/  (运行此命令生成权限数据表)
下面这个控制器的几个动作方法,完成典型的CURD操作:

准备一:

<?php

use Yii;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
class PostController extends  Controller
{
    public function actionAdd()
    {
        return $this->renderContent('添加');
    }
    public function actionDelete()
    {
        return $this->renderContent('删除');
    }
    public function actionUpdate()
    {
        return $this->renderContent('更新');
    }
    public function actionSelect()
    {
        return $this->renderContent('查询');
    }
}

准备二:

创建几个用户,便于分配不同的角色,进行访问权限测试,采用yii框架生成的user表结构,创建用户可以在yii框架?r=site/signup中创建,注册成功后在?r=site/login
中去登录。

管理角色

/**
 * 添加角色
 */
public function actionAdd_role()
{
    // 获取authMananger组件对象
    $auth = \Yii::$app->authManager;
    // 增加3个角色
    $goods = $auth->createRole('商品管理员');
    $auth->add($goods);
    $brand = $auth->createRole('品牌管理员');
    $auth->add($brand);
    $sku = $auth->createRole('SKU管理员');
    $auth->add($sku);
    //$auth->remove($goods);//这个是删除角色
}
执行后会自动添加到数据库中的auth_item表中

为用户赋予角色

/**
 * 给用户赋角色
 */
public function actionAdd_user_role()
{
    // 获取authMananger组件对象
    $auth = \Yii::$app->authManager;
    $goods = $auth->createRole('商品管理员');
    $brand = $auth->createRole('品牌管理员');
    $sku = $auth->createRole('SKU管理员');
    //第一个参数角色,第二个参数为用户ID
    $auth->assign($sku, 1);
    $auth->assign($goods, 1);
    $auth->assign($brand, 1);
}
执行后会在auth_assignment表中生成如下数据:

增加权限

$add = $auth->createPermission('Add');//方法名
$add->description = '添加操作';//方法名称
$auth->add($add);//添加
$update = $auth->createPermission('Update');
$update->description = '修改操作';
$auth->add($update);
$select = $auth->createPermission('Select');
$select->description = '查询操作';
$auth->add($select);
$delete = $auth->createPermission('Delete');
$delete->description = '删除操作';
$auth->add($delete);
执行这个会在数据库中的auth_item表中生成权限:
yii框架中操作RBAC

为角色赋予权限

$auth = Yii::$app->authManager;
$auth->addChild($goodsMan,$add);//商品管理员  添加权限
$auth->addChild($goodsMan,$delete);//商品管理员  删除
$auth->addChild($brandMan,$select);//品牌管理员  查询
$auth->addChild($brandMan,$update);//品牌管理员  修改

这个添加会在数据库中的auth_item_child表生成
yii框架中操作RBAC
以下这个方法实现的是在执行方法之前运行此方法,在if判断中国需要把获取到的方法首字母转换为大写:
public function beforeAction($action)
{
    $user = Yii::$app->user;
    if (!$user->can(ucfirst($action->id)))
    {
        echo "您暂时没有访问该方法的权限";exit();
    }
    return true;
}


相关文章:

  • 2021-09-22
  • 2021-09-15
  • 2021-08-23
  • 2021-12-17
  • 2021-07-04
  • 2021-06-26
  • 2022-01-20
猜你喜欢
  • 2021-05-10
  • 2022-12-23
  • 2021-09-24
  • 2022-12-23
  • 2022-01-08
  • 2022-12-23
  • 2021-05-23
相关资源
相似解决方案