CheckPermission.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Models\Enums\PermissionName;
  4. use Closure;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\Route;
  8. use Spatie\Permission\Exceptions\UnauthorizedException;
  9. use Symfony\Component\HttpFoundation\Response;
  10. class CheckPermission
  11. {
  12. /**
  13. * Handle an incoming request.`
  14. *
  15. * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
  16. */
  17. public function handle(Request $request, Closure $next): Response
  18. {
  19. $permission = Route::currentRouteName();
  20. $this->checkout($request, $permission);
  21. return $next($request);
  22. }
  23. protected function checkout(Request $request, string $permission)
  24. {
  25. $permissionName = PermissionName::tryFrom($permission);
  26. $permissions = [];
  27. $subPermissionRelations = $permissionName ? $permissionName?->subPermissionRelations() : [];
  28. if ($subPermissionRelations) {
  29. $subPermissionKeys = $this->subPermissionKeys($request, $permissionName);
  30. throw_validation_if(!$subPermissionKeys, "Sub-permission parameter exception");
  31. foreach ($subPermissionKeys as $key) {
  32. $subPermission = $subPermissionRelations[$key] ?? null;
  33. throw_validation_if(! $subPermission, "Sub-permission parameter exception");
  34. $permissions[] = $subPermission;
  35. }
  36. } else {
  37. $permissions[] = $permission;
  38. }
  39. foreach ($permissions as $permission) {
  40. if (! Auth::user()->hasPermissionTo($permission)) {
  41. throw UnauthorizedException::forPermissions([$permission]);
  42. }
  43. }
  44. }
  45. protected function subPermissionKeys(Request $request, PermissionName $permissionName)
  46. {
  47. $keys = [];
  48. switch ($permissionName) {
  49. case PermissionName::CONFIG_INDEX:
  50. $keys = $request->get("group", []);
  51. break;
  52. case PermissionName::CONFIG_SETTING:
  53. $keys = array_column($request->all(), 'group');
  54. break;
  55. }
  56. return array_unique($keys);
  57. }
  58. }