From 01081cf1857b2661329a375640f5564f96b04770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com> Date: Mon, 8 Aug 2022 17:57:59 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=9C=89=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Modules/Admin/Entities/Rabc/Admin.php | 14 ++++++ .../Http/Controllers/IndexController.php | 43 +++++++++++++++++++ .../Admin/Http/Middleware/CheckRabc.php | 16 ++++--- app/Modules/Admin/Routes/web.php | 2 + app/Modules/Admin/Services/AuthService.php | 4 +- 5 files changed, 70 insertions(+), 9 deletions(-) diff --git a/app/Modules/Admin/Entities/Rabc/Admin.php b/app/Modules/Admin/Entities/Rabc/Admin.php index 11f4197..503c877 100644 --- a/app/Modules/Admin/Entities/Rabc/Admin.php +++ b/app/Modules/Admin/Entities/Rabc/Admin.php @@ -141,4 +141,18 @@ class Admin extends Authenticatable implements JWTSubject $this->attributes['admin_head'] = str_replace(Storage::url('/'), '', $key); } } + + // 获取指定管理员的权限列表 + public static function getRabcByAdmin($admin_id) + { + $roles = Admin::find($admin_id)->roles->toArray(); + if (empty($roles)) return []; + $role_ids = array_column($roles, 'role_id'); + if (empty($role_ids)) return []; + $menu_ids = AdminRoleWithMenu::getInstance()->getMenuIdsByRoles($role_ids); + if (empty($menu_ids)) return []; + $menus = AdminMenu::getInstance()->getMenusByIdsForRabc($menu_ids)->toArray(); + if (empty($menus)) return []; + return $menus; + } } diff --git a/app/Modules/Admin/Http/Controllers/IndexController.php b/app/Modules/Admin/Http/Controllers/IndexController.php index d1da68b..47b22d2 100644 --- a/app/Modules/Admin/Http/Controllers/IndexController.php +++ b/app/Modules/Admin/Http/Controllers/IndexController.php @@ -3,9 +3,12 @@ namespace App\Modules\Admin\Http\Controllers; use App\Models\MonthModel; +use App\Modules\Admin\Entities\Rabc\Admin; +use App\Modules\Admin\Http\Middleware\CheckRabc; use App\Modules\Admin\Services\IndexService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class IndexController extends BaseController { @@ -74,4 +77,44 @@ class IndexController extends BaseController { return $this->successJson($this->service->getServerStatus()); } + + protected $guard = 'admin'; + /** + * 检测接口是否有权限 + * + * @param Request $request + * + * @return JsonResponse + */ + public function checkApiPermission(Request $request): JsonResponse + { + $apis = $request->input('apis', []); + $menus = Admin::getRabcByAdmin(Auth::guard($this->guard)->id()); + $result = []; + + $admin_prefix = cnpscy_config('admin_prefix'); + // 验证权限 + foreach ($apis as $api){ + $full_url = $admin_prefix . '/' . $api; + $result[] = [ + 'url' => $api, + 'full_url' => $full_url, + 'status' => empty($menus) ? false : (isset($menus[$full_url]) ? true : false), + ]; + } + // 验证一次白名单 + $white_lists = CheckRabc::$white_lists; + foreach ($result as &$item){ + if (!$item['status']){ + if (in_array($item['url'], $white_lists)){ + $item['status'] = true; + } + if (in_array($item['full_url'], $white_lists)){ + $item['status'] = true; + } + } + } + + return $this->successJson($result); + } } diff --git a/app/Modules/Admin/Http/Middleware/CheckRabc.php b/app/Modules/Admin/Http/Middleware/CheckRabc.php index 15bf004..cc85039 100644 --- a/app/Modules/Admin/Http/Middleware/CheckRabc.php +++ b/app/Modules/Admin/Http/Middleware/CheckRabc.php @@ -16,6 +16,10 @@ class CheckRabc protected $guard; + public static $white_lists = [ + 'check-permission' + ]; + /** * Handle an incoming request. * @@ -40,17 +44,15 @@ class CheckRabc // 超级管理员账户无需验证 if ($admin_id == 1) return true; - $roles = Admin::getInstance()->detail($admin_id)->roles->toArray(); - if (empty($roles)) return false; - $role_ids = array_column($roles, 'role_id'); - if (empty($role_ids)) return false; - $menu_ids = AdminRoleWithMenu::getInstance()->getMenuIdsByRoles($role_ids); - if (empty($menu_ids)) return false; - $menus = AdminMenu::getInstance()->getMenusByIdsForRabc($menu_ids)->toArray(); + $menus = Admin::getRabcByAdmin($admin_id); if (empty($menus)) return false; // 获取当前路由 $route_path = $request->route()->uri(); + // 白名单 + if (in_array($route_path, $this->white_lists)){ + return true; + } // 检测是否存在当前API if (isset($menus[$route_path])){ // 验证请求方式 diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php index cede918..9137c1c 100644 --- a/app/Modules/Admin/Routes/web.php +++ b/app/Modules/Admin/Routes/web.php @@ -35,6 +35,8 @@ Route::prefix(cnpscy_config('admin_prefix')) }); Route::middleware([CheckAuth::class])->group(function () { + // 检测登录会员是否拥有指定接口的权限 + Route::get('check-permission', 'IndexController@checkApiPermission'); // 首页 Route::get('indexs', 'IndexController@index'); // 编辑登录管理员资料 diff --git a/app/Modules/Admin/Services/AuthService.php b/app/Modules/Admin/Services/AuthService.php index 28634c3..d42a4f8 100644 --- a/app/Modules/Admin/Services/AuthService.php +++ b/app/Modules/Admin/Services/AuthService.php @@ -61,7 +61,7 @@ class AuthService extends Service * * @throws \App\Exceptions\Admin\AuthTokenException */ - public function getRabcList() + public function getRabcList($is_tree = true) { if (!$admin = Auth::guard($this->guard)->user()){ throw new AuthTokenException('认证失败!'); @@ -77,7 +77,7 @@ class AuthService extends Service $menus = array_merge($menus, $item); } - return list_to_tree($menus); + return $is_tree ? list_to_tree($menus) : $menus; } /** -- Gitee From 24b1f3ef1372f9b7c559bf6f5249c00569fc995b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com> Date: Tue, 9 Aug 2022 17:44:05 +0800 Subject: [PATCH 2/3] =?UTF-8?q?optimize=20=E8=A7=92=E8=89=B2=E8=B5=8B?= =?UTF-8?q?=E4=BA=88=E6=9D=83=E9=99=90=E6=97=B6=EF=BC=8C=E8=8F=9C=E5=8D=95?= =?UTF-8?q?Id=E7=BB=84=EF=BC=9A=E8=BF=BD=E5=8A=A0=E9=80=89=E4=B8=AD?= =?UTF-8?q?=E5=AD=90=E8=8A=82=E7=82=B9=E7=9A=84=E7=88=B6=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E7=9A=84key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resources/vue-element-admin/views/admin_roles/index.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue index f0924d1..04fc7e3 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue @@ -376,7 +376,8 @@ }, async confirmRole() { // 当前角色选中的菜单栏目列表 - this.role.menu_ids = this.$refs.tree.getCheckedKeys(); + // this.$refs.tree.getHalfCheckedKeys() 返回选中子节点的父节点的key + this.role.menu_ids = this.$refs.tree.getCheckedKeys().concat(this.$refs.tree.getHalfCheckedKeys()); this.$refs['role'].validate(async (valid) => { if (valid) { -- Gitee From 65bac2a2786b20ebdcea4fabc05e09ea52b654f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=B8=91=E8=B7=AF=E4=BA=BA?= <2278757482@qq.com> Date: Tue, 9 Aug 2022 18:21:12 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=AE=9E=E7=8E=B0`=E6=97=A0=E6=9D=83=E9=99=90`?= =?UTF-8?q?=E7=9A=84=E6=8C=89=E9=92=AE=E4=B8=8D=E5=B1=95=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E5=85=B6=E5=AE=83=E9=A1=B5=E9=9D=A2=E6=99=9A=E4=BA=9B=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/IndexController.php | 5 +- .../Admin/Http/Middleware/CheckRabc.php | 2 +- .../Admin/Http/Requests/Rabc/AdminRequest.php | 1 + .../Http/Requests/Rabc/AdminRoleRequest.php | 1 + .../Resources/vue-element-admin/api/admins.js | 36 ++++++++---- .../Resources/vue-element-admin/api/common.js | 10 ++++ .../vue-element-admin/utils/permission.js | 15 +++++ .../vue-element-admin/views/admins/index.vue | 57 ++++++++++++++++--- 8 files changed, 104 insertions(+), 23 deletions(-) diff --git a/app/Modules/Admin/Http/Controllers/IndexController.php b/app/Modules/Admin/Http/Controllers/IndexController.php index 47b22d2..8ed6db2 100644 --- a/app/Modules/Admin/Http/Controllers/IndexController.php +++ b/app/Modules/Admin/Http/Controllers/IndexController.php @@ -95,9 +95,12 @@ class IndexController extends BaseController $admin_prefix = cnpscy_config('admin_prefix'); // 验证权限 foreach ($apis as $api){ + $old_url = $api; + $api = trim($api, '/'); $full_url = $admin_prefix . '/' . $api; - $result[] = [ + $result[$api] = [ 'url' => $api, + 'old_url' => $old_url, 'full_url' => $full_url, 'status' => empty($menus) ? false : (isset($menus[$full_url]) ? true : false), ]; diff --git a/app/Modules/Admin/Http/Middleware/CheckRabc.php b/app/Modules/Admin/Http/Middleware/CheckRabc.php index cc85039..d536a02 100644 --- a/app/Modules/Admin/Http/Middleware/CheckRabc.php +++ b/app/Modules/Admin/Http/Middleware/CheckRabc.php @@ -50,7 +50,7 @@ class CheckRabc // 获取当前路由 $route_path = $request->route()->uri(); // 白名单 - if (in_array($route_path, $this->white_lists)){ + if (in_array($route_path, self::$white_lists)){ return true; } // 检测是否存在当前API diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php index d912f45..8ff2e98 100644 --- a/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php +++ b/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php @@ -48,6 +48,7 @@ class AdminRequest extends BaseRequest 'admin_name.required' => '请输入管理员账户!', 'admin_name.unique' => '管理员账户已存在!', 'password.confirmed' => '密码确认不匹配!', + 'is_check.required' => '请设置启用状态!', ]; } } diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php index c52ba76..002c722 100644 --- a/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php +++ b/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php @@ -35,6 +35,7 @@ class AdminRoleRequest extends BaseRequest { return [ 'role_name.required' => '请输入角色名称!', + 'is_check.required' => '请设置启用状态!', ]; } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/admins.js b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js index 201bbe3..1ed1220 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/admins.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js @@ -1,16 +1,20 @@ import request from '@/utils/request' -export function getAdminsSelect(params) { +export function getAdminsSelect(params, get_url = false) { + var url = '/admins/getSelectLists'; + if (get_url) return url; return request({ - url: '/admins/getSelectLists', + url: url, method: 'get', params }); } -export function getList(params) { +export function getList(params, get_url = false) { + var url = 'admins'; + if (get_url) return url; return request({ - url: 'admins', + url: url, method: 'get', params }) @@ -24,33 +28,41 @@ export function getList(params) { // }) // } -export function create(data) { +export function create(data, get_url = false) { + var url = '/admins/create'; + if (get_url) return url; return request({ - url: '/admins/create', + url: url, method: 'post', data }) } -export function update(data) { +export function update(data, get_url = false) { + var url = '/admins/update'; + if (get_url) return url; return request({ - url: `/admins/update`, + url: url, method: 'put', data }) } -export function setDel(data) { +export function setDel(data, get_url = false) { + var url = '/admins/delete'; + if (get_url) return url; return request({ - url: `/admins/delete`, + url: url, method: 'delete', data }) } -export function changeFiledStatus(data) { +export function changeFiledStatus(data, get_url = false) { + var url = '/admins/changeFiledStatus'; + if (get_url) return url; return request({ - url: `/admins/changeFiledStatus`, + url: url, method: 'put', data }) diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/common.js b/app/Modules/Admin/Resources/vue-element-admin/api/common.js index 7f287ed..7cc61a8 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/common.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/common.js @@ -14,3 +14,13 @@ export function getMonthLists() { method: 'get' }) } + +export function checkPermission(apis) { + return request({ + url: '/check-permission', + method: 'get', + params:{ + apis + } + }) +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js b/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js index 8e2bbad..5b30442 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js +++ b/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js @@ -1,4 +1,5 @@ import store from '@/store' +import {checkPermission as checkPermissionApi} from '@/api/common'; /** * @param {Array} value @@ -19,3 +20,17 @@ export default function checkPermission(value) { return false } } + +// 检测按钮的权限 +export function checkButtonPermission(that, apis){ + checkPermissionApi(apis).then(function (res){ + let result = res.data; + for (let key in result) { + for (let permission in that.permission){ + if (that.permission[permission].url == result[key].old_url){ + that.permission[permission].status = result[key].status; + } + } + } + }); +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue index 4fd3e0e..13d087a 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue @@ -20,10 +20,11 @@ {{ $t('table.search') }} - + {{ $t('table.batchDelete') }} @@ -134,7 +132,8 @@