Yii学习 第八章:迭代5:用户访问控制

迭代计划

针对一个Project我们建立了如下的三类角色模型:



Project Owner(被赋予所有权限访问此Project的管理功能)

Project Member(被赋予一定权限访问此Project的特性和功能)

Project Reader (只有读取Project相关内容的权限,没有任何修改级权限)



小目标:

制定一个策略来强制用户在获得访问任何Project或Issue相关功能前,必须登录

建立用户角色并且使之与一个特殊的功能权限对应

制定一个为用户分配角色的机制(包含角色相关的权限)

确保我们的角色权限结构针对每一个Project独立存在(也就是说,允许用户在不同的项目拥有不同的权限)

制定一个让用户和项目,同时也和项目中的角色相关联的机制

实施适当的认证访问检测,使得应用程序可以针对基于不同用户权限进行允许或拒绝访问操作





访问控制 过滤器



public function filters()

{

    return array(

        'accessControl', // perform access control for CRUD operations   这个是yii框架提供的过滤器,调用下面的accessRules

    );

}



public function accessRules()

{

    return array(

        array('allow', // allow all users to perform 'index' and'view' actions

            'actions'=>array('index','view'),

            'users'=>array('*'),

        ),



        array('allow', // allow authenticated user to perform 'create' and 'update' actions

            'actions'=>array('create','update'),

            'users'=>array('@'),

        ),



        array('allow', // allow admin user to perform 'admin' and 'delete' actions

            'actions'=>array('admin','delete'),

            'users'=>array('admin'),

        ),



        array('deny', // deny all users

            'users'=>array('*'),

        ),

    );

}



基于角色的访问控制,Yii的RBAC功能



    1.配置认证管理器

    在我们建立授权等级,授予用户角色和访问权限检测之前,我们需要配置授权管理应用组件,authManager。这个组件用来存储权限信息,和管理权限与所提供的检测用户是否可以执行相关操作的方法之间的关系.

    Yii提供了2类授权管理器:CPhpAuthManager和 CDbAuthManager. CphpAuthManager使用PHP脚本文件储存授权信息。CDbAuthManager,正如你所猜的,使用数据库储存授权信息。

    配置文件中加入:

        'authManager'=>array(

            'class'=>'CDbAuthManager',

            'connectionID'=>'db',

        ),

   

    2.建立RBAC使用的数据库表

    create table AuthItem

    (

        name    varchar(64) not null,

        type    integer not null,

        description    text,

        bizrule    text,

        data    text,

        primary key (name)

    );



    create table AuthItemChild

    (

        parent    varchar(64) not null,

        child    varchar(64) not null,

        primary key (parent,child),

        foreign key (parent) references AuthItem (name) on delete cascade on update cascade,

        foreign key (child) references AuthItem (name) on delete cascade on update cascade

    );



    create table AuthAssignment

    (

        itemname    varchar(64) not null,

        userid    varchar(64) not null,

        bizrule    text,

        data    text,

        primary key (itemname,userid),

        foreign key (itemname) references AuthItem (name) on delete cascade on update cascade

    );

    3. 建立RBAC授权体系  

    首先创建了一个类authManager的实例,然后我们使用createRole(), createOperation, 和addChild()这些API接口方法来创建一个新owner角色和一个叫做createProject的新操作。然后我们为owner角色添加权限。如此,完成owner,member,reader等角色、操作等等的添加



    4.编写控制台应用程序命令  

    yiic shell命令允许你通过命令行和web应用程序交互。你可以从包含应用程序脚本的文件包来执行它。同时,内部的一些特殊代码,提供了自动生成controllers(控制器), views(视图) and data models(数据模型)的功能.

    创建RbacCommand.php到protected/shell/目录

    RbacCommand.php只有public function getHelp(){}  和 public function run(){}

   

    命令行执行: Yiiroot/framework/yiic shell 配置(比如我的测试网站是:/var/www/html/yiistudy/protected/config/main.php)

    进入yiic shell后,输入help,可以看到可以自行的命令有哪些。

    我添加了rbacCommand.php到protected/shell/目录后,有这些命令

    - controller

    - crud

    - form

    - help

    - module

    - model

    - rbac

  

    执行help rbac,就可以看到public function getHelp(){}输出的提示文字。

    直接执行rbac,则运行了 run().相应的内容也就写到数据表里面去了。



   当然了,真实的项目里面,权限控制需要更多的管理操作。

  

   5.为用户分配角色



    $auth=Yii::app()->authManager;

    $auth->assign('member',1); (member是角色,1是用户id)





  6. 为项目添加rbac

    我们需要允许用户在不同项目中担任不同角色。举个例子,一个用户可能在一个项目中为reader 角色,在另外一个项目中为member角色,在第三个项目中为owner角色。用户可以存在于多个项目中,并且必须指明他们在每一个项目中的角色。



    create table tbl_project_user_role

    (

        project_id INTEGER NOT NULL,

        user_id INTEGER NOT NULL,

        role VARCHAR(64) NOT NULL,

        primary key (project_id,user_id,role),

        foreign key (project_id) references tbl_project (id),

        foreign key (user_id) references tbl_user (id),

        foreign key (role) references AuthItem (name)

    );

   

    同时在project的ar类中添加三个操作

    分别为: ssociateUserToRole($role, $userId);removeUserFromRole($role, $userId);isUserInRole($role);

    他们的作用分别是: 添加用户角色,移出用户角色,判断当前user在项目中是否是当前的$role

 

   7.添加用户到项目

  

   基本的流程:

   ProjectController.php添加 actionAdduser();

   actionAdduser()中的业务:

            1.new 一个添加user到项目的form,该form类继承自CFormModel.

              {该form要处理的任务: 字段验证(username,role是required;username需要验证是否存在,是否已经加入项目。验证通过后,还要插入数据库)} 

            2.新建一个form表单的view

               使用CActiveForm widget

               使用autocomplete,dropdownlist等

              

            3.处理表单提交

               表单提交后,数据提交给$form,  $form内部validate();返回结果,提示是否插入,或者用户不存在,或者用户已加入。

   

  8.判断授权等级

    在actionAdduser中添加当前登录用户是否有creatUser权限

    if(!Yii::app()->user->checkAccess('createUser', array('project'=>$project)))

    {

        throw new CHttpException(403,'You are not authorized to per-form this action.');

    }





总结:

    1.简单的访问控制,通过filter,来限制action的访问

    2.Yii的RBAC模型(CDbAuthManager,Yii CLi程序的写法,Yii::app()->db->createCommand(),$command->bindValue())

    3.用户权限判断

猜你喜欢

转载自xieweiseo.iteye.com/blog/2267310
今日推荐