JWTRoleAuth.php 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Helpers\Constants;
  4. use Closure;
  5. use Illuminate\Auth\AuthenticationException;
  6. use Illuminate\Validation\UnauthorizedException;
  7. use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
  8. use Tymon\JWTAuth\Exceptions\JWTException;
  9. use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
  10. use Tymon\JWTAuth\Exceptions\TokenExpiredException;
  11. use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
  12. class JWTRoleAuth extends BaseMiddleware
  13. {
  14. /**
  15. * Handle an incoming request.
  16. *
  17. * @param $request
  18. * @param Closure $next
  19. * @param null $guard
  20. * @return mixed
  21. * @throws TokenExpiredException
  22. */
  23. public function handle($request, Closure $next, $guard = null)
  24. {
  25. try {
  26. $this->checkForToken($request);
  27. $tokenRole = $this->auth->parseToken()->getClaim('role');
  28. }catch (TokenExpiredException $e) {
  29. // 处理刷新 token 的异常
  30. try {
  31. // token 过期
  32. $sToken = auth($guard)->refresh();
  33. \Auth::guard($guard)->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
  34. return $this->setAuthenticationHeader($next($request), $sToken);
  35. }catch (JWTException $exception) {
  36. // token 令牌 刷新时间超时,或使用失效的 token 刷新
  37. throw new TokenExpiredException('登录超时请重新登录');
  38. }
  39. }catch (JWTException $e) {
  40. throw new UnauthorizedHttpException('jwt-auth', '请登录后再进行访问');
  41. }
  42. // 判断token角色。
  43. if ($tokenRole != $guard) {
  44. throw new UnauthorizedException('您当前不能访问该接口');
  45. }
  46. return $next($request);
  47. }
  48. }