thinkphp6 auth 权限控制 可控制到每一个方法,最简单办法
2022-11-24 11:10:29
210
{{single.collect_count}}

使用两个三个表 user(用户) role(角色) rule(规则)

user 用户表:用户登录数据+用户所属的角色表中的ID

role 用户权限组表:角色的名称,规则的id

rule 规则表:规则名称,控制器名称,方法名称,启用状态

通过在数据库定义控制器,方法字段,通过Request参数判断当前访问的控制器名称,方法名称,将控制器,方法名称字段带入到数据库查询中查询取得这个操作的权限ID,再查询用户所拥有的权限组里面的rule字段,将这个字段使用explode方法转为数组,使用in_array()判断访问的这个方法的ID值是否存在用户组的权限rule字段里面

in_array(要搜索的值,待搜索的数组,搜索值是否需要全等(填写true、false))//共三个参数

下面直接丢代码了

主要判断权限方法:

//文件是app\common.php 公共方法<?phpuse think\facade\Db; //数据库门面类,必须引入use Firebase\JWT\JWT;//我使用jwt生成token的与本文无关use think\facade\Request;//获取方法,控制需要的门面类// 应用公共文件function auth($id){$controller =Request::controller();//获取访问的控制器名称$action =Request::action();//获取访问的方法名称$ruleid = Db::table('rule')->where('controller', $controller)->where('action', $action)->where('state', 1)->value('id'); //使用获取到的控制器名称和方法名称去查询这个权限的规则ID$roleid = Db::table('user')->where('id', $id)->value('role');//取到用户的用户组ID$role = Db::table('role')->where('id', $roleid)->value('rule');//查询用户组里面的规则ID字段$rolearr = explode(",",$role);//将获取到的规则ID字段从字符串转为数组,转出来的格式为字符串return in_array($ruleid,$rolearr);//输入 判断$ruleid(规则ID)是否在用户组所拥有的$role(规则ID数组)里面,没有使用第三个参数,使用了会判断全等,数组里面是字符串,获取的规则ID是int类型}

使用这个方法判断:

<?phpdeclare(strict_types=1);namespace app\controller;use Exception;use Throwable;use Firebase\JWT\JWT;use Firebase\JWT\Key;use app\BaseController;use Firebase\JWT\ExpiredException;use Firebase\JWT\BeforeValidException;use Firebase\JWT\SignatureInvalidException;class Token extends BaseController{/** * Token验证 */// 验证 tokenprotected function initialize(){parent::initialize();$header = request()->header();if (!isset($header['token']) || $header['token'] == null) {echo json(['code' => 0, 'msg' => 'token不能为空'], 400)->send();die();} else {$token = $header['token'];// 解密token$key = 'Tokenpwd';try {$info = JWT::decode($token, new Key($key, 'HS256')); //在这里判断,token验证正确后去访问这个方法,如果拥有权限auth($info->uid)输出true,否则false,if判断权限没问题就放行,否则提示权限不足中断操作if (auth($info->uid)) {$this->uid = $info->uid;} else {echo json(['status' => 400,'msg' => '权限不足!'], 200)->send();die();}} catch (SignatureInvalidException $e) { //签名不正确echo json(['status' => 400, 'msg' => '签名不正确'], 400)->send();die();} catch (BeforeValidException $e) { // 签名在某个时间点之后才能用echo json(['status' => 400,'msg' => '账号未到可用时间'], 400)->send();die();} catch (ExpiredException $e) { // token过期echo json(['status' => 400,'msg' => '登录状态过期'])->send();die();} catch (Exception $e) { //其他错误echo json(['status' => 400,'msg' => '非法操作'], 400)->send();die();} catch (Throwable $e) {echo json(['status' => 400, 'msg' => $e->getMessage()], 400)->send();die();}}}}

文件下载:https://gitee.com/G1024admin/thinkphp6-auth.git

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}