thinkphp实现auth权限管理

很多地方我们都会用到权限管理这个东西,一般会用到RBAC,基于角色的访问控制(Role-Based Access Control),今天就来说说在thinkphp里面比RBAC更好的权限认证方式 最新版,Auth类认证.

Auth 类已经在ThinkPHP代码仓库中存在很久了,他比RBAC更方便好用,非常拉轰。

Auth权限控制是按规则认证,首先先说说原理,在数据库中我们有  规则表(think_auth_rule) ,用户组表(think_auth_group), 用户组明细表(think_auth_group_access)我们在规则表中定义权限规则 , 在用户组表中定义每个用户组有哪些权限规则,在用户组明显表中 定义用户所属的用户组。 下面举例说明。

先简单点说,就是把用户分类成组,然后赋予把权限指向给组,然后通过判断所属用户组有没有权限决定相应的操作。看下面的图,第一个 think_auth_group_access,uid为2的用户属于组2,组2属于游客组,他具有的权限为1和2,用户id为3的属于组1,属于管理组,对应权限为1,2,3,4,5 ,再看具体的权限,每个数字对应者相应的权限

2016-09-11 18-20-56屏幕截图.png

现在来说说实现过程,

在THINKPHP的安装包路径里面可以看到auth类,里面有create table语句,建好表,

2016-09-11 18-22-40屏幕截图.png

 //这里我直接贴出来了。
DROP TABLE IF EXISTS `think_auth_rule`;
CREATE TABLE `think_auth_rule` (  
   `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,  
   `name` char(80) NOT NULL DEFAULT '',  
   `title` char(20) NOT NULL DEFAULT '',  
   `type` tinyint(1) NOT NULL DEFAULT '1',    
   `status` tinyint(1) NOT NULL DEFAULT '1',  
   `condition` char(100) NOT NULL DEFAULT '',  # 规则附件条件,满足附加条件的规则,才认为是有效的规则
   PRIMARY KEY (`id`),  
   UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group 用户组表,
-- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group`;
CREATE TABLE `think_auth_group` (
   `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
   `title` char(100) NOT NULL DEFAULT '',
   `status` tinyint(1) NOT NULL DEFAULT '1',
   `rules` char(80) NOT NULL DEFAULT '',
   PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group_access 用户组明细表
-- uid:用户idgroup_id:用户组id
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group_access`;
CREATE TABLE `think_auth_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;


如何鉴定权限?下面给个简单示例 写个公共控制在需要的控制器都继承他

<?php
/**
 * Created by PhpStorm.
 * User: kok
 * Date: 16-9-11
 * Time: 下午5:17
 */
namespace Home\Controller;
use Think\Controller;

class loginController extends Controller{
    public function _initialize(){
        session('uid',2);//测试方便就直接这样做了 生产环境 你懂得该如何做的
        $auth= new \Think\Auth();
        if(!$auth->check(CONTROLLER_NAME.'/'.ACTION_NAME,session('uid'))){
        //注意这几个 CONTROLLER_NAME 控制器 /URL连接分割符 ACTION_NAME 方法名
        
            $this->error('你没有权限');
        }
    }

    public function index(){
        echo mt_rand();
    }

    function tt(){
        echo '测试成功!';
    }
}

Auth 类 还可以多个规则一起认证 ,具体的去看AUTH类的源代码 关于check这部分.

在使用auth类之前还需要配置config.php

'AUTH_CONFIG'=>array(
         'AUTH_ON' => true, //认证开关
         'AUTH_TYPE' => 1, // 认证方式,1为时时认证;2为登录认证。
         'AUTH_GROUP' => 'think_auth_group', //用户组数据表名
         'AUTH_GROUP_ACCESS' => 'think_auth_group_access', //用户组明细表
         'AUTH_RULE' => 'think_auth_rule', //权限规则表
         'AUTH_USER' => 'think_members'//用户信息表
     )


Auth类还可以按用户属性进行判断权限, 比如 按照用户积分进行判断, 假设我们的用户表 (think_members) 有字段 score  记录了用户积分。
  我在规则表添加规则时,定义规则表的condition 字段,condition字段是规则条件, 默认为空 表示没有附加条件, 用户组中只有规则 就通过认证。 如果定义了 condition字段, 用户组中有规则 不一定能通过认证, 程序还会判断是否满足 附加条件。   比如我们添加几条规则:
    name字段: grade1 ,   condition字段: {score}<100
    name字段: grade2,   condition字段: {score}>100 and {score}<200
    name 字段:  grade3, condition字段  : {score}>200 and {score}<300

这里 {score} 表示 think_members 表 中字段 score的值。

那么这时候
$auth->check('grade1',uid) 是判断用户积分是不是0-100
$auth->check('grade2',uid) 判断用户积分是不是在100-200
$auth->check('grade3',uid) 判断用户积分是不是在200-300

Auth 类认证的使用方法 大致如上,是否有点相见恨晚的感觉? 

我们的努力决定了我们的高度,good luck~~

2016-09-22 11:49:03

2016-09-22 11:22:08
nickname
content