LoginMiddleware.php 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeadmin快速开发前后端分离管理后台(PHP版)
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
  8. // | github下载:https://github.com/likeshop-github/likeadmin
  9. // | 访问官网:https://www.likeadmin.cn
  10. // | likeadmin团队 版权所有 拥有最终解释权
  11. // +----------------------------------------------------------------------
  12. // | author: likeadminTeam
  13. // +----------------------------------------------------------------------
  14. declare (strict_types=1);
  15. namespace app\api\http\middleware;
  16. use app\common\cache\UserTokenCache;
  17. use app\common\service\JsonService;
  18. use app\api\service\UserTokenService;
  19. use think\facade\Config;
  20. class LoginMiddleware
  21. {
  22. /**
  23. * @notes 登录验证
  24. * @param $request
  25. * @param \Closure $next
  26. * @return mixed|\think\response\Json
  27. * @author 令狐冲
  28. * @date 2021/7/1 17:33
  29. */
  30. public function handle($request, \Closure $next)
  31. {
  32. $token = $request->header('token');
  33. //判断接口是否免登录
  34. $isNotNeedLogin = $request->controllerObject->isNotNeedLogin();
  35. //不直接判断$isNotNeedLogin结果,使不需要登录的接口通过,为了兼容某些接口可以登录或不登录访问
  36. if (empty($token) && !$isNotNeedLogin) {
  37. //没有token并且该地址需要登录才能访问, 指定show为0,前端不弹出此报错
  38. return JsonService::fail('请求参数缺token', [], 0, 0);
  39. }
  40. $userInfo = (new UserTokenCache())->getUserInfo($token);
  41. if (empty($userInfo) && !$isNotNeedLogin) {
  42. //token过期无效并且该地址需要登录才能访问
  43. return JsonService::fail('登录超时,请重新登录', [], -1, 0);
  44. }
  45. //token临近过期,自动续期
  46. if ($userInfo) {
  47. //获取临近过期自动续期时长
  48. $beExpireDuration = Config::get('project.user_token.be_expire_duration');
  49. //token续期
  50. if (time() > ($userInfo['expire_time'] - $beExpireDuration)) {
  51. $result = UserTokenService::overtimeToken($token);
  52. //续期失败(数据表被删除导致)
  53. if (empty($result)) {
  54. return JsonService::fail('登录过期', [], -1);
  55. }
  56. }
  57. }
  58. //给request赋值,用于控制器
  59. $request->userInfo = $userInfo;
  60. $request->userId = $userInfo['user_id'] ?? 0;
  61. return $next($request);
  62. }
  63. }