首頁 後端開發 php教程 關於thinkPHP5框架auth權限控制類別與用法的解析

關於thinkPHP5框架auth權限控制類別與用法的解析

Jun 12, 2018 pm 04:35 PM
auth 權限控制

这篇文章主要介绍了thinkPHP5框架auth权限控制类与用法,结合实例形式分析了thinkPHP5框架扩展auth权限控制类的定义与使用方法,代码注释中备有较为详尽的使用说明与数据库操作语句,需要的朋友可以参考下

本文实例讲述了thinkPHP5框架auth权限控制类。分享给大家供大家参考,具体如下:

这个是比较简单的用法:

直接把类贴出来,这里我改了,我没有用uid,因为我建的表是admin表,所以代码里对应查询改成了aid

还有表名,我都去掉了前缀

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2011 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: luofei614 <weibo.com/luofei614> 
// +----------------------------------------------------------------------
namespace auth;
/**
 * 权限认证类
 * 功能特性:
 * 1,是对规则进行认证,不是对节点进行认证。用户可以把节点当作规则名称实现对节点进行认证。
 *   $auth=new Auth(); $auth->check(&#39;规则名称&#39;,&#39;用户id&#39;)
 * 2,可以同时对多条规则进行认证,并设置多条规则的关系(or或者and)
 *   $auth=new Auth(); $auth->check(&#39;规则1,规则2&#39;,&#39;用户id&#39;,&#39;and&#39;)
 *   第三个参数为and时表示,用户需要同时具有规则1和规则2的权限。 当第三个参数为or时,表示用户值需要具备其中一个条件即可。默认为or
 * 3,一个用户可以属于多个用户组(think_auth_group_access表 定义了用户所属用户组)。我们需要设置每个用户组拥有哪些规则(think_auth_group 定义了用户组权限)
 *
 * 4,支持规则表达式。
 *   在think_auth_rule 表中定义一条规则时,如果type为1, condition字段就可以定义规则表达式。 如定义{score}>5 and {score}<100 表示用户的分数在5-100之间时这条规则才会通过。
 */
//数据库
/*
-- ----------------------------
-- think_auth_rule,规则表,
-- id:主键,name:规则唯一标识(就是常见的路由列表,如:admin/index/index), title:规则中文名称,例如添加商品 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证
-- ----------------------------
 DROP TABLE IF EXISTS `auth_rule`;
CREATE TABLE `auth_rule` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `name` char(80) NOT NULL DEFAULT &#39;&#39;,
  `title` char(20) NOT NULL DEFAULT &#39;&#39;,
  `type` tinyint(1) NOT NULL DEFAULT &#39;1&#39;,
  `status` tinyint(1) NOT NULL DEFAULT &#39;1&#39;,
  `condition` char(100) NOT NULL DEFAULT &#39;&#39;, # 规则附件条件,满足附加条件的规则,才认为是有效的规则
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- auth_group 用户组表,
-- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用
-- ----------------------------
 DROP TABLE IF EXISTS `auth_group`;
CREATE TABLE `auth_group` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL DEFAULT &#39;&#39;,
  `status` tinyint(1) NOT NULL DEFAULT &#39;1&#39;,
  `rules` char(80) NOT NULL DEFAULT &#39;&#39;,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- group_access 用户组明细表
-- uid:用户id,group_id:用户组id
-- ----------------------------
DROP TABLE IF EXISTS `group_access`;
CREATE TABLE `group_access` (
  `uid` mediumint(8) unsigned NOT NULL,
  `group_id` mediumint(8) unsigned NOT NULL,
  UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
  KEY `uid` (`uid`),
  KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 */
