`

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.用户权限判断

分享到:
评论

相关推荐

    使用yii敏捷开发web应用

    它提供了丰富的特性,包括MVC(模型-视图-控制器)架构模式,ActiveRecord,I18N和L10N支持,缓存机制,身份验证和访问控制,以及测试框架。Yii通过其强大的性能,简洁的代码和易用性,成为了快速开发高质量Web应用...

    Agile.Web.Application.Development.with.Yii1.1.and.PHP5

    6. 用户认证和授权:理解Yii的安全机制,包括登录、权限控制和角色基础的访问控制(RBAC)。 7. 视图和模板:学习如何使用Yii的视图组件创建动态页面,以及模板引擎的使用。 8. 错误和日志处理:了解Yii的错误处理和...

    yii2-advanced框架

    8. **社区支持和丰富的扩展**:Yii2拥有活跃的开发者社区,提供大量的第三方扩展,如用户认证、支付集成、邮件服务等。 9. **兼容性和升级**:Yii2与PHP 7.x完全兼容,并且有良好的版本升级策略,使得从老版本平滑...

    yii框架入门实例

    ### Yii框架入门实例知识点详解 #### 一、Yii框架简介及优势 - **灵活适应业务需求**:Yii框架因其...通过以上内容的学习,您可以全面了解Yii框架的基础知识和实践操作方法,为进一步深入学习和应用打下坚实的基础。

    Yii框架文档(2010.7.18)

    Yii框架的核心特性包括遵循MVC(模型-视图-控制器)设计模式,通过组件化和模块化支持可重用性,以及内置的用户认证和安全功能。Yii提供了丰富的工具和功能,例如通过Gii代码生成器自动生成应用模块、以及使用Active...

    基于Yii2的敏捷商店。___下载.zip

    8. **认证和授权**:Yii2提供了强大的身份验证和访问控制功能,这可能体现在`common/components/User.php`(用户组件)和`config/auth.php`(权限配置)中。 9. **支付集成**:对于一个电子商务平台,可能会有第三...

    PHP在线教育平台源码

    4. **用户认证与授权**:平台需要有安全的用户注册、登录功能,以及权限控制,确保只有授权用户能访问特定资源。 5. **课程管理**:包括课程创建、分类、发布、更新等功能,以及课程详情展示、视频播放等。 6. **...

    仿云划算试客系统2.8.2商户旗舰版商业源码 WAP.zip

    8. **权限管理**:商户、用户、管理员等角色的权限控制,实现不同用户群体的功能区分。 9. **任务调度**:例如试用任务的发布、审核、结算等,可能用到计划任务(Cron)来自动化处理。 以上是根据标题和描述推测的...

    大型O2O php源码

    4. **用户管理**:PHP可以构建用户注册、登录、权限控制等功能,通过session和cookie管理用户状态,确保用户信息安全,同时提供个性化的用户体验。 5. **接口设计与API开发**:在大型O2O平台中,可能有多个子系统...

    PHP商城项目后台开发步骤

    设计权限控制,如角色权限、访问控制列表(ACL),确保不同用户对资源有不同的操作权限。 6. **商品管理**: 创建商品模型,实现商品添加、编辑、删除功能。设计商品分类和属性系统,支持商品的多图上传和详情展示...

    脚本语言服务端php实现.rar

    8. **框架和库**:PHP社区提供了很多强大的框架,如Laravel,Symfony,Yii等,它们简化了开发流程并提供了最佳实践。此外,还有各种库(如Composer管理的第三方库)帮助扩展功能,如PDO用于数据库操作,Guzzle用于...

    PHP开发框架的研究与实现.pdf

    框架通常包含模板引擎、数据库访问、会话管理、用户输入处理、安全机制、第三方库集成等组件。 1. 框架的优点:使用PHP开发框架可以提高开发效率,使代码更加规范化,便于维护和升级。此外,框架还提供了一定程度的...

    PHP高级开发技巧与范例.

    - **封装**:通过访问修饰符(public, private, protected)控制成员变量和方法的可见性,实现数据的安全性。 - **继承**:子类继承父类的特性,允许代码复用和扩展,用`extends`关键字实现。 - **多态**:不同的...

    phper杂志20期免费下载

    PDF格式确保了内容的易读性和跨平台访问性,让读者无论在哪里都能轻松学习。 其中,"sort.php"这个文件名可能代表了一篇关于PHP排序算法的文章或示例代码。在PHP中,排序是非常基础且重要的操作,例如使用内置函数`...

    4个月开发的php网页游戏

    游戏上线后,开发者需要持续收集用户反馈,进行版本迭代和功能优化。同时,监控服务器状态,处理异常情况,确保游戏服务的正常运行。 总结,4个月的PHP网页游戏开发涵盖了从需求分析、设计、编码、测试到上线运维...

    大型房地产门户站商业版

    2. **v3.0**:版本号表明这是该软件的第三个主要版本,可能已经过多次迭代和优化,相对成熟稳定。 3. **商业版**:强调这不仅仅是试用版或开源社区版,而是面向商业用户的完整版本,可能包含更多的技术支持和服务。 ...

Global site tag (gtag.js) - Google Analytics