AuthMiddleware.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. 'index.index',
  22. 'index.login',
  23. 'index.logout',
  24. 'index.captcha'
  25. ];
  26. $current = strtolower($controller . '.' . $action);
  27. if (in_array($current, $whiteList)) {
  28. return $next($request);
  29. }
  30. // 验证登录状态
  31. $userInfo = $this->checkLogin($request);
  32. if (!$userInfo) {
  33. return json_error([], '请先登录', 401);
  34. }
  35. // 将用户信息注入请求
  36. $request->userInfo = $userInfo;
  37. $request->userId = (int)$userInfo['user_id'];
  38. // 验证权限
  39. if (!$this->checkPermission((int)$userInfo['user_id'], $controller, $action)) {
  40. return json_error([], '无权限访问', 403);
  41. }
  42. return $next($request);
  43. }
  44. /**
  45. * 检查登录状态
  46. */
  47. protected function checkLogin($request): ?array
  48. {
  49. $token = $request->cookie('auth_token');
  50. if (!$token) {
  51. return null;
  52. }
  53. $decoded = parseToken($token);
  54. if (!$decoded) {
  55. return null;
  56. }
  57. return $decoded;
  58. }
  59. /**
  60. * 检查权限
  61. */
  62. protected function checkPermission(int $userId, string $controller, string $action): bool
  63. {
  64. // 使用MenuService检查权限
  65. return MenuService::checkPermission($userId, $controller, $action);
  66. }
  67. }