yii2项目实战-基于角色的访问控制(rbac)分配案例
更新于 2016年11月22日 by 白狼 被浏览了 2272 次

上面两个章节,我们主要弄明白了yii中基于角色的访问控制。本章节,我们要实打实的通过程序去实现这个操作,想想还是有那么一点激动的。

为了带案例入学,而我们的大主题是以博客为主题,在开始之前,我们先创建blog数据表以及通过gii创建博客系列所需要的模板,然后我们通过rbac操作,把博客的一系列操作权限分配给用户。ps:讲了那么多终于要用rbac给用户分配权限了,心里捉急...

1、创建博客数据表

DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
  `id` int(11) NOT NULL,
  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题',
  `content` text NOT NULL COMMENT '内容',
  `views` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',
  `is_delete` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否删除 1未删除 2已删除',
  `created_at` datetime NOT NULL COMMENT '添加时间',
  `updated_at` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、gii生成模板,不会的请参考这篇文章

现在我们通过/index.php?r=blog 可以看到博客的一系列操作。此时,博客系列操作的路由,是游离在rbac和ACF之外的,也就是任何人都可以访问的。那肯定不行嘛,

接下来就要上演重点的关键时刻了。我们要想办法通过rbac将其系列操作分配给用户,只有分配了权限的用户才可以访问!

再说明白点,就是要利用auth_assignment、auth_item、auth_item_child和auth_rule表来实现rbac的授权!

很简单,为什么说其简单呢,因为大部分的接口,官方其实都已经为我们实现好了的!我们只需要去操作官方实现好的接口即可。

为了练习,我们手动创建一个控制器RbacController去做某些操作。

<?php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
class RbacController extends Controller
{
    public function actionInit ()
    {
        $auth = Yii::$app->authManager;
        // 添加 "/blog/index" 权限
        $blogIndex = $auth->createPermission('/blog/index');
        $blogIndex->description = '博客列表';
        $auth->add($blogIndex);
        // 创建一个角色blogManage,并为该角色分配"/blog/index"权限
        $blogManage = $auth->createRole('博客管理');
        $auth->add($blogManage);
        $auth->addChild($blogManage, $blogIndex);
        // 为用户 test1(该用户的uid=1) 分配角色 "博客管理" 权限
        $auth->assign($blogManage, 1); // 1是test1用户的uid
    }
}

现在我们访问 /index.php?r=rbac/init 就意味着我们为用户test1分配了角色 "博客管理",而博客管理包含着"blog/index"的访问权限。

分配好了以后我们还需要为 blog/index 实现一个校验方法,只有分配了权限的用户才可以访问,否则肯定要给用户403提示了!

授权校验,yii已经实现了,我们只需要调用授权校验方法即可。

BlogController的index方法修改如下:

继续阅读

还有25%的精彩内容,购买继续阅读