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

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

2013-08-054687人围观
简介 最近在用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();

    }

}

?>

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

精彩评论

微信关注

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