CheckLogin.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace app\admin\middleware;
  3. use app\common\traits\JumpTrait;
  4. use app\Request;
  5. use Closure;
  6. use ReflectionClass;
  7. use ReflectionException;
  8. use app\admin\service\annotation\MiddlewareAnnotation;
  9. class CheckLogin
  10. {
  11. use JumpTrait;
  12. /**
  13. * @throws ReflectionException
  14. */
  15. public function handle(Request $request, Closure $next)
  16. {
  17. $controller = $request->controller();
  18. if (empty($controller)) return $next($request);
  19. if (str_contains($controller, '.')) $controller = str_replace('.', '\\', $controller);
  20. $action = $request->action();
  21. $controllerClass = 'app\\admin\\controller\\' . $controller;
  22. $classObj = new ReflectionClass($controllerClass);
  23. $properties = $classObj->getDefaultProperties();
  24. // 整个控制器是否忽略登录
  25. $ignoreLogin = $properties['ignoreLogin'] ?? false;
  26. $adminUserInfo = session('admin');
  27. if (!$ignoreLogin) {
  28. $noNeedCheck = $properties['noNeedCheck'] ?? [];
  29. if (in_array($action, $noNeedCheck)) {
  30. return $next($request);
  31. }
  32. try {
  33. $reflectionMethod = new \ReflectionMethod($controllerClass, $action);
  34. $attributes = $reflectionMethod->getAttributes(MiddlewareAnnotation::class);
  35. foreach ($attributes as $attribute) {
  36. $annotation = $attribute->newInstance();
  37. $_ignore = (array)$annotation->ignore;
  38. // 控制器中的某个方法忽略登录
  39. if (in_array('LOGIN', $_ignore)) return $next($request);
  40. }
  41. }catch (\Throwable) {
  42. }
  43. if (empty($adminUserInfo)) {
  44. return redirect(__url('login/index'));
  45. }
  46. // 判断是否登录过期
  47. $expireTime = $adminUserInfo['expire_time'];
  48. if ($expireTime !== 0 && time() > $expireTime) {
  49. session('admin', null);
  50. $this->error('登录已过期,请重新登录', [], __url(env('EASYADMIN.ADMIN') . '/login/index'));
  51. }
  52. }
  53. $request->adminUserInfo = $adminUserInfo ?: [];
  54. return $next($request);
  55. }
  56. }