PermissionChecker.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * 来自 laravel-admin
  4. */
  5. namespace App\Utils;
  6. use App\Models\AdminPermission;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Str;
  9. class PermissionChecker
  10. {
  11. /**
  12. * 允许特定权限通过
  13. *
  14. * @param $permission
  15. *
  16. * @return true
  17. */
  18. public static function check($permission)
  19. {
  20. if (Admin::isAdministrator()) {
  21. return true;
  22. }
  23. if (is_array($permission)) {
  24. collect($permission)->each(function ($permission) {
  25. static::check($permission);
  26. });
  27. } elseif (Admin::user()->can($permission)) {
  28. return true;
  29. } else {
  30. static::error();
  31. }
  32. }
  33. /**
  34. * 允许 $roles 中的任意一个角色访问
  35. *
  36. * @param $roles
  37. *
  38. * @return true
  39. */
  40. public static function allow($roles)
  41. {
  42. if (Admin::isAdministrator()) {
  43. return true;
  44. }
  45. if (!Admin::user()->inRoles($roles)) {
  46. static::error();
  47. }
  48. return true;
  49. }
  50. /**
  51. * 通行
  52. *
  53. * @return bool
  54. */
  55. public static function free()
  56. {
  57. return true;
  58. }
  59. /**
  60. * 拒绝 roles 中的任意一个角色访问
  61. *
  62. * @param $roles
  63. *
  64. * @return true
  65. */
  66. public static function deny($roles)
  67. {
  68. if (Admin::isAdministrator()) {
  69. return true;
  70. }
  71. if (Admin::user()->inRoles($roles)) {
  72. static::error();
  73. }
  74. return true;
  75. }
  76. /**
  77. * 403 响应
  78. */
  79. public static function error()
  80. {
  81. abort(403, '无权访问');
  82. }
  83. /**
  84. * 请求路径和方法的权限检测
  85. *
  86. * @param AdminPermission $permission
  87. * @param Request $request
  88. *
  89. * @return bool
  90. */
  91. public static function shouldPassThrough(AdminPermission $permission, Request $request)
  92. {
  93. if (empty($permission->http_method) && empty($permission->http_path)) {
  94. return true;
  95. }
  96. $method = $permission->http_method;
  97. $matches = array_map(function ($path) use ($method) {
  98. if (Str::contains($path, ':')) {
  99. list($method, $path) = explode(':', $path);
  100. $method = explode(',', $method);
  101. }
  102. $path = 'admin-api'.$path;
  103. return compact('method', 'path');
  104. }, $permission->http_path);
  105. foreach ($matches as $match) {
  106. if (static::matchRequest($match, $request)) {
  107. return true;
  108. }
  109. }
  110. return false;
  111. }
  112. /**
  113. * 检测请求的方法和路径是否匹配特定值
  114. *
  115. * @param array $match
  116. * @param Request $request
  117. *
  118. * @return bool
  119. */
  120. protected static function matchRequest(array $match, Request $request)
  121. {
  122. if (!$request->is(trim($match['path'], '/'))) {
  123. return false;
  124. }
  125. $method = collect($match['method'])->filter()->map(function ($method) {
  126. return strtoupper($method);
  127. });
  128. return $method->isEmpty() || $method->contains($request->method());
  129. }
  130. }