THINKPHP3.2 Auth权限详细应用


此篇文章只是针对刚开始使用的TP的技术人员,对此不屑的请勿喷。
TP当中的Auth权限控制功能,很多人一开始都不得门入,这里我分享一下自己的布署步骤:

ThinkPHP3.2版本中,Auth类文件放在ThinkPHP/Library/Think/Auth.class.php;打开这文件可以看到相关的数据表信息,这里我就贴上我自己的数据表信息:
//规则表
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(1) NOT NULL DEFAULT '1' COMMENT '',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:为1正常,为0禁用',
`condition` char(100) NOT NULL DEFAULT '' COMMENT '规则表达式,为空表示存在就验证,不为空表示按照条件验证',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `think_auth_rule` VALUES ('1', 'Admin/index', '用户列表', '1', '1', '');
INSERT INTO `think_auth_rule` VALUES ('2', 'Admin/add', '用户添加', '1', '1', '{age}>5 and {age}<20');
INSERT INTO `think_auth_rule` VALUES ('3', 'Admin/edit', '用户编辑', '1', '1', '');
INSERT INTO `think_auth_rule` VALUES ('4', 'Admin/delete', '用户删除', '1', '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(1) NOT NULL DEFAULT '1' COMMENT 'status 状态:为1正常,为0禁用',
`rules` char(80) NOT NULL DEFAULT '' COMMENT '用户组拥有的规则id, 多个规则","隔开',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `think_auth_group` VALUES ('1', '管理组', '1', '1,2');

//用户组明细表
DROP TABLE IF EXISTS `think_auth_group_access`;
CREATE TABLE `think_auth_group_access` (
`uid` mediumint(8) unsigned NOT NULL COMMENT '用户id',
`group_id` mediumint(8) unsigned NOT NULL COMMENT '用户组id',
UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
KEY `uid` (`uid`),
KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `think_auth_group_access` VALUES ('1', '1');
INSERT INTO `think_auth_group_access` VALUES ('1', '2');

//用户表
DROP TABLE IF EXISTS `think_auth_user`;
CREATE TABLE `think_auth_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) DEFAULT NULL COMMENT '用户名',
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`age` tinyint(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `think_auth_user` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', '25');
大体上是一样的,只是多了一个type 和age字段;

控制器中使用说明:
使用的时候,可以直接在类中修改方法中对应的配置选项:
protected $_config = array(
'AUTH_ON' => true, // 认证开关
'AUTH_TYPE' => 1, // 认证方式,1为实时认证;2为登录认证。
'AUTH_GROUP' => 'auth_group', // 用户组数据表名
'AUTH_GROUP_ACCESS' => 'auth_group_access', // 用户-用户组关系表
'AUTH_RULE' => 'auth_rule', // 权限规则表
'AUTH_USER' => 'auth_user' // 用户信息表
);
也可以在config.php配置文件中配置选项:
return array(
'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_auth_user' //用户信息表
)
);
在项目控制器中,如:Application\Admin\Controller\AdminController.class.php代码:
<?php
namespace Admin\Controller;
use Think\Controller;
class AdminController extends Controller{
public function index(){
$Auth = new \Think\Auth();
$ruleName = MODULE_NAME . '/' . ACTION_NAME; //规则唯一标识
$userId = 1; //用户ID
$type = 1; //分类-具体是什么没搞懂,默认为1
$mode='url'; //执行check的模式
$relation = 'AND'; //'or' 表示满足任一条规则即通过验证; 'and'则表示需满足所有规则才能通过验证
if($Auth->check($ruleName,$userId,$type,$mode,$relation)){
$dietxt = '认证:通过';
}else{
$dietxt = '认证:失败';
}
$this->assign('dietxt',$dietxt);
$this->display();
}
}
?>
建议可以把这个认证写成一个函数,方便各个方法中进行调用。
比如先在Common/function.php文件中定义函数;(3.2版本是公共函数文件名是function.php,不在是3.1版本中的common.php)
//Auth权限验证 - 控制器
function action_AuthCheck($ruleName,$userId,$relation='or'){
//$relation = or|and; //默认为'or' 表示满足任一条规则即通过验证; 'and'则表示需满足所有规则才能通过验证
$Auth = new \Think\Auth();

if(empty($userId)){ //用户ID判断,没有就取当前登录的用户ID
$userId = $_SESSION['userid'];
}
$type=1; //分类-具体是什么没搞懂,默认为:1
$mode='url'; //执行check的模式,默认为:url

return $Auth->check($ruleName,$userId,$type,$mode,$relation);
}
控制器中使用:
<?php
namespace Admin\Controller;
use Admin\Controller\CommonController;
class AdminController extends CommonController {
public function index(){
$Auth = new \Think\Auth();
$ruleName = MODULE_NAME . '/' . ACTION_NAME; //规则唯一标识,取当前的控制器:Admin/index

if(action_AuthCheck($ruleName,1)){
$dietxt = '认证:通过';
}else{
$dietxt = '认证:失败';
}
$this->assign('dietxt',$dietxt);
$this->display();
}
}
?>

模板中使用说明:
先在Common/function.php文件中定义函数;
//Auth权限验证 - 模板
function tpl_AuthCheck($ruleName,$userId,$relation='or',$t,$f='false'){
//$relation = or|and; //默认为'or' 表示满足任一条规则即通过验证; 'and'则表示需满足所有规则才能通过验证
$Auth = new \Think\Auth();

if(empty($userId)){ //用户ID判断,没有就取当前登录的用户ID
$userId = $_SESSION['userid'];
}
$type=1; //分类-具体是什么没搞懂,默认为:1
$mode='url'; //执行check的模式,默认为:url

return $Auth->check($ruleName,$userId,$type,$mode,$relation) ? $t : $f;
}
模板中调用:
{:tpl_AuthCheck('Admin/add',$_SESSION['userid'],'or','<a href=”/portal/article/add”>添加</a>','')}

其它说明:
1、表think_auth_rule中字段condition可以设定该规则使用条件,这里的条件声明字段应当是think_auth_user用户表中的字段,如本实例:
{age}>5 and {age}<30 表示用户的字段age的值要大于5且小于30才可以使用这个规则。

Auth权限认证方式相对于RBAC权限认证方式来说,Auth更灵活,哪里需要,验证哪里就可以。

来源: up61技术博客 欢迎分享 (QQ:529857614)

qq交流群:63739043 up61博客-php交流群

上一篇: 后台数据统计图表
下一篇: php导出excel最简单的办法,无需phpexcel