ThinkPHP中RBAC的权限控制之配置文件2

上期我们讲解完了配置文件,基准文件,还有各个功能模块。这一期咱们完成ThinkPHP RBAC的最后一部份,写完基准类,并实现登陆以及权限的验证功能。
咱们先来说一下基准文件,基准文件的代码如下,应大家需要,我已经把代码简单的完成了,并且写完了注释,只需要复制即可。
<?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('登录成功!');
  }(省略了部分反括号)
整个ThinkPHP中RBAC的内容就全部讲解完了。如果大家有兴趣也可以到http://bbs.lampbrother.net中进行交流,整个RBAC的难点不在于代码而在于五张表之前的结构和关系有些绕,大家可以做成后台管理功能,直接通过后台对用户组和用户进行管理。有兴趣也可以在论坛中与我进行交流。我已将RBAC的实例上传到论坛中,可以通过下载实验对比杂志中的例子来提高和理解。
附近下载地址:http://bbs.lampbrother.net/read-htm-tid-42960.html

 

零学费学习,就业后还款,PHP高薪就业班!

LAMP兄弟连原创视频光盘

LAMP兄弟连官方PHP学习交流QQ群

 


ThinkPHP中RBAC的权限控制之配置文件
上期我们讲了ThinkPHP数据库的结构,但ThinkPHP中RBAC最大的难点在于权限控制。
还记得我们之前将ThinkPHP的带演示的Full包下载到本地吗?我还让大家解压到www根目录下。
我们现在来看一下截图,并且在根目录下面建立一个ThinkPHP的入口文件。
 <?php
//定义ThinkPHP框架路径
define('THINK_PATH', './ThinkPHP');
//定义项目名称和路径
define('APP_NAME', 'Rbac');
//定义项目文件在当前目录下生成对应的项目文件
define('APP_PATH', '.');
//加载框架入口文件
require(THINK_PATH."/ThinkPHP.php");
//实例化一个网站应用实例
App::run();
?>

我们现在进入http://127.0.0.1/rbac/index.php运行一次。如出现以下界面就说明入口文件创建成功,可以进行下一步操作了:
 
运行完成之后,我们查看文件夹截图,看到的效果应该是这样的:
 
接下来我们再建一个的基准类,基准类继承自Action类,后台的所有模块均继承自该类。当用户(包括无权限用户)对项目和项目对应的模块与动作进行访问操作时,基准类会被加载,接下来会验证用户的权限列表,并且查看该用户是否有该项目,以及查看模块和动作的权限。我们将该文件命名为/BaseAction.class.php,根据我本地站点目录的布署情况,我将该文件放在生成出的项目文件Lib/Action/BaseAction.class.php中(注:根据自己布署的站点文件和项目文件特点进行放置,但一点要放在项目的Lib/Action/)。暂时我们只列举其中的一部份。代码如下:
<?php
/*
*李文凯
*/
class BaseAction extends Action {
 function _initialize() {
 }
}
?>

我们再新建一个演示用的操作模块UserAction.class.php,该文件也需要放置在Lib/Action文件夹下,内容如下:
<?php
/*
*李文凯
*/
class UserAction extends BaseAction{
 function index(){
 //仅用来测试使用,未完善功能,如有权限则会打印出“用户列表”,否则会提示用户没有权限操作
 echo '用户列表';
 }
 function edit(){
 //仅用来测试使用,未完善功能,如有权限则会打印出“编辑用户”,否则会提示用户没有权限操作
 echo '编辑用户';
 }
 function update(){
 //仅用来测试使用,未完善功能,如有权限则会打印出“更新用户”,否则会提示用户没有权限操作
 echo '更新用户';
 }
 function delete(){
 //仅用来测试使用,未完善功能,如有权限则会打印出“删除用户”,否则会提示用户没有权限操作
 echo '删除用户';
 }
 function insert(){
 //仅用来测试使用,未完善功能,如有权限则会打印出“添加用户”,否则会提示用户没有权限操作
 echo '添加用户';
 }
}
?>

接下来的这一步,我们将配置文件写完,配置文件一块是连接数据库的,一块用来启用RBAC模块的配置文件,我会在配置文件中进行详细的注释,希望大家看清楚,并且这个配置文件不需要去记忆,可以从Example下面的/Rbac/Conf路径下查看,复制即可。但一定要清楚,每一个配置的功能:
<?php
return array(
 // 如果你的环境不支持PATHINFO 请设置为3,如果发现路径不能使用或有问题请改为3即
 // 如果你的环境不支持PATHINFO 请设置为3,如果发现路径不能使用或有问题请改为3即
 'URL_MODEL'=>1,
 //说明你使用的数据库的类型
 'DB_TYPE'=>'mysql',
 //与明你使用的数据库服务器的地址,按照自己本身的具体情况来写该地址
 'DB_HOST'=>'localhost',
 //RBAC相关数据表所在的数据库的名字,根据自身实际情况填写
 'DB_NAME'=>'rbac',
 //能管理该库的mysql帐号,根据自身实际情况填写
 'DB_USER'=>'root',
 //对应帐号的密码,根据自身实际情况填写
 'DB_PWD'=>'liwenkaihaha',
 //对应mysql或其他数据库的端口,根据自身实际情阅填写
 'DB_PORT'=>'3306',
 //对应数据库的表前缀,根据自身实际情阅填写
 'DB_PREFIX'=>'think_',
 //下面一部份是RBAC的配置文件
 //USER_AUTH_ON为true的话,就意味着开启RBAC
 'USER_AUTH_ON'=>true,
 //USER_AUTH_TYPE代表ThinkPHP 权限的两种认证方式。
 //2即时模式是指即时修改用户权限即时生效
 //1即时修改权限,修改完成后用户仍在系统中的话不生效。下次登陆时才会生效
 'USER_AUTH_TYPE'=>1,
 // 默认认证类型 1 登录认证 2 实时认证
 //用来标识用户Session的标志号,字符串类型随意填写即可
 'USER_AUTH_KEY'=>'authId',
 // 用户认证SESSION标记
 //用来标识管理员的标识好,这一处非常有用。
 //我们在以后可以做一条判断,判断该如户如果是创始人,则激活这一项。避免管理员操作错权限后没办法进行登陆
 //整个系统中的权限控制体系对该标识的用户无效
 'ADMIN_AUTH_KEY'=>'administrator',
 //对应的数据库中的用户表
 'USER_AUTH_MODEL'=>'User', // 默认验证数据表模型
 'AUTH_PWD_ENCODER'=>'md5', // 用户认证密码加密方式
 //USER_AUTH_GATEWAY该项说白了就是告诉用户登陆的入口
 'USER_AUTH_GATEWAY' =>'/Public/login', // 默认认证网关
 //NOT_AUTH_MODULE,该项的意思为不需要验证的模块。public也会继承BaseAction基准类
 //如果,没有这一项,用户访问公共的登陆模块时,都会提示没有权限
 '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',
);
?>
 如果大家记不住,可以直接使用这个配置文件。

零学费学习,就业后还款,PHP高薪就业班!

LAMP兄弟连原创视频光盘

LAMP兄弟连官方PHP学习交流QQ群

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值