thinkPHP5 ACL用户权限模块用法的详细解释

作者:袖梨 2022-06-25

本文实例讲述了thinkPHP5 ACL用户权限模块用法。分享给大家供大家参考,具体如下:

数据库

role数据库表:

 

 代码如下复制代码

`id`int(11) unsignedNOTNULLAUTO_INCREMENT,

`name`varchar(20)NOTNULLCOMMENT'角色名称',

`pid`smallint(6)DEFAULTNULLCOMMENT'父角色ID',

`rule_name` text COMMENT'规则唯一英文标识,全小写',

`type`varchar(50)DEFAULT''COMMENT'权限规则分类,请加应用前缀,如admin_',

`status` tinyint(1) unsignedDEFAULTNULLCOMMENT'状态',

`remark`varchar(255)DEFAULTNULLCOMMENT'备注',

`create_time`int(11) unsignedNOTNULLDEFAULTƆ'COMMENT'创建时间',

`update_time`int(11) unsignedNOTNULLDEFAULTƆ'COMMENT'更新时间',

`listorder`int(3)NOTNULLDEFAULTƆ'COMMENT'排序字段',

 

auth_rule数据库表:

 

 代码如下复制代码

`id` mediumint(8) unsignedNOTNULLAUTO_INCREMENT COMMENT'规则id,自增主键',

`module`varchar(20)NOTNULLCOMMENT'规则所属module',

`type`varchar(30)NOTNULLDEFAULTƇ'COMMENT'权限规则分类,请加应用前缀,如admin_',

`name`varchar(255)NOTNULLDEFAULT''COMMENT'规则唯一英文标识,全小写',

`param`varchar(255)DEFAULTNULLCOMMENT'额外url参数',

`title`varchar(20)NOTNULLDEFAULT''COMMENT'规则中文描述',

`status` tinyint(1)NOTNULLDEFAULTƇ'COMMENT'是否有效(0:无效,1:有效)',

`condition`varchar(300)NOTNULLDEFAULT''COMMENT'规则附加条件',

 

用户表里面增加:

 

 代码如下复制代码

`pools`varchar(20)DEFAULT''COMMENT'权限池',

`roleId`smallint(5)NOTNULLDEFAULTƆ'COMMENT'权限id',

 

代码如下:

 

 代码如下复制代码

iAuth.php 权限认证的公共库文件

classiAuth{

  public$user= null;

  //默认配置

  protected$_config=array(

  );

  publicfunction__construct() {

  }

  /**

   * 检查权限

   * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组

   * @param uid int      认证用户的id

   * @param relation string  如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证

   * @return boolean      通过验证返回true;失败返回false

   */

  publicfunctioncheck($uid,$name,$relation='or') {

    if(empty($uid)){

      returnfalse;

    }

    if($uid==1){

      returntrue;

    }

    if(is_string($name)) {

      $name=strtolower($name);

      if(strpos($name,',') !== false) {

        $name=explode(',',$name);

      }else{

        $name=array($name);

      }

    }

    $list=array();//保存验证通过的规则名

    //获取用户信息

    $this->getUserInfo($uid);//获取用户信息,一维数组

    $groups=$this->user['roleId'];

    if(in_array(1,$groups)){

      returntrue;

    }

    if(empty($groups)){

      returnfalse;

    }

    $rules= self::get_rules($this->user['roleId']);

    if(in_array($name,$rules))

    {

      returntrue;

    }

    returnfalse;

  }

  /**

   * 获得用户资料

   */

  privatefunctiongetUserInfo(&$uid) {

    if(!isset($this->user)){

      $user=newUsers($uid);

      $this->user =$user->fields;

    }

    return$this->user;

  }

  /**

   * 获取验证规则

   * @param int $id

   */

  publicstaticfunctionget_rules($id)

  {

    if(empty($id))returnfalse;

    $rules= Cache::get(self::$cache_prefix.$id);

    if(empty($rules))

    {

      $model= Db::name('role');

      $model->where('id',$id);

      $rules=$model->find();

      $rules['rule_name'] =explode(',',strtolower($rules['rule_name']));

      //设置缓存

      Cache::set(self::$cache_prefix,$rules);

    }

    return$rules;

  }

 

}

Common.php 通用函数类库

 

 代码如下复制代码

/**

 * 检测用户id

 * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组

 * @param uid int      认证用户的id

 */

functionsp_auth_check($uid,$name=null)

{

  if(empty($uid))returnfalse;

  if(empty($name)){

    $name=strtolower(MODULE_NAME."/".CONTROLLER_NAME."/".ACTION_NAME);

  }

  $iAuth_obj=newappCommonLibiAuth();

  return$iAuth_obj->check($uid);

}

AdminbaseController.php 后台管理的父控制器类

classAdminbaseControllerextendsController

{

  public$uid= 0;

  //用户实例

  public$userObj= null;

  /**

   * 构造函数

   * Adminbase constructor.

   */

  publicfunction__construct()

  {

    parent::__construct();

  }

  publicfunction_initialize()

  {

    $this->uid = Session::read('AdminId');

    if(!empty($this->uid ))

    {

      //检测过已经登录了

      $this->userObj = Db::name('users')->where('uid',$this->uid)->find();

      if(!$this->check_access($this->uid))

      {

        $this->error("您没有访问权限!",Url::build('admin/index/login'));

        exit();

      }

      $this->assign('admin',$this->userObj);

    }

    else

    {

      //没有登录的

      $this->error("您还没有登录!",Url::build('admin/index/login'));

      exit();

    }

  }

  /**

   * 检测权限

   * @param $uid

   */

  privatefunctioncheck_access(&$uid)

  {

    if($uid== 1)

    {

      //超级管理员

      returntrue;

    }

    $request= Request::instance();

    //如果不是这个应用池的账户也不通过

    $pools=explode(',',$this->userObj['pools']);

    if(!in_array(strtolower($request->module()),$pools)) returnfalse;

    $rule=$request->module() .'_'.$request->controller() .'_'.$request->action() ;

    $no_need_check_rules= Config::get('inc_auth.no_need_check_rules');

    if(!in_array(strtolower($rule),$no_need_check_rules))

    {

      //验证权限

      returnsp_auth_check($uid);

    }

    else

    {

      returntrue;

    }

  }

}

 

inc_auth.php 认证配置文件

 代码如下复制代码
$config['no_need_check_rules'] =array('admin_index_index','admin_index_login');

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

相关文章

精彩推荐