继续摘抄:使用 RBAC 组件实现访问控制

RBAC 是英文(Role-Based Access Control)的缩写,也就是基于角色的访问控制。RBAC 的定义比较晦涩,我就以比较生动的形式来阐述什么是 RBAC。

 


 


RBAC 概念

在 FleaPHP 的 RBAC 组件中,只有下列几项概念需要理解:

  • 用户:应用程序的使用者;
  • 角色:一个名字,可以为用户指定多个角色(0-n);
  • 访问控制表(ACT):一个数组,用来指明哪些功能可以被哪些角色访问或者限制访问。

除了上述三个概念,要想 RBAC 系统能够正常工作,还需要用户信息管理器、角色信息管理器和访问控制器三个部件。

  • 用户信息管理器:提供用户信息的存储、查询服务,以及为用户指定角色信息;
  • 角色信息管理器:提供角色信息的存储和查询服务
  • 访问控制器:根据角色信息和访问控制表进行验证

FleaPHP 中已经实现了上述三个部件,所以开发者要做的功能就比较简单了。



使用 RBAC

FleaPHP 中提供了 FLEA_Com_RBAC、FLEA_Com_RBAC_UsersManager 和 FLEA_Com_RBAC_RolesManager 三个部件,以及 FLEA_Dispatcher_Auth 调度器。

其中,FLEA_Com_RBAC_UsersManager 提供用户信息存储服务,而 FLEA_Com_RBAC_RolesManager 提供角色信息存储服务。FLEA_Com_RBAC 则和 FLEA_Dispatcher_Auth 结合,一起提供了访问控制能力。

下面我们来看看 RBAC 到底怎么工作的。

修改应用程序设置

要使用访问控制功能,首先需要修改应用程序设置。让应用程序使用 FLEA_Dispatcher_Auth 调度器,而不是默认的 FLEA_Dispatcher_Simple 调度器。

<?php

require('FLEA/FLEA.php');
set_app_inf('dispatcher', 'FLEA_Dispatcher_Auth');
/**
 * ...
 * 其他初始化代码
 * ...
 */

run();

?>

FLEA_Dispatcher_Auth 调度器和 FLEA_Dispatcher_Simple 调度器的基本功能一样。但在调用控制器动作方法前,FLEA_Dispatcher_Auth 调度器会通过 FLEA_Com_RBAC 组件获取保存在 session 中的用户角色信息,然后再读取控制器的访问控制表(ACT)。最后调用 FLEA_Com_RBAC::check() 方法检查用户拥有的角色是否可以访问这个控制器及要调用的控制器动作。

验证通过,则控制器动作方法会被调用,否则将显示错误信息,或者调用应用程序设置 dispatcherAuthFailedCallback 指定的错误处理程序。

准备控制器的 ACT 文件

设置好应用程序后,接下来要做的就是为控制器准备 ACT 文件。

ACT 文件和控制器文件同名,并且保存在同一个目录下,只是扩展名为 .act.php。例如控制器 Controller_Default 的文件名是 Controller/Default.php,那么该控制器的 ACT 文件名就是 Controller/Default.act.php。

ACT 文件的内容通常使用下面的格式:

<?php

return array(
    'allow' => 'POWER_USER, SYSTEM_ADMIN',

    'actions' => array(
        'remove' => array(
            'allow' => 'SYSTEM_ADMIN',
         ),

        'create' => array(
            'deny' => 'SYSTEM_ADMIN',
         ),
     ),
);

?>

可以看到,ACT 文件只是单纯的返回一个数组。这个数组遵循下面的格式:

array(
    'allow' => '允许访问该控制器的角色名',
    'deny' => '禁止访问该控制器的角色名',

    'actions' => array(
        '动作名' => array(
            'allow' => '允许访问该动作的角色名',
            'deny' => '禁止访问该动作的角色名',
         ),
        // .... 更多动作
     ),
);

在上面的格式中,角色名可以是多个,例如“POWER_USER, MANAGER”。只需要用“,”分隔多个角色名就可以了。

通常,我们只需要为控制器指定 allow 或者 deny 就可以了。但有时候我们要允许多个角色都可以访问该控制器,但该控制器中的特定方法只允许上述角色中部分角色可以访问。这时,我们可以通过'动作名' => array('allow' => '角色名', 'deny' => '角色名') 的方式来指定该控制器动作特有的 ACT。

为了便于开发,FleaPHP 预定义了几个角色,分别是:

  • RBAC_EVERYONE:表示任何用户(不管该用户是否具有角色信息)
  • RBAC_HAS_ROLE:表示具有任何角色的用户(该用户必须有角色信息)
  • RBAC_NO_ROLE:表示不具有任何角色的用户
  • RBAC_NULL:表示该设置没有值

 特别注意,上述四个预定义角色并不是字符串,而是常量。因此必须以 'allow' => RBAC_EVERYONE 这样方式使用。并且不能和其他角色混用,例如 'allow' => RBAC_EVERYONE . ', POWER_USER' 就是错误的。

原贴地址:http://hi.baidu.com/xsite/blog/item/3ac31508d2a36c33e82488e8.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值