yii2权限管理

来源:互联网 发布:自学网c语言 编辑:程序博客网 时间:2024/06/07 18:29

ACF:存取控制过滤器
存取控制过滤器(ACF)是一种通过 yii\filters\AccessControl 类来实现的简单授权方法。
介绍其使用:

    public function behaviors()    {        return [            'access' => [                'class' => yii\filters\AccessControl::className(),                    'rules' => [                        [                            'allow' => true,                            'actions' => ['create', 'update', 'view', 'delete'],                            'roles' => ['@'],                        ],                        [                            'allow' => true,                            'actions' => ['index'],                            'roles' => ['?'],                        ],                    ],            ],        ];    }
  1. rules:array a list of access rule objects or configuration arrays for creating the rule objects.
    • If a rule is specified via a configuration array, it will be merged with [[ruleConfig]] first
    • before it is used for creating the rule object.
  2. 允许所有访客(还未经认证的用户)执行 index 操作。 roles 选项包含的问号 ? 是一个特殊的标识,代表”访客用户”。
    允许已认证用户执行 create update view delete操作。@是另一个特殊标识, 代表”已认证用户”。

基于角色的存取控制 (RBAC)
只简单介绍使用数据库存放授权数据
在配置文件web.php中添加component配置:

'components' => [    ......    'authManager' => [                    'class' => 'yii\rbac\DbManager',                     'itemTable' => 'auth_item',                     'assignmentTable' => 'auth_assignment',                     'itemChildTable' => 'auth_item_child',            ],]

DbManager 使用4个数据库表存放它的数据:

  • yii\rbac\DbManager::$itemTable: 该表存放授权条目(译者注:即角色和权限)。默认表名为 “auth_item” 。
  • yii\rbac\DbManager::$itemChildTable: 该表存放授权条目的层次关系。默认表名为 “auth_item_child”。
  • yii\rbac\DbManager::$assignmentTable: 该表存放授权条目对用户的指派情况。默认表名为 “auth_assignment”。
  • yii\rbac\DbManager::$ruleTable: 该表存放规则。默认表名为 “auth_rule”。

    你需要在数据库中创建这些表。你可以使用存放在 @yii/rbac/migrations 目录中的数据库迁移文件来做这件事。
    授权步骤如下:

  • 定义角色和权限

  • 建立角色和权限的关系
  • 定义规则
  • 将规则与角色和权限作关联
  • 指派角色给用户

    具体实现如下代码:

public function actionAccess()    {        $auth = Yii::$app->authManager;        //创建agent权限        $agentPermission = $auth->createPermission('agent');        $agentPermission->description = 'create agent operate permission.';        $auth->add($agentPermission);          //创建admin角色        $adminRole = $auth->createRole('admin');            $adminRole->description = 'create admin role.';            $auth->add($adminRole);        //将权限赋予角色        $auth->addChild($adminRole, $agentPermission);        //将角色赋予用户        $userId = 1;        $auth->assign($adminRole, $userId);    }

授权结束后就可以进行控制器请求执行前的权限判断了。如下:

    public function beforeAction($action)    {        if (!parent::beforeAction($action)) {            return false;        }        if (Yii::$app->user->can(Yii::$app->controller->id)) {            return true;        }        throw new \yii\web\UnauthorizedHttpException('无权查看');    }
Yii::$app->user->can($permissionName)传入权限的名称,yii会自动去判断当前用户是否具有这种权限,返回truefalse。如果为true就可以继续执行请求的方法了。如果为false,我们可以做一些拦截,比如直接抛出异常。

参考:Yii2.0授权指南
http://www.yiichina.com/doc/guide/2.0/security-authorization

0 0