store = Session::get('yoshop_store'); // 当前用户信息 if (!empty($this->store)) { $this->user = User::detail($this->store['user']['store_user_id']); } } /** * 私有化克隆方法 */ private function __clone() { } /** * 验证指定url是否有访问权限 * @param string|array $url * @param bool $strict 严格模式(必须全部通过才返回true) * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function checkPrivilege($url, $strict = true) { if (!is_array($url)): return $this->checkAccess($url); else: foreach ($url as $val): if ($strict && !$this->checkAccess($val)) { return false; } if (!$strict && $this->checkAccess($val)) { return true; } endforeach; endif; return true; } /** * 验证url的权限 * @param string $url * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ private function checkAccess($url) { // 超级管理员无需验证 if (!empty($this->user) && $this->user['is_super']) { return true; } // 验证当前请求是否在白名单 if (in_array($url, $this->allowAllAction)) { return true; } // 通配符支持 foreach ($this->allowAllAction as $action) { if (strpos($action, '*') !== false && preg_match('/^' . str_replace('/', '\/', $action) . '/', $url) ) { return true; } } // 获取当前用户的权限url列表 if (!in_array($url, $this->getAccessUrls())) { return false; } return true; } /** * 获取当前用户的权限url列表 * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ private function getAccessUrls() { if (empty($this->accessUrls)) { // 获取当前用户的角色集 $roleIds = UserRole::getRoleIds($this->user['store_user_id']); // 根据已分配的权限 $accessIds = RoleAccess::getAccessIds($roleIds); // 获取当前角色所有权限链接 $this->accessUrls = Access::getAccessUrls($accessIds); } return $this->accessUrls; } }