Permission.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace Dcat\Admin\Middleware;
  3. use Dcat\Admin\Auth\Permission as Checker;
  4. use Dcat\Admin\Admin;
  5. use Dcat\Admin\Support\Helper;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Str;
  8. class Permission
  9. {
  10. /**
  11. * @var string
  12. */
  13. protected $middlewarePrefix = 'admin.permission:';
  14. /**
  15. * Handle an incoming request.
  16. *
  17. * @param \Illuminate\Http\Request $request
  18. * @param \Closure $next
  19. * @param array $args
  20. *
  21. * @return mixed
  22. */
  23. public function handle(Request $request, \Closure $next, ...$args)
  24. {
  25. $user = Admin::user();
  26. if (
  27. !$user
  28. || !empty($args)
  29. || $this->shouldPassThrough($request)
  30. || $user->isAdministrator()
  31. || $this->checkRoutePermission($request)
  32. ) {
  33. return $next($request);
  34. }
  35. if (!$user->allPermissions()->first(function ($permission) use ($request) {
  36. return $permission->shouldPassThrough($request);
  37. })) {
  38. Checker::error();
  39. }
  40. return $next($request);
  41. }
  42. /**
  43. * If the route of current request contains a middleware prefixed with 'admin.permission:',
  44. * then it has a manually set permission middleware, we need to handle it first.
  45. *
  46. * @param Request $request
  47. *
  48. * @return bool
  49. */
  50. public function checkRoutePermission(Request $request)
  51. {
  52. if (!$middleware = collect($request->route()->middleware())->first(function ($middleware) {
  53. return Str::startsWith($middleware, $this->middlewarePrefix);
  54. })) {
  55. return false;
  56. }
  57. $args = explode(',', str_replace($this->middlewarePrefix, '', $middleware));
  58. $method = array_shift($args);
  59. if (!method_exists(Checker::class, $method)) {
  60. throw new \InvalidArgumentException("Invalid permission method [$method].");
  61. }
  62. call_user_func_array([Checker::class, $method], [$args]);
  63. return true;
  64. }
  65. /**
  66. * Determine if the request has a URI that should pass through verification.
  67. *
  68. * @param \Illuminate\Http\Request $request
  69. *
  70. * @return bool
  71. */
  72. protected function shouldPassThrough($request)
  73. {
  74. foreach (config('admin.permission.except', []) as $except) {
  75. $except = admin_base_path($except);
  76. if ($except !== '/') {
  77. $except = trim($except, '/');
  78. }
  79. if (Helper::matchRequestPath($except)) {
  80. return true;
  81. }
  82. }
  83. return false;
  84. }
  85. }