Browse Source

用户菜单接口请求权限

master
wanghongjun 1 month ago
parent
commit
d8ae2d3345
  1. 48
      app/Http/Controllers/Admin/BaseController.php
  2. 17
      app/Http/Controllers/Admin/UserController.php
  3. 11
      app/Http/Middleware/AdminAuthMiddleware.php
  4. 17
      app/Http/Middleware/CheckPermission.php
  5. 20
      app/Services/AdminMenuService.php
  6. 4
      config/auth.php
  7. 105
      database/seeders/AdminMenuSeeder.php
  8. 6
      routes/admin/api.php

48
app/Http/Controllers/Admin/BaseController.php

@ -6,7 +6,7 @@ use App\Http\Controllers\Controller;
use App\Services\AdminMenuService; use App\Services\AdminMenuService;
use App\Services\ApiResponseService; use App\Services\ApiResponseService;
use Exception; use Exception;
use Illuminate\Support\Facades\Auth; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Psr\SimpleCache\InvalidArgumentException; use Psr\SimpleCache\InvalidArgumentException;
@ -14,9 +14,11 @@ use Psr\SimpleCache\InvalidArgumentException;
class BaseController extends Controller class BaseController extends Controller
{ {
// 用户信息 // 用户信息
protected array $adminUser; public array $adminUser;
// 用户id // 用户id
protected int $adminUserId; public int $adminUserId;
// 菜单uri
protected string $menuUri;
/** /**
* @var ApiResponseService * @var ApiResponseService
@ -31,8 +33,6 @@ class BaseController extends Controller
ApiResponseService $responseService ApiResponseService $responseService
) { ) {
$this->responseService = $responseService; $this->responseService = $responseService;
$this->adminUser = Auth::guard('sanctum')->user() ?? [];
$this->adminUserId = $this->adminUser['id'] ?? 0;
} }
/** /**
@ -61,31 +61,43 @@ class BaseController extends Controller
/** /**
* 功能显示权限 * 功能显示权限
* @param string $className
* @param array $auth
* @return int[] * @return int[]
* @throws InvalidArgumentException * @throws InvalidArgumentException
*/ */
protected function methodShow(string $className, array $auth = []): array protected function methodShow(): array
{ {
$methodAuthArr = AdminMenuService::auth($this->adminUserId); $methodAuthArr = AdminMenuService::auth($this->adminUserId);
$authArr = [ $roleMenuArr = AdminMenuService::getRoleMenuList($this->menuUri);
$className . '/show' => 0, $authArr = [];
$className . '/store' => 0, foreach ($roleMenuArr as $value) {
$className . '/update' => 0, $authArr[$value] = 0;
$className . '/destroy' => 0, }
];
$newArr = []; $newArr = [];
foreach ($authArr as $authKey => $value) { foreach ($authArr as $authKey => $value) {
if (in_array($authKey, $methodAuthArr)) { if (in_array($authKey, $methodAuthArr)) {
$authArr[$authKey] = 1; $authArr[$authKey] = 1;
} }
$key = explode('/',$authKey); $key = explode('.',$authKey);
$newArr[$key[1]] = $authArr[$authKey]; $newArr[$key[1]] = $authArr[$authKey];
} }
if ($auth) {
$newArr = array_merge($newArr, $auth);
}
return $newArr; return $newArr;
} }
/**
* @return JsonResponse
* @throws InvalidArgumentException
*/
public function rule(): JsonResponse
{
try {
if (!$this->menuUri) {
throw new Exception('');
}
return $this->responseService->success($this->methodShow());
} catch (Exception $e) {
return $this->responseService->systemError(
__('exception.get_data_failed') . ':' . $e->getMessage()
);
}
}
} }

17
app/Http/Controllers/Admin/UserController.php

@ -10,6 +10,7 @@ use App\Services\AdminUsersService;
use Exception; use Exception;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Psr\SimpleCache\InvalidArgumentException; use Psr\SimpleCache\InvalidArgumentException;
@ -32,6 +33,7 @@ class UserController extends BaseController
) { ) {
parent::__construct($responseService); parent::__construct($responseService);
$this->AdminUserModelService = $AdminUsersService; $this->AdminUserModelService = $AdminUsersService;
$this->menuUri = 'users';
} }
/** /**
@ -269,19 +271,4 @@ class UserController extends BaseController
); );
} }
} }
/**
* @return JsonResponse
* @throws InvalidArgumentException
*/
public function rule(): JsonResponse
{
try {
return $this->responseService->success($this->methodShow('users'));
} catch (Exception $e) {
return $this->responseService->systemError(
__('exception.get_data_failed') . ':' . $e->getMessage()
);
}
}
} }

