MerchantTokenMiddleware.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace app\common\middleware;
  3. use app\common\repositories\system\merchant\MerchantAdminRepository;
  4. use app\common\repositories\system\merchant\MerchantRepository;
  5. use app\Request;
  6. use ln\exceptions\AuthException;
  7. use ln\services\JwtTokenService;
  8. use Firebase\JWT\ExpiredException;
  9. use think\exception\ValidateException;
  10. use think\Response;
  11. use Throwable;
  12. class MerchantTokenMiddleware 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 MerchantAdminRepository $repository
  32. */
  33. $repository = app()->make(MerchantAdminRepository::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 ('mer' != $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. /**
  51. * @var MerchantRepository $merchantRepository
  52. */
  53. $merchantRepository = app()->make(MerchantRepository::class);
  54. $merchant = $merchantRepository->get($admin->mer_id);
  55. if (!$merchant || !$merchant['status'])
  56. throw new AuthException('商户已被锁定');
  57. } catch (Throwable $e) {
  58. if ($force)
  59. throw $e;
  60. $request->macro('isLogin', function () {
  61. return false;
  62. });
  63. $request->macros(['tokenInfo', 'adminId', 'adminInfo', 'token', 'merchant', 'merchantId'], function () {
  64. throw new AuthException('请登录');
  65. });
  66. return;
  67. }
  68. $repository->updateToken($token);
  69. $request->macro('isLogin', function () {
  70. return true;
  71. });
  72. $request->macro('tokenInfo', function () use (&$payload) {
  73. return $payload;
  74. });
  75. $request->macro('token', function () use (&$token) {
  76. return $token;
  77. });
  78. $request->macro('adminId', function () use (&$admin) {
  79. return $admin->merchant_admin_id;
  80. });
  81. $request->macro('adminInfo', function () use (&$admin) {
  82. return $admin;
  83. });
  84. $request->macro('merchantId', function () use (&$admin) {
  85. return $admin->mer_id;
  86. });
  87. $request->macro('merchant', function () use (&$merchant) {
  88. return $merchant;
  89. });
  90. }
  91. public function after(Response $response)
  92. {
  93. // TODO: Implement after() method.
  94. }
  95. }