AuthMiddleware.php 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\middleware;
  4. use app\service\MenuService;
  5. use Firebase\JWT\JWT;
  6. use Firebase\JWT\Key;
  7. use think\facade\Config;
  8. use think\Response;
  9. class AuthMiddleware
  10. {
  11. /**
  12. * 处理请求
  13. */
  14. public function handle($request, \Closure $next)
  15. {
  16. // 获取当前控制器和操作
  17. $controller = $request->controller();
  18. $action = $request->action();
  19. // 白名单:不需要登录验证的操作
  20. $whiteList = [
  21. 'User.login',
  22. 'User.logout',
  23. ];
  24. $current = $controller . '.' . $action;
  25. if (in_array($current, $whiteList)) {
  26. return $next($request);
  27. }
  28. // 验证登录状态
  29. $userInfo = $this->checkLogin($request);
  30. if (!$userInfo) {
  31. return json_error([], '请先登录', 401);
  32. }
  33. // 将用户信息注入请求
  34. $request->userInfo = $userInfo;
  35. $request->userId = (int)$userInfo['user_id'];
  36. // 验证权限
  37. if (!$this->checkPermission((int)$userInfo['user_id'], $controller, $action)) {
  38. return json_error([], '无权限访问', 403);
  39. }
  40. return $next($request);
  41. }
  42. /**
  43. * 检查登录状态
  44. */
  45. protected function checkLogin($request): ?array
  46. {
  47. $token = $request->cookie('auth_token');
  48. if (!$token) {
  49. return null;
  50. }
  51. $decoded = parseToken($token);
  52. if (!$decoded) {
  53. return null;
  54. }
  55. return $decoded;
  56. }
  57. /**
  58. * 检查权限
  59. */
  60. protected function checkPermission(int $userId, string $controller, string $action): bool
  61. {
  62. // 使用MenuService检查权限
  63. return MenuService::checkPermission($userId, $controller, $action);
  64. }
  65. }