11
app/Http/Middleware/AdminAuthMiddleware.php

@ -83,6 +83,17 @@ class AdminAuthMiddleware
$request->merge([]); $request->merge([]);
} }
// 间件注入当前用户到控制器
$controller = $request->route()->getController();
// 将当前用户赋值给控制器的 $user 属性(可以自定义属性名)
if (method_exists($controller, 'setCurrentUser')) {
$controller->setCurrentUser($user);
} else {
$controller->adminUser = (array)$user;
$controller->adminUserId = (int )$user['id'];
}
return $next($request); return $next($request);
} }
} }

17
app/Http/Middleware/CheckPermission.php

@ -2,7 +2,6 @@
namespace App\Http\Middleware; namespace App\Http\Middleware;
use App\Models\AdminRoleUsers;
use App\Services\AdminMenuService; use App\Services\AdminMenuService;
use App\Services\ApiResponseService; use App\Services\ApiResponseService;
use Closure; use Closure;
@ -26,12 +25,12 @@ class CheckPermission
$user = Auth::guard('sanctum')->user(); $user = Auth::guard('sanctum')->user();
$user_id = $user->id; $user_id = $user->id;
$uriArr = AdminMenuService::auth($user_id); $uriArr = AdminMenuService::auth($user_id);
// if ($this->passedOrNot($action, $uriArr)) { if ($this->passedOrNot($action, $uriArr)) {
// return (new ApiResponseService())->error( return (new ApiResponseService())->error(
// __('middleware.check.user_auth'), __('middleware.check.user_auth'),
// 400 400
// ); );
// } }
} }
return $next($request); return $next($request);
} }
@ -66,9 +65,9 @@ class CheckPermission
} }
if ($method == $methodArr[0]) { if ($method == $methodArr[0]) {
$newAction .= '/store'; $newAction .= '.store';
} elseif($method == $methodArr[1]) { } elseif($method == $methodArr[1]) {
$newAction .= '/update'; $newAction .= '.update';
} }
if (in_array($newAction, $uriArr)) { if (in_array($newAction, $uriArr)) {

20
app/Services/AdminMenuService.php

@ -155,8 +155,26 @@ final class AdminMenuService
{ {
$menu_ids = []; $menu_ids = [];
if ($user_id) { if ($user_id) {
$menu_ids = (new self())->getUserRolesMenuIds($user_id); $menu_ids = (new self(new OperationLogService()))->getUserRolesMenuIds($user_id);
} }
return AdminMenu::getMenuList($parent_id, $menu_ids); return AdminMenu::getMenuList($parent_id, $menu_ids);
} }
public static function getRoleMenuList($uri)
{
$where = [
['status', '=', 1],
['uri', '=', $uri]
];
$menu_id = AdminMenu::query()->where($where)->value('id');
if (!$menu_id) {
return [];
}
$childWhere = [
['status', '=', 1],
['parent_id', '=', $menu_id],
];
$uri_arr = AdminMenu::query()->where($childWhere)->pluck('uri');
return $uri_arr ? $uri_arr->toArray() : [];
}
} }

4
config/auth.php

