前言
- ThinkPHP中还有一种验证方式:RABC角色模块设置,里面有四张表
- ThinkPHP3版本中内置了Auth权限认证方式,但是ThinkPHP5已经没有了,所以需要导入ThinkPHP3中Auth类,里面有三张表
- 两种验证方式类全部已经封装好了,直接引用就行:use \org\
数据库表的使用
admin管理员:表里有admin1 admin2 adimn 3个管理员
auth _group 管理员组:表里有 超级管理员 普通管理员 文章发布管理员
auth _rule 管理规则:文章添加 文章删除 文章修改 文章查看
auth _group_access :里面只有两个字段,uid(哪个用户),gid(属于哪一个组)
– auth_rule,规则表,
– id:主键,name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证,rules该用户拥有哪些权限,要和auth_rule表对应获取权限
CREATE TABLE ` auth_rule` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(80) NOT NULL DEFAULT '', #权限的地址,如“admin/index”
`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;
– auth_group 用户组表,
– id:主键, title:用户组中文名称, rules:用户组拥有的规则id,这个id就是auth_id的主键id.。 多个规则","隔开,status 状态:为1正常,为0禁用
CREATE TABLE ` 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;
– auth_group_access 用户组明细表
– uid:用户id,group_id:用户组id
CREATE TABLE `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;
权限示例
权限项目 | 内容1 | 内容2 | 内容3 | 内容4 |
---|---|---|---|---|
1 | 2 | 3 | 4 | 5 |
admin | 1 admin | 2 admin | 3 admin | 4 admin |
auth_group_access | uid1 groud_id 1,2,3,4 | uid2 group_id 2,3,4 | udi3 group_id 3,4 | uid4 group_id 4 |
auth_group | 1超级管理员 | 2普通管理员 | 3文章管理员 | 4审核管理员 |
auth_rule | 1 art/all | 2 art/sec | 3 art/add | 4 art/edit |
Auth权限菜单
管理权限
auth_group_access表,负责将不同的用户对应着不同的权限
用户组列表
auth_group_access表,负责添加用户组及权限
权限列表
auth_rule表,负责添加相关权限
Auth用户组权限修改
用户组权限添加
此权限添加全部是往auth_group里面添加用户角色,以及他们主要负责的哪些权限。具体三张表代表不同字段权限可以浏览前面针对数据表做的详细解释。
添加用户组权限内容
用户名:
用户组状态:
用户组权限分配:
Auth用户规则表
auth规则表权限
- 在auth_rule规则表之上又添加了pid和level两个字段,如果想丰富一下,可以再添加一个sort字段用于权限的排序。
- pid字段用于存放父类权限的id,顶级菜单pid默认为0,二级菜单那就会存放该菜单的一级菜单id存为pid信息。
- level字段用于无限极分类,默认为1代表顶级权限,2代表子权限,3代表该权限的子权限子权限。即,level代表的是第几级菜单。、
如何设置level?
在尝试选择菜单的时候选择权限分级,在level字段里的数据+1再赋值给level 后提交表单,获取到的不仅有level无限级菜单,还有该权限下的主键id,也就是我们的pid。
有关具体level设计,请查看无限级分类操作。
Auth权限的的使用
我以为Auth权限的使用很难,但是学了之后就发现仅仅是一句话的事,实例化一下Auth类,在调用check()方法就OK了。
Auth权限原本是ThinkPHP3里面的内容,在ThinkPHP5重大升级后去除了这一功能,作为扩展类在ThinkPHP5中通过composer使用,但是我直接把Auth类拿过来用了,经测试没有错误。
为什么会学习Auth类?在网站建设中难免不了的会出现权限划分问题,在考虑此问题上焦头烂额,迫切需要方式方法解决好该问题。
学习Auth类之前建议先学好无限级分类,这样可以更好的把权限分级弄清楚。
在清楚了解Auth三张表的关系之后开始准备使用Auth类划分权限。
建表
所有权限建立在三张表之中
创建common类
放在Common.php公共类的构造方法中,用于继承。
- 使用
namespace app\***;
use think\Controller;
use think\Request;
use ***\Auth;
class Common extends Controller
{
public function _initialize()
{
/*此处检测用户session()是否存在,判断登陆*/
$auth = ***\Auth;
/*获取获取当前模块名/控制器名/方法名*/
$request = Request::instance();
//echo $request->module().'/'.$request->controller().'/'.$request->action();
If(!$auth->check($request->module().'/'.$request->controller().'/'.$request->action(),<第二个参数放用户主键id>)){
//check()方法中先介绍两个参数,路径和用户id
return $this->error(‘抱歉,您没有权限’);
}
}
}
很简单,是自己考虑复杂了!!!