true, // 权限开关 'system_admin' => 'system_admin', // 用户表 'system_auth' => 'system_auth', // 权限表 'system_auth_node' => 'system_auth_node', // 权限-节点表 ]; /** * 管理员信息. * @var array|\think\Model|null */ protected $adminInfo; /** * 所有节点信息. * @var array */ protected $nodeList; /** * 管理员所有授权节点. * @var array */ protected $adminNode; protected $nodeService; protected static $dynamicNodeList = []; /*** * 构造方法 * AuthService constructor. * @param null $adminId * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function __construct($adminId = null) { $this->nodeService = new NodeService(); if(empty($adminId)){ $adminId = get_session_admin('id'); } $this->adminId = $adminId; $this->adminInfo = $this->getAdminInfo(); $this->nodeList = $this->getNodeList(); $this->adminNode = $this->getAdminNode(); return $this; } public function isSuperAdmin() { return $this->adminId == AdminConstant::SUPER_ADMIN_ID; } /** * 检测检测权限. * @param null $node * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function checkNode($node = null) { if(isset(static::$dynamicNodeList[$node])){ return static::$dynamicNodeList[$node]; } // 判断是否为超级管理员 if ($this->isSuperAdmin()) { return true; } // 判断权限验证开关 if ($this->config['auth_on'] == false) { return true; } // 判断是否需要获取当前节点 if (empty($node)) { $node = $this->getCurrentNode(); } else { $node = $this->parseNodeStr($node); } // 判断是否加入节点控制,优先获取缓存信息 if (!isset($this->nodeList[$node])) { return Config::get('admin.default_auth_check'); } $nodeInfo = $this->nodeList[$node]; if (!$nodeInfo['auth']) { return true; } // 用户验证,优先获取缓存信息 if (empty($this->adminInfo) || $this->adminInfo['status'] != 1 || empty($this->adminInfo['auth_ids'])) { return false; } // 判断该节点是否允许访问 if (in_array($node, $this->adminNode)) { return true; } return false; } /** * 获取当前节点. * @return string */ public function getCurrentNode() { $node = $this->parseNodeStr(request()->controller() . '/' . request()->action()); return $node; } /** * 获取当前管理员所有节点. * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getAdminNode() { $nodeList = []; $adminInfo = $this->getAdminInfo(); if (!empty($adminInfo) && $adminInfo['status'] != 1) { return $nodeList; } if (!empty($adminInfo) && !empty($adminInfo['auth_ids'])) { $nodeList = SystemAuthNode::where('auth_id', 'in', $adminInfo['auth_ids'])->cache(60)->column('node'); } return $nodeList; } /** * 获取所有节点信息. * @time 2021-01-07 * @return array * @author zhongshaofa */ public function getNodeList() { $cache_key = 'node_paris'; $node_list = Cache::get($cache_key); if (!$node_list) { $node_list = $this->nodeService->getNodeParis(); Cache::set($cache_key, $node_list, 60); } return $node_list; } /** * 获取管理员信息. * @time 2021-01-07 * @return array|\think\Model|null * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author zhongshaofa */ public function getAdminInfo() { return Db::name($this->config['system_admin']) ->where('id', $this->adminId) ->autoCache('info', $this->adminId) ->find(); } /** * 驼峰转下划线规则. * @param string $node * @return string */ public function parseNodeStr($node) { $array = explode('/', $node); foreach ($array as $key => $val) { if ($key == 0) { $val = explode('.', $val); foreach ($val as &$vo) { $vo = \think\helper\Str::snake(lcfirst($vo)); } $val = implode('.', $val); $array[$key] = $val; } } $node = implode('/', $array); return $node; } public function disableNode($node, $skipSuperAdmin = true) { if($this->isSuperAdmin()){ if($skipSuperAdmin){ return; } } static::$dynamicNodeList[$node] = false; } public function enableNode($node) { static::$dynamicNodeList[$node] = true; } }