@ -40,6 +40,10 @@ return [
'driver' => 'session', 'driver' => 'session',
'provider' => 'users', 'provider' => 'users',
], ],
'api' => [
'driver' => 'sanctum',
'provider' => 'users',
],
], ],
/* /*

105
database/seeders/AdminMenuSeeder.php

@ -54,48 +54,48 @@ class AdminMenuSeeder extends Seeder
return [ return [
'model_manage' => [ 'model_manage' => [
'event_calendar' => [ 'event_calendar' => [
'uri' => '', 'uri' => 'eventCalendar',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'eventCalendar.index',
'add' => '', 'add' => 'eventCalendar.store',
'edit' => '', 'edit' => 'eventCalendar.update',
'import' => '', 'import' => 'eventCalendar.import',
'export' => '', 'export' => 'eventCalendar.export',
'delete' => '', 'delete' => 'eventCalendar.destroy',
'batch_delete' => '', 'batch_delete' => 'eventCalendar.destroy',
'download_template' => '', 'download_template' => 'eventCalendar.export',
'end' => '' 'end' => 'eventCalendar.end'
] ]
], ],
'model_manage' => [ 'model_manage' => [
'uri' => '', 'uri' => 'pattern',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'pattern.index',
'add' => '', 'add' => 'pattern.store',
'edit' => '', 'edit' => 'pattern.update',
'batch_import' => '', 'batch_import' => 'pattern.batchImport',
'view_details' => '', 'view_details' => 'patternSpace.index',
'download_template' => '', 'download_template' => 'pattern.importTemplate',
'reserved_parking' => '', 'reserved_parking' => 'pattern.release',
'departure_reminder' => '', 'departure_reminder' => 'pattern.change',
'add_parking_space' => '', 'add_parking_space' => 'patternSpace.store',
'edit_parking_space' => '', 'edit_parking_space' => 'patternSpace.update',
'delete_parking_space' => '' 'delete_parking_space' => 'patternSpace.destroy'
] ]
] ]
], ],
'cat_status' => [ 'cat_status' => [
'cat_map' => [ 'cat_map' => [
'uri' => '', 'uri' => 'parkingSpaceMap',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'parkingSpaceMap.floorOverview',
'view' => '' 'view' => 'parkingSpaceMap.map'
] ]
], ],
'cat_list' => [ 'cat_list' => [
'uri' => '', 'uri' => 'parkingReservation',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'parkingReservation.index',
'add_new_energy' => '', 'add_new_energy' => '',
'delete_new_energy' => '' 'delete_new_energy' => ''
] ]
@ -108,13 +108,13 @@ class AdminMenuSeeder extends Seeder
'delete' => 'spaceType.delete', 'delete' => 'spaceType.delete',
'view_details' => 'spaceType.show', 'view_details' => 'spaceType.show',
'edit' => 'spaceType.update', 'edit' => 'spaceType.update',
'download_template' => '', 'download_template' => 'licensePlate.importTemplate',
'license_plate_management' => 'licensePlate.index', 'license_plate_management' => 'licensePlate.index',
'batch_import' => '', 'batch_import' => 'licensePlate.import',
'add_license_plate' => 'licensePlate.store', 'add_license_plate' => 'licensePlate.store',
'delete_license_plate' => 'licensePlate.destroy', 'delete_license_plate' => 'licensePlate.destroy',
'edit_license_plate' => 'licensePlate.update', 'edit_license_plate' => 'licensePlate.update',
'clear_license_plate' => '' 'clear_license_plate' => 'licensePlate.clear'
] ]
], ],
'cat_attr' => [ 'cat_attr' => [
@ -127,18 +127,18 @@ class AdminMenuSeeder extends Seeder
] ]
], ],
'draw_map' => [ 'draw_map' => [
'uri' => '', 'uri' => 'map',
'child' => [ 'child' => [
'read_only' => '' 'read_only' => 'map.index'
] ]
], ],
'parking_information' => [ 'parking_information' => [
'uri' => '', 'uri' => 'information',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'information.index',
'add' => '', 'add' => 'information.store',
'clear' => '', 'clear' => 'information.clear',
'delete' => '' 'delete' => 'information.destroy'
] ]
] ]
], ],
@ -165,12 +165,12 @@ class AdminMenuSeeder extends Seeder
], ],
'information_center' => [ 'information_center' => [
'alarm_notice' => [ 'alarm_notice' => [
'uri' => '', 'uri' => 'notice',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'notice.index',
'view_details' => '', 'view_details' => 'notice.show',
'export' => '', 'export' => 'notice.export',
'alarm_settings' => '' 'alarm_settings' => 'notice.setting'
] ]
] ]
], ],
@ -190,25 +190,25 @@ class AdminMenuSeeder extends Seeder
], ],
'statistics_report' => [ 'statistics_report' => [
'recognition_rate' => [ 'recognition_rate' => [
'uri' => '', 'uri' => 'licensePlateRecognition',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'licensePlateRecognition.index',
'export' => '' 'export' => 'licensePlateRecognition.export'
] ]
], ],
'parking_behavior' => [ 'parking_behavior' => [
'uri' => '', 'uri' => 'parkingBehavior',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'parkingBehavior.index',
'export' => '', 'export' => 'parkingBehavior.export',
'view_details' => '' 'view_details' => ''
] ]
], ],
'utilization_rate' => [ 'utilization_rate' => [
'uri' => '', 'uri' => 'utilizationRate',
'child' => [ 'child' => [
'read_only' => '', 'read_only' => 'utilizationRate.index',
'export' => '' 'export' => 'utilizationRate.export'
] ]
], ],
'occupancy_rate' => [ 'occupancy_rate' => [
@ -285,7 +285,8 @@ class AdminMenuSeeder extends Seeder
'read_only' => 'users.index', 'read_only' => 'users.index',
'add' => 'users.store', 'add' => 'users.store',
'edit' => 'users.update', 'edit' => 'users.update',
'delete' => 'users.destroy' 'delete' => 'users.destroy',
'show' => 'users.show'
] ]
], ],
'role_manage' => [ 'role_manage' => [

6
routes/admin/api.php

@ -95,7 +95,7 @@ Route::group(['prefix' => 'admin'], function () {
Route::get('/spaceType', [ParkingSpaceTypeController::class, 'index']); Route::get('/spaceType', [ParkingSpaceTypeController::class, 'index']);
Route::get('/spaceType/create', [ParkingSpaceTypeController::class, 'create']); Route::get('/spaceType/create', [ParkingSpaceTypeController::class, 'create']);
Route::post('/spaceType', [ParkingSpaceTypeController::class, 'store']); Route::post('/spaceType', [ParkingSpaceTypeController::class, 'store']);
Route::get('/spaceType/{id}', [ParkingSpaceTypeController::class, 'show']); Route::get('/spaceType/show/{id}', [ParkingSpaceTypeController::class, 'show']);
Route::get('/spaceType/edit/{id}', [ParkingSpaceTypeController::class, 'edit']); Route::get('/spaceType/edit/{id}', [ParkingSpaceTypeController::class, 'edit']);
Route::put('/spaceType/{id}', [ParkingSpaceTypeController::class, 'update']); Route::put('/spaceType/{id}', [ParkingSpaceTypeController::class, 'update']);
Route::delete('/spaceType/{id}', [ParkingSpaceTypeController::class, 'destroy']); Route::delete('/spaceType/{id}', [ParkingSpaceTypeController::class, 'destroy']);
@ -189,7 +189,7 @@ Route::group(['prefix' => 'admin'], function () {
Route::get('/roles/create', [RolesController::class, 'create']); Route::get('/roles/create', [RolesController::class, 'create']);
Route::post('/roles', [RolesController::class, 'store']); Route::post('/roles', [RolesController::class, 'store']);
Route::get('/roles/{id}', [RolesController::class, 'show']); Route::get('/roles/{id}', [RolesController::class, 'show']);
Route::get('/roles/edit/{id}', [RolesController::class, 'edit']); Route::get('/roles/show/edit/{id}', [RolesController::class, 'edit']);
Route::put('/roles/{id}', [RolesController::class, 'update']); Route::put('/roles/{id}', [RolesController::class, 'update']);
Route::delete('/roles/{id}', [RolesController::class, 'destroy']); Route::delete('/roles/{id}', [RolesController::class, 'destroy']);
Route::get('/roles/rule', [RolesController::class, 'rule']); Route::get('/roles/rule', [RolesController::class, 'rule']);
@ -197,7 +197,7 @@ Route::group(['prefix' => 'admin'], function () {
Route::get('/users', [UserController::class, 'index']); Route::get('/users', [UserController::class, 'index']);
Route::get('/users/create', [UserController::class, 'create']); Route::get('/users/create', [UserController::class, 'create']);
Route::post('/users', [UserController::class, 'store']); Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{id}', [UserController::class, 'show']); Route::get('/users/show/{id}', [UserController::class, 'show']);
Route::get('/users/edit/{id}', [UserController::class, 'edit']); Route::get('/users/edit/{id}', [UserController::class, 'edit']);
Route::put('/users/{id}', [UserController::class, 'update']); Route::put('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}', [UserController::class, 'destroy']); Route::delete('/users/{id}', [UserController::class, 'destroy']);

Loading…
Cancel
Save