Permission.php 3.0 KB

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