您现在的位置是:网站首页 > 脚本编程>

Thinkphp 基于角色的访问控制(rbac)

2013-08-054865人围观
简介 ThinkPHP示例之RBAC,一个典型的后台数据管理,包括角色授权、数据管理、节点管理、还可以地理RBAC实现会员的一些权限

    最近在用Thinkphp写个后台管理系统,总是在用户权限这块纠结,在学校的时候听说过rbac(基于角色的访问控制)但是由于本人比较笨,当时没有听明白。好了不再啰嗦了下面就是rbac的学习过程给大家贴一下。



        在rbac中只用到了5张表分别是:think_access,think_node,think_role,think_role_user,think_user。其中红色部分为thinkphp中自带的表在Thinkphp-->extend-->library-->org-->util-->RBAC.class.php中38----79行。将其复制到数据库中执行。但是在think_access在添加一个字段 pid。think_user是自己创建的。

    think_access:是用户组访问权限表(节点和用户组关联表)

    think_node:节点表

    think_role:用户组表

    think_role_user:用户组和用户关联表
      think_user:用户表


thinkphp rbac

 think_access 表字段解释


role_id:用户组id
node_id:节点id
level:节点表中的level
module:
pid:节点表中的pid
think_node 表字段解释
id: id自增这个并不用解释
name:名称(必填)
title: 标题(可为空)
status: 状态 为1 开启状态 0关闭状态
remark:标签(备注)可为空
sort:排序用的
pid:如果是项目名称 就填写0,如果是模块就填写项目的 id ,如果是方法 就填写模块的 id
level:如果是项目就填写1  如果是模块就填写 2 如果是方法就填写 3

    节点(项目   1,模块  2,方法  3)之间的关系,你先得让用户能访问项目,模块,方法
(他们之间的关系,我们就叫做节点,如果说你需要将所有的节点全部可控制,
你就需要将所有的项目,项目下的模块,模块下的方法,全部加入到节点表当中去)


think_role  表字段解释

id:id自增
name:用户组的名称
pid:父id
staus: 状态 为1 开启 0为关闭
remark: 备注
think_role_user 表字段解释
role_id:用户组id
user_id:用户id

    下面我们讲解代码部分

    CommonAction.class.php   这个是初始化rbac的文件(注意这个文件继承Action)

    代码如下:

//初使接口
class CommonAction extends Action{
  function _initialize() {
  // 用户权限检查
  if (C ( 'USER_AUTH_ON' ) && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))) {
   import ( 'ORG.Util.RBAC' );
   if (! RBAC::AccessDecision ()) {
    //检查认证识别号
    if (! $_SESSION [C ( 'USER_AUTH_KEY' )]) {
     //跳转到认证网关
     redirect ( PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
    }
    // 没有权限 抛出错误
    if (C ( 'RBAC_ERROR_PAGE' )) {
     // 定义权限错误页面
     redirect ( C ( 'RBAC_ERROR_PAGE' ) );
    } else {
     if (C ( 'GUEST_AUTH_ON' )) {
      $this->assign ( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
     }
     // 提示错误信息
     $this->error ( L ( '_VALID_ACCESS_' ) );
    }
   }
  }
 }
}
?>


        其他的控制都集成CommonAction

        例如:

class ArticleAction extends CommonAction
{
    function index()
   {
        $this->display();
    }
}

    接下来在项目的配置文件中写入:

$arr=array(
 'USER_AUTH_ON'=>true,
 'USER_AUTH_TYPE'   =>1,  // 默认认证类型 1 登录认证 2 实时认证
 'USER_AUTH_KEY'   =>'authId', // 用户认证SESSION标记
    'ADMIN_AUTH_KEY'   =>'administrator',
 'USER_AUTH_MODEL'  =>'User', // 默认验证数据表模型
 'AUTH_PWD_ENCODER'  =>'md5', // 用户认证密码加密方式
 'USER_AUTH_GATEWAY' =>'/Public/login', // 默认认证网关
 'NOT_AUTH_MODULE'  =>'Public',  // 默认无需认证模块
 'REQUIRE_AUTH_MODULE'=>'',  // 默认需要认证模块
 'NOT_AUTH_ACTION'  =>'',  // 默认无需认证操作
 'REQUIRE_AUTH_ACTION'=>'',  // 默认需要认证操作
    'GUEST_AUTH_ON'          => false,    // 是否开启游客授权访问
    'GUEST_AUTH_ID'           =>    0,     // 游客的用户ID
 'RBAC_ROLE_TABLE'=>'think_role',
 'RBAC_USER_TABLE' => 'think_role_user',
 'RBAC_ACCESS_TABLE' => 'think_access',
 'RBAC_NODE_TABLE' => 'think_node',
);
$arr1=include './config.inc.php';
return array_merge($arr1,$arr);

    接下来我们设置public控制器 

class PublicAction extends Action
{
 public function index()
 {
  $this->login();
 }
 public function login()
 {
  $this->display();
 }
 public function checklogin()
 {
  if(empty($_POST['username'])) {
   $this->error('帐号错误!');
  }elseif (empty($_POST['password'])){
   $this->error('密码必须!');
  }
  
  //生成认证条件
  $map=array();
  // 支持使用绑定帐号登录
  $map['username'] = $_POST['username'];
  import ( 'ORG.Util.RBAC' );
  $authInfo = RBAC::authenticate($map);
  //使用用户名、密码和状态的方式进行认证
  if(false === $authInfo) {
     $this->error('帐号不存在或已禁用!');
  }else {
      if($authInfo['password'] != md5($_POST['password'])) {
        $this->error('密码错误!');
      }
     $_SESSION[C('USER_AUTH_KEY')] = $authInfo['id'];
     if($authInfo['username']=='admin') {
           $_SESSION['administrator']  = true;
     }
         
   $_SESSION['username'] = $authInfo['account'];
   // 缓存访问权限
   RBAC::saveAccessList();
   $url=U('/index/index');
   $this->success('登录成功',$url);
}
 }
 public function loginout()
 {
  if(isset($_SESSION[C('USER_AUTH_KEY')])) {
   unset($_SESSION[C('USER_AUTH_KEY')]);
   unset($_SESSION);
   session_destroy();
   $this->assign("jumpUrl",/admin.php/Article.'/login/');
   $this->success('登出成功!');
   }else {
   $this->error('已经登出!');
  }
 }
 public function verify()
 {
  import("ORG.Util.Image");
  Image::buildImageVerify();
 }
}

打赏本站,你说多少就多少

本文地址:https://www.qi522.com/view/1.html

来     源:千奇博客

精彩评论

微信关注

Copyright © 2013-2019 千奇博客 保留所有权利 辽ICP备13008238号