thinkphp中的rbac权限控制数据库的全面解析(个人笔记)

来源:互联网 发布:mac玩刺客信条卡怎么办 编辑:程序博客网 时间:2024/06/05 11:11

之前做的一些网站,权限控制都是自己来写的,虽然不难,但是安全性不高,用thinkphp里扩展的rbac权限控制,就能够很容易达到一种多权限控制的目的,而且安全性也比较高,下面我来跟大家详细讲一下rbac里面数据库的一些重点内容

rbac数据库有5个表,重点的表内容会有文字说明,等下我会把sql语句贴出


think_user表,用户表

id:用户id

name:用户名

password:用户密码


think_role表,用户组表

id:用户id

name:用户组名字

pid:用户组父id

status:状态,1开启,0关闭


think_node表,节点表

id:节点id

name:项目or模板or方法名称(注意大小写)

pid:节点父id(区分方法重名)

level:节点等级,1-》项目,2-》模板,3-》方法

status:状态


think_role_user表,用户组和用户对应关系表

role_id:用户组id

user_id:用户id


think_access表,用户组和节点对应的表

role_id:用户组id

node_id:节点id

level:节点等级

pid:节点父id


看图片有助于理解各个表之间的关系


使用的时候,记得要把status设为1,默认是0,不然也会提示没有权限的

下面贴一些代码,有注释

判断是否登录的代码,方法名是_initialize,如果其他类继承这个类,就会默认加载这个方法,达到权限判断的目的

<?php

//所有权限验证的类都需要继承这个类

       class BaseAction extends Action{

           //这是thinkphp中自带的一个始使化方法,加载类的时候会首先调有和这个方法

              function _initialize(){

    //header发送头信息,页面编码为utf=8格式

              header("Content-Type:text/html; charset=utf-8");

//判断是否开始了用户认证,C()是快速读取配置文件的方法,MODEL_NAME是当前模块的名称,

//通过in_array函数检测当前调用的模块是否在不需要验证的验块中,如果是的话,取反,不进行验证。

              if(C('USER_AUTH_ON') && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))){

        //调用thinkphp自带的RBAC类

                     import('ORG.Util.RBAC');

      //通过RBAC类中的AccessDecision获取与权限相关的信息,如果没有获取到则执行以下部份

                     if(!RBAC::AccessDecision()){

                            //获取SESSION中的用户标识号,如果没有则用户没有登陆

                            if(!$_SESSION[C('USER_AUTH_KEY')]){

                                   $this->assign('jumpUrl',__APP__.'/Public/login');

                                   $this->error('对不起,你没有登录!请重新登录');

                            }

                            //检测是否开始了游客认证方式

                            if(C('GUEST_AUTH_ON')){

                            }

                            //通过$this->error方法弹出错误_VALID_ACCESS_为THINKPHP已设定好的与访问//控制有关的错误提示.采用L()方式来进行读取。

                            $this->error(L('_VALID_ACCESS_'));

                     }

              }

       }

}

?>


登出和判断密码是否正确的代码

<?php

class PublicAction extends Action {

       //如果输入的是index的话也让其显示login页的模版

       function index(){


              $this->display('login');

       }


        //退出动作

        public function logout()

    {

               //检测是否设置了USER_AUTH_KEY

        if(isset($_SESSION[C('USER_AUTH_KEY')])) {

                     //删除USER_AUTH_KEY

                     unset($_SESSION[C('USER_AUTH_KEY')]);

          //注稍这个session_id所有的内容

                     unset($_SESSION);

                //调用session_destory()删除所有内容

                     session_destroy();

        //设置退出成功的跳转页

            $this->assign("jumpUrl",__URL__.'/login/');

            $this->success('登出成功!');

        }else {

            $this->error('已经登出!');

        }

    }


       // 登录检测的方法,登陆表单中的action地址需要写这一个地址

       public function checkLogin() {

              //如果用户名密码(可在此外加验证码)为空则直接阻止用户访问

              if(empty($_POST['username'])) {

                     $this->error('帐号错误!');

              }elseif (empty($_POST['password'])){

                     $this->error('密码必须!');

              }

        //生成认证条件

        $map            =   array();

              // 支持使用绑定帐号登录,将获得到用户名放到$map中

              $map['username']    = $_POST['username'];

              //加载RBAC类

              import ( 'ORG.Util.RBAC' );

                //通过authenticate去读取出来所有的用户信息,仅传用户名即可

        $authInfo = RBAC::authenticate($map);

        //使用用户名、密码和状态的方式进行认证

         //如果没有获取到信息

        if(false === $authInfo) {

            $this->error('帐号不存在或已禁用!');

        }else {

                      //通过$authinfo获取的信息与post当中的md5密码进行对比

            if($authInfo['password'] != md5($_POST['password'])) {

                   $this->error('密码错误!');

            }

            //激活用户标识号

            $_SESSION[C('USER_AUTH_KEY')]   =     $authInfo['id'];

                //如果用户标识号是管理员,则激活管理员标识,具有一切可访问权限

if($authInfo['account']=='admin') {

                   $_SESSION['administrator']            =     true;

            }

                     // 通过RBAC类中的静态方法saveAccessList缓存访问权限

            RBAC::saveAccessList();

                     $this->success('登录成功!');

              }

       }

}

?>


需要sql文件请留邮箱!115rbacrbac[1].sql.zip