Thinkphp中RBAC的权限控制之配置文件(RBAC详解之连载3)

来源:互联网 发布:广州网签数据统计 编辑:程序博客网 时间:2024/05/18 02:04

 期我们讲解完了配置文件,基准文件,还有各个功能模块。这一期咱们完成thinkphpRBAC的最后一部份,写完基准类,并实现登陆以及权限的验证功能。

咱们先来说一下基准文件,基准文件的代码如下,大家需要,我已经跟大家简化完成,并且写完了注释,只需要复制即可。

<?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_'));

            }

      }

}

}

 

 

?>

 

 

基准文件说完了,那总得有一个登陆页和用户退出页吧?不然怎么激活用户的权限信息和SESSION相关的信息呢?我们将这页命名为Public,这个模块我们仅需要做好用户登陆和用户退出两个动作即可。可继承也可以不继承BaseAction。继承的话,必须要在配置文件中加上这一个这个模块,多个模块请用逗号分隔。'NOT_AUTH_MODULE'             =>'Public',如果不加的话根本不会经过BaseActoin,也不会经过_initialize()方法。与在'NOT_AUTH_MODULE'可写上模块名称效果是一样的。切记,一定要将这个模块设为不认证的模块或不继承BaseAction,如若不然。用户进入登陆页和退出都需要相关的权限。根本登不进来,或者退不出去。

      Public文件如下:、

      <?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('登录成功!');

 

           }

      }

}

?>

整个thinkphpRBAC的内容就全部讲解完了。如果大家有兴趣也可以到http://bbs.lampbrother.net中进行交流,整个RBAC的难点不在于代码而在于五张表之前的结构和关系有些绕,大家可以做成后台管理功能,直接通过后台对用户组和用户进行管理。有兴趣也可以在论坛中与我进行交流。我已将RBAC的实例上传到论坛中,可以通过下载实验对比杂志中的例子来提高理解。附近下载地址:   http://bbs.lampbrother.net/read-htm-tid-42960.html

原创粉丝点击