chenmingwei / think-auth
基于用户组的 节点/菜单 权限管理类 部分代码参考 5ini99 / think-auth
1.2.0
2019-05-21 11:43 UTC
Requires
- php: >=5.6.0
This package is auto-updated.
Last update: 2024-09-28 14:32:53 UTC
README
The ThinkPHP5.1 Auth Package 是一个基于用户组的节点/菜单 权限管理类 部分代码参考 5ini99 / think-auth
安装
composer require chenmingwei/think-auth
配置
公共配置
// auth配置,在config目录下新建一个 auth.php 配置文件
config = [
'auth_on' => 1, // 权限开关
'auth_type' => 2, // 认证方式,1为实时认证;2为登录认证。
'auth_group' => 'auth_group', // 用户组数据表名
'auth_group_access' => 'auth_group_access', // 用户-用户组关系表
'auth_group_rule' => 'auth_group_rule', // 用户组-权限规则关系表
'auth_rule' => 'auth_rule', // 权限规则表
'auth_user' => 'user', // 用户信息表
// 不需要验证权限的
'public' => [
'index/index/index',
'index/index/login'
]
];
导入数据表
think_
为自定义的数据表前缀
-------------------------------------------------
think_auth_rule,规则表,
- id:主键,
- name:验证规则,
- title:规则中文名称
- type: 0普通权限节点; 1菜单权限节点
- pid : 父级ID
- sort: 排序
- status 状态:为1正常,为0禁用,
- icon:图标
-------------------------------------------------
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 '' COMMENT '验证规则',
`title` char(20) NOT NULL DEFAULT '' COMMENT '规则中文名称',
`type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:普通权限节点;1:菜单权限节点',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级ID',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:为1正常,为0禁用',
`icon` varchar(80) NOT NULL DEFAULT '' COMMENT '图标',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='权限规则表'
-------------------------------------------------
- think_auth_group 用户组表,
- id:主键,
- title: 用户组中文名称,
- status:用户组状态 0禁用 1启用
-------------------------------------------------
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 '' COMMENT '标题',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE` (`title`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 COMMENT='用户组表'
-------------------------------------------------
- think_auth_group_access 用户与用户组关系表
- uid:用户id,
- group_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=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户与用户组关系表'
-------------------------------------------------
- think_auth_group_rule 用户组与规则关系表
- rid: 权限点rule id,
- group_id:用户组id
-------------------------------------------------
DROP TABLE IF EXISTS `think_auth_group_rule`;
CREATE TABLE `think_auth_group_rule` (
`rid` int(11) unsigned NOT NULL,
`group_id` int(11) unsigned NOT NULL,
UNIQUE KEY `uid_group_id` (`rid`,`group_id`),
KEY `rid` (`rid`),
KEY `group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组与规则关系表'
原理
Auth权限认证是按规则进行认证。在数据库中我们有
- 规则表(think_auth_rule)
- 用户组表(think_auth_group)
- 用户与用户组关系表(think_auth_group_access)
- 用户组与规则关系表(think_auth_group_rule)
我们在think_auth_rule表中定义权限规则,在think_auth_group中定义用户组,在think_auth_group_rule中定义哪些用户组与规则的关系,在think_auth_group_access中定义用户与用户组的关系。
下面举例说明:
我们要判断用户是否有显示一个操作按钮的权限,首先定义一个规则,在规则表中添加一个名为 show_button 的规则。然后在用户组表添加一个用户组,定义这个用户组有show_button 的权限规则,然后在用户组明细表定义 UID 为1 的用户属于刚才这个的用户组。
使用
权限判断方法
// 引入类库
use think\auth\Auth;
// 获取auth实例
$auth = Auth::instance();
// 检测权限
if($auth->check(1, 'show_button')){// 第一个参数用户ID,第二个参数是规则名称
//有显示操作按钮的权限
}else{
//没有显示操作按钮的权限
}
Auth类也可以对节点进行认证,我们只要将规则名称,定义为节点名称就行了。可以在公共控制器Base中定义initialize方法
<?php
namespace app\common\controller;
use think\auth\Auth;
class Base extends Common
{
protected $auth;
protected function initialize()
{
parent::initialize();
$module = request()->module();
$controller = request()->controller();
$action = request()->action();
$rule = strtolower($module) . '/' . strtolower($controller) . '/' . strtolower($action);
// 登陆验证 自行处理
$uid = session('userinfo.id');
if(!$uid){
$this->redirect('admin/login/index');
}
// 权限验证
$this->auth = new Auth();
if(!$this->auth->check($uid, $rule)){
$this->error('权限不足');
}
}
}
这时候我们可以在数据库中添加的节点规则,格式为:“模块/控制器名称/方法名称”,需要进行权限控制的控制器都继承该基类
为了方便使用,我们为Auth类扩展了几个实用方法
$auth = new Auth();
/**
* 添加一个权限组
* @param $title 组名称|必填
* @param int $status 状态
*/
$auth->addGroups($title, $status);
/**
* 改变权限组状态
* @param $group_id 用户组ID|必填
* @param int $status 状态|0:禁用 1:启用
*/
$auth->changeGroupsStatus($group_id,$status);
/**
* 为组设置权限
* @param $group_id 用户组ID
* @param $rules 权限节点ID , int | array
*/
$auth->setAuthOfGroup($group_id, $rules);
/**
* 删除用户组的权限
* @param $groups_id 用户组ID 支持数组
* @param $rules 规格ID 支持数组
*/
$auth->delRulesByGroup($groups_id, $rules);
/**
* 按用户查询用户组
* @param $uid
*/
$auth->getGroupsByUid($uid);
/**
* 按用户组查询用户
* @param $uid
*/
$auth->getUsersByGroup($group_id);
/**
* 为用户添加用户组
* @param $uid
* @param $groups_id int|array
*/
$auth->addGroupsByUid($uid, $groups_id);
/**
* 为用户组中添加用户
* @param $group_id
* @param $uids int|array
*/
$auth->addUsersByGroup($group_id, $uids);
/**
* 删除用户和用户组的关系
* @param $uid 用户ID 支持数组
* @param $groups_id 用户组ID 支持数组
*/
$auth->delUserGroupsRelation($uids, $groups_id);
/**
* 按group_id是否有权限,返回所有权限节点
* @param $group_id
*返回数据结构
[
[
"rid" => NULL
"group_id" => NULL(为空说明该组对此节点没有权限,有权限将会显示相应的group_id值)
"id" => 节点ID
"name" => 节点名
"title" => 标题
"type" => 类型 0普通节点 1菜单节点
"pid" => 父级ID
"status" => 状态 是否禁用
"icon' => 图标
"child" => 子节点
],
...
]
*/
$auth->getAuthRulesByGroup($group_id);
/**
* 按用户查询所有该用户有权限的菜单节点
* @param $uid 用户ID
* @return array
*/
$auth->getAuthMenuByUser($uid)