thinkphp-auth
thinkphp-auth copied to clipboard
thinkphp-auth
éç¨äºthinkphpæéæ©å±
å®è£
//thinkphp5.1
composer require liliuwei/thinkphp-auth=1.0.*
//thinkphp6.0
composer require liliuwei/thinkphp-auth=2.0.*
é ç½®
// å®è£
ä¹åä¼å¨configç®å½éçæauth.phpé
ç½®æ件
return[
// æé设置
'auth_config' => [
'auth_on' => true, // 认è¯å¼å
³
'auth_type' => 1, // 认è¯æ¹å¼ï¼1为å®æ¶è®¤è¯ï¼2为ç»å½è®¤è¯ã
'auth_group' => 'tp_auth_group', // ç¨æ·ç»æ°æ®è¡¨å
'auth_group_access' => 'tp_auth_group_access', // ç¨æ·-ç¨æ·ç»å
³ç³»è¡¨
'auth_rule' => 'tp_auth_rule', // æéè§å表
'auth_user' => 'tp_admin' // ç¨æ·ä¿¡æ¯è¡¨
],
];
å¯¼å ¥æ°æ®è¡¨
/*
-- ----------------------------
-- tp_adminï¼ç¨æ·è¡¨ï¼
-- id:主é®ï¼is_adminï¼æ¯å¦æ¯ç®¡çå
-- ----------------------------
DROP TABLE IF EXISTS `tp_admin`;
CREATE TABLE `tp_admin` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '管çåID',
`is_admin` tinyint(1) NOT NULL DEFAULT '0',
`username` varchar(50) NOT NULL DEFAULT '' COMMENT '管çåç¨æ·å',
`fullname` varchar(50) NOT NULL DEFAULT '',
`phone` varchar(20) NOT NULL DEFAULT '',
`password_reset_token` varchar(255) NOT NULL DEFAULT '',
`access_token` varchar(32) NOT NULL DEFAULT '',
`email` varchar(255) NOT NULL DEFAULT '' COMMENT 'é®ç®±',
`password` varchar(32) NOT NULL DEFAULT '' COMMENT '管çåå¯ç ',
`login_times` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'ç»é次æ°',
`login_ip` varchar(20) NOT NULL DEFAULT '' COMMENT 'IPå°å',
`login_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'ç»éæ¶é´',
`last_login_ip` varchar(255) NOT NULL DEFAULT '' COMMENT 'ä¸æ¬¡ç»éip',
`last_login_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'ä¸æ¬¡ç»éæ¶é´',
`user_agent` varchar(500) NOT NULL DEFAULT '' COMMENT 'user_agent',
`create_time` int(10) unsigned NOT NULL DEFAULT '0',
`update_time` int(10) NOT NULL DEFAULT '0',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1å¯ç¨0ç¦ç¨',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- tp_auth_ruleï¼è§å表ï¼
-- id:主é®ï¼nameï¼è§åå¯ä¸æ è¯, titleï¼è§åä¸æå称 status ç¶æï¼ä¸º1æ£å¸¸ï¼ä¸º0ç¦ç¨ï¼conditionï¼è§å表达å¼ï¼ä¸ºç©ºè¡¨ç¤ºåå¨å°±éªè¯ï¼ä¸ä¸ºç©ºè¡¨ç¤ºæç
§æ¡ä»¶éªè¯
-- ----------------------------
DROP TABLE IF EXISTS `tp_auth_rule`;
CREATE TABLE `tp_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=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- tp_auth_group ç¨æ·ç»è¡¨ï¼
-- idï¼ä¸»é®ï¼ title:ç¨æ·ç»ä¸æåç§°ï¼ rulesï¼ç¨æ·ç»æ¥æçè§åidï¼ å¤ä¸ªè§å","éå¼ï¼status ç¶æï¼ä¸º1æ£å¸¸ï¼ä¸º0ç¦ç¨
-- ----------------------------
DROP TABLE IF EXISTS `tp_auth_group`;
CREATE TABLE `tp_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=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- tp_auth_group_access ç¨æ·ç»æç»è¡¨
-- uid:ç¨æ·idï¼group_idï¼ç¨æ·ç»id
-- ----------------------------
DROP TABLE IF EXISTS `tp_auth_group_access`;
CREATE TABLE `tp_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 AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
*/
ç¨æ³ç¤ºä¾
使ç¨æ¹æ³åthinkphp3.2带çAuthç±»å®å ¨ä¸è´ï¼
æ¬ç±»åºçå½å空é´ä¸ºï¼ namespace liliuwei\think;
æè 使ç¨$auth = new \liliuwei\think\Auth();
/**
* æé认è¯ç±»
* åè½ç¹æ§ï¼
* 1ï¼æ¯å¯¹è§åè¿è¡è®¤è¯ï¼ä¸æ¯å¯¹èç¹è¿è¡è®¤è¯ãç¨æ·å¯ä»¥æèç¹å½ä½è§åå称å®ç°å¯¹èç¹è¿è¡è®¤è¯ã
* $auth = new \liliuwei\think\Auth(); $auth->check('è§åå称','ç¨æ·id')
* 2ï¼å¯ä»¥åæ¶å¯¹å¤æ¡è§åè¿è¡è®¤è¯ï¼å¹¶è®¾ç½®å¤æ¡è§åçå
³ç³»ï¼oræè
andï¼
* $auth = new \liliuwei\think\Auth(); $auth->check('è§å1,è§å2','ç¨æ·id','and')
* 第ä¸ä¸ªåæ°ä¸ºandæ¶è¡¨ç¤ºï¼ç¨æ·éè¦åæ¶å
·æè§å1åè§å2çæéã å½ç¬¬ä¸ä¸ªåæ°ä¸ºoræ¶ï¼è¡¨ç¤ºç¨æ·å¼éè¦å
·å¤å
¶ä¸ä¸ä¸ªæ¡ä»¶å³å¯ãé»è®¤ä¸ºor
* 3ï¼ä¸ä¸ªç¨æ·å¯ä»¥å±äºå¤ä¸ªç¨æ·ç»(tp_auth_group_access表 å®ä¹äºç¨æ·æå±ç¨æ·ç»)ãæ们éè¦è®¾ç½®æ¯ä¸ªç¨æ·ç»æ¥æåªäºè§å(tp_auth_group å®ä¹äºç¨æ·ç»æé)
*
* 4ï¼æ¯æè§å表达å¼ã
* å¨tp_auth_rule 表ä¸å®ä¹ä¸æ¡è§åæ¶ï¼å¦ætype为1ï¼ conditionå段就å¯ä»¥å®ä¹è§å表达å¼ã å¦å®ä¹{score}>5 and {score}<100 表示ç¨æ·çåæ°å¨5-100ä¹é´æ¶è¿æ¡è§åæä¼éè¿ã
*/
//以ä¸å®ä¾ä»¥thinkphp5.1为ä¾è¯´æ
<?php
//ç®åå®ä¾
namespace app\admin\controller;
use think\Controller;
class Base extends Controller
{
public function initialize()
{
if (!session('admin_id')) {
$this->redirect('login/index');
}
$auth = new \liliuwei\think\Auth();
$controller = strtolower(request()->controller());
$action = strtolower(request()->action());
$url = $controller . "/" . $action;
if (!$auth->check($url, session('admin_id'))) {
$this->error('æ±æï¼æ¨æ²¡ææä½æé');
}
}
}
<?php
//é«çº§å®ä¾ æ ¹æ®ç¨æ·ç§¯åå¤ææé
//Authç±»è¿å¯ä»¥æç¨æ·å±æ§è¿è¡å¤ææéï¼ æ¯å¦ æç
§ç¨æ·ç§¯åè¿è¡å¤æï¼å设æ们çç¨æ·è¡¨ (tp_admin) æå段 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 = new \liliuwei\think\Auth();
$auth->check('grade1', 1); //æ¯å¤æç¨æ·ç§¯åæ¯ä¸æ¯0-100
$auth->check('grade2', 1); //å¤æç¨æ·ç§¯åæ¯ä¸æ¯å¨100-200
$auth->check('grade3', 1); //å¤æç¨æ·ç§¯åæ¯ä¸æ¯å¨200-300
<?php
//é«çº§å®ä¾ å³ä¾§èåæ ¹æ®æééèå®ä¾
namespace app\admin\controller;
use think\Controller;
use think\Db;
class Base extends Controller
{
public function initialize()
{
if (!session('admin_id')) {
$this->redirect('login/index');
}
$auth = new \liliuwei\think\Auth();
$controller = strtolower(request()->controller());
$action = strtolower(request()->action());
$url = $controller . "/" . $action;
$data = Db::name('auth_rule')->order('sort','asc')->select();
$data = list_to_tree($data);
//æé¤ä¸éè¦éªè¯çè§å
$no_check_default = ['index/index'];
$no_check_status_list = Db::name('auth_rule')->where('status', 0)->column('name');
$no_check_rules_list = explode(',', strtolower(implode(',', array_merge($no_check_default, (array)$no_check_status_list))));
$no_check_user_list = Db::name('admin')->where('is_admin', 1)->column('id');
if (!in_array(session('admin_id'), $no_check_user_list)) {
if (!in_array($url, $no_check_rules_list)) {
if (!$auth->check($url, session('admin_id'))) {
$this->error('æ±æï¼æ¨æ²¡ææä½æé');
}
}
foreach ($data as $k => $v) {
if (!$auth->check($v['name'], session('admin_id'))) {
unset($data[$k]);
} else {
if (isset($v['_child'])) {
foreach ($v['_child'] as $key => $value) {
if (!$auth->check($value['name'], session('admin_id'))) {
unset($data[$k]['_child'][$key]);
}
}
}
}
}
}
//unset($data[0]['_child'][0]);
//var_dump($data);
//mysqlä¸åºåå段å
容大å°å
$active_id = Db::name('auth_rule')->where('name', '=', $url)->field('id,pid,top_pid')->find();
// dump($active_id);
$this->assign([
'active_id' => implode(',', (array)$active_id),
'menu_nav' => $data,
'crumb_list' => get_crumb_list($url)
]);
}
}