AdminTokenMiddleware.php 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace app\common\middleware;
  3. use app\common\repositories\system\admin\AdminRepository;
  4. use app\Request;
  5. use ln\exceptions\AuthException;
  6. use ln\services\JwtTokenService;
  7. use Firebase\JWT\ExpiredException;
  8. use think\exception\ValidateException;
  9. use think\facade\Route;
  10. use think\Response;
  11. use Throwable;
  12. class AdminTokenMiddleware extends BaseMiddleware
  13. {
  14. /**
  15. * @param Request $request
  16. * @throws Throwable
  17. * @author xaboy
  18. * @day 2020-04-10
  19. */
  20. public function before(Request $request)
  21. {
  22. $force = $this->getArg(0, true);
  23. try {
  24. $token = trim($request->header('X-Token'));
  25. if(!$token) $token = trim($request->param('token',''));
  26. if (strpos($token, 'Bearer') === 0)
  27. $token = trim(substr($token, 6));
  28. if (!$token)
  29. throw new ValidateException('请登录');
  30. /**
  31. * @var AdminRepository $repository
  32. */
  33. $repository = app()->make(AdminRepository::class);
  34. $service = new JwtTokenService();
  35. try {
  36. $payload = $service->parseToken($token);
  37. } catch (ExpiredException $e) {
  38. $repository->checkToken($token);
  39. $payload = $service->decode($token);
  40. } catch (Throwable $e) {//Token 过期
  41. throw new AuthException('token 已过期');
  42. }
  43. if ('admin' != $payload->jti[1])
  44. throw new AuthException('无效的 token');
  45. $admin = $repository->get($payload->jti[0]);
  46. if (!$admin)
  47. throw new AuthException('账号不存在');
  48. if (!$admin['status'])
  49. throw new AuthException('账号已被禁用');
  50. } catch (Throwable $e) {
  51. if ($force)
  52. throw $e;
  53. $request->macro('isLogin', function () {
  54. return false;
  55. });
  56. $request->macros(['tokenInfo', 'adminId', 'adminInfo', 'token'], function () {
  57. throw new AuthException('请登录');
  58. });
  59. return;
  60. }
  61. $repository->updateToken($token);
  62. $request->macro('isLogin', function () {
  63. return true;
  64. });
  65. $request->macro('tokenInfo', function () use (&$payload) {
  66. return $payload;
  67. });
  68. $request->macro('token', function () use (&$token) {
  69. return $token;
  70. });
  71. $request->macro('adminId', function () use (&$admin) {
  72. return $admin->admin_id;
  73. });
  74. $request->macro('adminInfo', function () use (&$admin) {
  75. return $admin;
  76. });
  77. }
  78. public function after(Response $response)
  79. {
  80. // TODO: Implement after() method.
  81. }
  82. }