class Auth{
  //默认配置
  protected $_config = array(
    &#39;auth_on&#39;      => true,           // 认证开关
    &#39;auth_type&#39;     => 1,             // 认证方式,1为实时认证;2为登录认证。
    &#39;auth_group&#39;    => &#39;auth_group&#39;,    // 用户组数据表名
    &#39;auth_group_access&#39; => &#39;group_access&#39;, // 用户-用户组关系表
    &#39;auth_rule&#39;     => &#39;auth_rule&#39;,     // 权限规则表
    &#39;auth_user&#39;     => &#39;admin&#39;       // 用户信息表
  );
  public function __construct() {
    if (config(&#39;auth_config&#39;)) {
      //可设置配置项 auth_config, 此配置项为数组。
      $this->_config = array_merge($this->_config, config(&#39;auth_config&#39;));
    }
  }
  /**
   * 检查权限
   * @param name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
   * @param uid int      认证用户的id
   * @param string mode    执行check的模式
   * @param relation string  如果为 &#39;or&#39; 表示满足任一条规则即通过验证;如果为 &#39;and&#39;则表示需满足所有规则才能通过验证
   * @return boolean      通过验证返回true;失败返回false
   */
  public function check($name, $uid, $type=1, $mode=&#39;url&#39;, $relation=&#39;or&#39;) {
    if (!$this->_config[&#39;auth_on&#39;])
      return true;
    $authList = $this->getAuthList($uid,$type); //获取用户需要验证的所有有效规则列表
    if (is_string($name)) {
      $name = strtolower($name);
      if (strpos($name, &#39;,&#39;) !== false) {
        $name = explode(&#39;,&#39;, $name);
      } else {
        $name = array($name);
      }
    }
    $list = array(); //保存验证通过的规则名
    if ($mode==&#39;url&#39;) {
      $REQUEST = unserialize( strtolower(serialize($_REQUEST)) );
    }
    foreach ( $authList as $auth ) {
      $query = preg_replace(&#39;/^.+\?/U&#39;,&#39;&#39;,$auth);
      if ($mode==&#39;url&#39; && $query!=$auth ) {
        parse_str($query,$param); //解析规则中的param
        $intersect = array_intersect_assoc($REQUEST,$param);
        $auth = preg_replace(&#39;/\?.*$/U&#39;,&#39;&#39;,$auth);
        if ( in_array($auth,$name) && $intersect==$param ) { //如果节点相符且url参数满足
          $list[] = $auth ;
        }
      }else if (in_array($auth , $name)){
        $list[] = $auth ;
      }
    }
    if ($relation == &#39;or&#39; and !empty($list)) {
      return true;
    }
    $diff = array_diff($name, $list);
    if ($relation == &#39;and&#39; and empty($diff)) {
      return true;
    }
    return false;
  }
  /**
   * 根据用户id获取用户组,返回值为数组
   * @param uid int   用户id
   * @return array    用户所属的用户组 array(
   *   array(&#39;uid&#39;=>&#39;用户id&#39;,&#39;group_id&#39;=>&#39;用户组id&#39;,&#39;title&#39;=>&#39;用户组名称&#39;,&#39;rules&#39;=>&#39;用户组拥有的规则id,多个,号隔开&#39;),
   *   ...)
   */
  public function getGroups($uid) {
    static $groups = array();
    if (isset($groups[$uid]))
      return $groups[$uid];
    $user_groups = \think\Db::name($this->_config[&#39;auth_group_access&#39;])
      ->alias(&#39;a&#39;)
      ->join($this->_config[&#39;auth_group&#39;]." g", "g.id=a.group_id")
      ->where("a.aid=&#39;$uid&#39; and g.status=&#39;1&#39;")
      ->field(&#39;aid,group_id,title,rules&#39;)->select();
    $groups[$uid] = $user_groups ? $user_groups : array();
    return $groups[$uid];
  }
  /**
   * 获得权限列表
   * @param integer $uid 用户id
   * @param integer $type
   */
  protected function getAuthList($uid,$type) {
    static $_authList = array(); //保存用户验证通过的权限列表
    $t = implode(&#39;,&#39;,(array)$type);
    if (isset($_authList[$uid.$t])) {
      return $_authList[$uid.$t];
    }
    if( $this->_config[&#39;auth_type&#39;]==2 && isset($_SESSION[&#39;_auth_list_&#39;.$uid.$t])){
      return $_SESSION[&#39;_auth_list_&#39;.$uid.$t];
    }
    //读取用户所属用户组
    $groups = $this->getGroups($uid);
    $ids = array();//保存用户所属用户组设置的所有权限规则id
    foreach ($groups as $g) {
      $ids = array_merge($ids, explode(&#39;,&#39;, trim($g[&#39;rules&#39;], &#39;,&#39;)));
    }
    $ids = array_unique($ids);
    if (empty($ids)) {
      $_authList[$uid.$t] = array();
      return array();
    }
    $map=array(
      &#39;id&#39;=>array(&#39;in&#39;,$ids),
      &#39;type&#39;=>$type,
      &#39;status&#39;=>1,
    );
    //读取用户组所有权限规则
    $rules = \think\Db::name($this->_config[&#39;auth_rule&#39;])->where($map)->field(&#39;condition,name&#39;)->select();
    //循环规则,判断结果。
    $authList = array();  //
    foreach ($rules as $rule) {
      if (!empty($rule[&#39;condition&#39;])) { //根据condition进行验证
        $user = $this->getUserInfo($uid);//获取用户信息,一维数组
        $command = preg_replace(&#39;/\{(\w*?)\}/&#39;, &#39;$user[\&#39;\\1\&#39;]&#39;, $rule[&#39;condition&#39;]);
        //dump($command);//debug
        @(eval(&#39;$condition=(&#39; . $command . &#39;);&#39;));
        if ($condition) {
          $authList[] = strtolower($rule[&#39;name&#39;]);
        }
      } else {
        //只要存在就记录
        $authList[] = strtolower($rule[&#39;name&#39;]);
      }
    }
    $_authList[$uid.$t] = $authList;
    if($this->_config[&#39;auth_type&#39;]==2){
      //规则列表结果保存到session
      $_SESSION[&#39;_auth_list_&#39;.$uid.$t]=$authList;
    }
    return array_unique($authList);
  }
  /**
   * 获得用户资料,根据自己的情况读取数据库
   */
  protected function getUserInfo($uid) {
    static $userinfo=array();
    if(!isset($userinfo[$uid])){
       $userinfo[$uid]=\think\Db::name($this->_config[&#39;auth_user&#39;])->where(array(&#39;aid&#39;=>$uid))->find();
    }
    return $userinfo[$uid];
  }
}
登入後複製

Auth.php放在extend下面的auth目录里,命名空间为auth

然后在使用的控制器中使用构造方法,或者继承一个使用了构造方法的控制器,构造方法如下:

public function _initialize()
{
    $aid = 1;
    $auth = new \auth\Auth();
    $request = Request::instance();
    $au = $auth->check($request->module() . &#39;/&#39; . $request->controller() . &#39;/&#39; . $request->action(), $aid);
    if (!$au) {// 第一个参数是规则名称,第二个参数是用户UID
      /* return array(&#39;status&#39;=>&#39;error&#39;,&#39;msg&#39;=>&#39;有权限!&#39;);*/
      $this->error(&#39;你没有权限&#39;);
    }
}
登入後複製

上面的$aid应该是用户登录以后获取的,正常情况下应该是session()获取的用户id

相关业务逻辑可以自行判断,剩下的就是添加全县,用户组添加啊,等等系列增删改查了。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

利用thinkPHP5框架实现基于ajax的分页功能解析

thinkPHP5框架中widget的功能与用法解析

Thinkphp和Bootstrap结合打造个性分页的样式

以上是關於thinkPHP5框架auth權限控制類別與用法的解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
使用PHP和SQLite實現使用者權限和存取控制 使用PHP和SQLite實現使用者權限和存取控制 Jul 29, 2023 pm 02:33 PM

使用PHP和SQLite實現使用者權限和存取控制在現代的web應用程式中,使用者權限和存取控制是非常重要的一部分。透過正確的權限管理,可以確保只有經過授權的使用者能夠存取特定的頁面和功能。在本文中,我們將學習如何使用PHP和SQLite來實現基本的使用者權限和存取控制。首先,我們需要建立一個SQLite資料庫來儲存使用者和其權限的資訊。下面是簡單的使用者表和權限表的結構

如何在uniapp中實現權限控制與使用者管理 如何在uniapp中實現權限控制與使用者管理 Oct 20, 2023 am 11:15 AM

如何在uniapp中實現權限控制和使用者管理隨著行動應用程式的發展,權限控制和使用者管理成為了應用程式開發的重要一環。在uniapp中,我們可以使用一些實用的方法來實現這兩個功能,提高應用程式的安全性和使用者體驗。本文將介紹如何在uniapp中實現權限控制和使用者管理,並提供一些具體程式碼範例供參考。一、權限控制權限控制是指在應用程式中對不同使用者或使用者群組設定不同的操作權限,以保護應

Laravel中的使用者管理與權限控制:實現多使用者和角色分配 Laravel中的使用者管理與權限控制:實現多使用者和角色分配 Aug 12, 2023 pm 02:57 PM

Laravel中的使用者管理和權限控制:實現多使用者和角色分配引言:在現代的Web應用程式中,使用者管理和權限控制是非常重要的功能之一。 Laravel作為一個流行的PHP框架,提供了強大而靈活的工具來實現多使用者和角色分配的權限控制。本文將介紹如何在Laravel中實現使用者管理和權限控制的功能,並提供相關的程式碼範例。一、安裝與設定首先,在Laravel中實現使用者管理

Laravel權限功能的最佳實務:如何正確控制使用者權限 Laravel權限功能的最佳實務:如何正確控制使用者權限 Nov 02, 2023 pm 12:32 PM

Laravel權限功能的最佳實踐:如何正確控制使用者權限,需要具體程式碼範例引言:Laravel是一款非常強大且流行的PHP框架,提供了許多功能和工具來幫助我們開發高效和安全的Web應用程式。其中一個重要的功能是權限控制,即根據使用者角色和權限來限制其存取應用程式中的不同部分。正確的權限控制是任何網路應用程式的關鍵組成部分,它可以保護敏感資料和功能不被未授權的

如何實現PHP的使用者登入與權限控制? 如何實現PHP的使用者登入與權限控制? Jun 29, 2023 pm 02:28 PM

如何實現PHP的使用者登入與權限控制?在開發網頁應用程式時,使用者登入和權限控制是非常重要的功能之一。透過使用者登錄,我們可以對使用者進行身份驗證,並且基於使用者的權限進行一系列的操作控制。本文將介紹如何使用PHP實作使用者登入和權限控制功能。一、使用者登入功能實現使用者登入功能是使用者驗證的第一步,只有透過驗證的使用者才能進一步進行操作。以下是一個基本的使用者登入實作過程:創

C#中如何使用權限控制和身份驗證 C#中如何使用權限控制和身份驗證 Oct 09, 2023 am 11:01 AM

C#中如何使用權限控制和身份驗證,需要具體程式碼範例在當今網路時代,資訊安全問題受到了越來越高的重視。為了保護系統和資料的安全,權限控制和身份驗證成為了開發者不可或缺的一部分。 C#作為一種常用的程式語言,提供了豐富的功能和類別庫來幫助我們實現權限控制和身份驗證。權限控制是指根據使用者的身分、角色和權限等,限制使用者對特定資源的存取權限。實現權限控制的常見方式是

Java API 開發中使用 Auth0 進行身分認證 Java API 開發中使用 Auth0 進行身分認證 Jun 18, 2023 pm 05:30 PM

在現代軟體開發中,身分認證是一項非常重要的安全措施。 Auth0是一家提供身分認證服務的公司,它可以幫助開發者快速實現多種身分認證方式(包括OAuth2、OpenIDConnect等),並提供安全可靠的認證服務。在本文中,我們將介紹如何在JavaAPI開發中使用Auth0進行身份認證。第一步:建立Auth0帳號並註冊應用程式首先,我們需要在

如何在Zend框架中使用ACL(Access Control List)進行權限控制 如何在Zend框架中使用ACL(Access Control List)進行權限控制 Jul 29, 2023 am 09:24 AM

如何在Zend框架中使用ACL(AccessControlList)進行權限控制導言:在一個Web應用程式中,權限控制是至關重要的功能。它可以確保使用者只能存取其有權存取的頁面和功能,並防止未經授權的存取。 Zend框架提供了一種方便的方法來實現權限控制,即使用ACL(AccessControlList)元件。本文將介紹如何在Zend框架中使用ACL

See all articles