Token.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. namespace app\middleware;
  3. use app\model\Camp;
  4. use app\model\CampEmployee;
  5. use app\model\Employee;
  6. use Exception;
  7. use Firebase\JWT\JWT;
  8. use openssl\Aes;
  9. use think\exception\HttpException;
  10. use app\model\Company;
  11. use app\model\AgentUser;
  12. use app\logics\AgentsLogic;
  13. use app\model\Setting;
  14. /**
  15. * 接口权限验证中间件
  16. */
  17. class Token
  18. {
  19. public function handle($request, \Closure $next)
  20. {
  21. // 请求控制器获取
  22. $controller = lcfirst($request->controller());
  23. // 请求方法获取
  24. $action = lcfirst($request->action());
  25. // 调试信息
  26. trace('控制器:' . $controller, 'debug');
  27. trace('方法名:' . $action, 'debug');
  28. trace('参数:' . json_encode($request->param()), 'debug');
  29. // 无需jwt验证控制器与方法获取
  30. $notNeed = config('app.jwt_not_check');
  31. // 判断控制器是否需要验证jwt
  32. if (isset($notNeed['CONTROLLER']) && in_array($controller, $notNeed['CONTROLLER'])) return $next($request);
  33. // 判断控制器中是否有方法无需验证jwt
  34. if (isset($notNeed[$controller])) {
  35. // 是否是要判断都选项
  36. $rs = in_array($action, $notNeed[$controller]);
  37. // 如果是, 判断是否是排除还是包含关系
  38. if ($rs && !(isset($notNeed[$controller]['EXCEPT']) && $notNeed[$controller]['EXCEPT'] == true)) return $next($request);
  39. }
  40. $jwt = $request->header('Authorization');
  41. if (empty($jwt)) return json(['code' => 1, 'msg' => '请登录']);
  42. $jwt = str_replace('bearer ', '', $jwt);
  43. try {
  44. JWT::$leeway = 60; //token的弹性有效时间
  45. $decoded = JWT::decode($jwt, config('app.jwt_key'), ['HS256']);
  46. $arr = (array) $decoded;
  47. $aes = new Aes(config('app.jwt_key'));
  48. $queryData = $aes->decrypt($arr['data']);
  49. parse_str($queryData, $token);
  50. } catch (Exception $e) {
  51. if ($request->isAjax()) {
  52. return json(['code' => 1, 'msg' => 'Token验证失败,请重新登录']);
  53. }
  54. throw new HttpException(404, 'Token验证失败,请重新登录');
  55. }
  56. $request->token = $token;
  57. //跳转添加经纪人控制器
  58. if ($controller == 'agentsWork') {
  59. $agtdata = Agentuser::where([['uid','=',$token['uid']],['root_id','=',$token['root_org']]])->find();
  60. if (!empty($agtdata) && $agtdata['status'] != 1) {
  61. return json(['code' => 1, 'msg' => '你的经纪人账号已停用']);
  62. } elseif (empty($agtdata)) {
  63. return json(['code' => 1, 'msg' => '你不属于经济人']);
  64. }
  65. $agentlog = new AgentsLogic();
  66. $daoday = 0;
  67. $agentlog->call_agt_integral($daoday, $agtdata['id'],$token['root_org']);
  68. $request->agtdata = $agtdata;
  69. }
  70. // 检测是否需要员工检测
  71. $employeeCheck = config('app.employee_check');
  72. if (!isset($employeeCheck['CONTROLLER']) || !in_array($controller, $employeeCheck['CONTROLLER'])) return $next($request);
  73. if (isset($employeeCheck[$controller]) && !in_array($action, $notNeed[$controller])) return $next($request);
  74. if (!$token['isEmployee'] || empty($token['employee_id'])) return json(['code' => 1, 'msg' => '请求失败']);
  75. // 判断是否离职
  76. if ($token['isEmployee']) {
  77. $employee = Employee::where(['id' => $token['employee_id']])->find();
  78. if ($employee->state == '离职' || $employee->disable == 1) return json(['code' => 403, 'msg' => '请重新登录']);
  79. if ($token['org_id'] != $employee->org_id) return json(['code' => 403, 'msg' => '部门变动,请重新登录']);
  80. $info = Company::where(['root_id' => $token['root_org']])->find();
  81. if ($info['end_date'] < date('Y-m-d') || $info['status'] == 1) return json(['code' => 403, 'msg' => '账号过期,请重新登录']);
  82. // 员工N天未登录限制进入小程序 设置是否开启
  83. $disable_day_setting = Setting::where([['name', '=', 'disable_day'], ['root_id', '=', $token['root_org']]])->findOrEmpty();
  84. if (!$disable_day_setting->isEmpty()) {
  85. $disable_switch = $disable_day_setting['content'];
  86. if ($disable_switch && $employee['last_login_time']) {
  87. // 不受限制人员
  88. $unlimit_check = false;
  89. $unlimited_employee = Setting::where([['name', '=', 'disable_day_unlimited'], ['root_id', '=', $token['root_org']]])->findOrEmpty();
  90. if (!$unlimited_employee->isEmpty()) {
  91. $unlimited_ids = explode(',', $unlimited_employee['content']);
  92. if (in_array($token['employee_id'], $unlimited_ids)) {
  93. $unlimit_check = true;
  94. }
  95. }
  96. if (!$unlimit_check) {
  97. $last_login_time = time() - strtotime($employee['last_login_time']);
  98. if ($last_login_time > 24*3600*5) {
  99. // 限制进入
  100. $employee->disable = 1;
  101. $employee->save();
  102. return json(['code' => 403, 'msg' => '请重新登录']);
  103. }
  104. }
  105. }
  106. }
  107. // 更新员工的上次登录时间
  108. $employee->last_login_time = date('Y-m-d H:i:s', time());
  109. $employee->save();
  110. //是否在新兵训练营中
  111. $camps = Camp::where([['root_id', '=', $token['root_org']], ['del', '=', 0]])->column('id');
  112. if ($camps && !in_array($controller,['train','exam']) && !in_array($action,['empdetail','haveOutCall','ticket'])) {
  113. $tw[] = ['camp_id', 'in', $camps];
  114. $check = CampEmployee::where([['state', '<>', '转正'], ['now', '=', 1], ['employee_id', '=', $token['employee_id']], ['root_id', '=', $token['root_org']]])->where($tw)->count();
  115. if ($check) {
  116. $detail = Employee::with([
  117. 'company' => function ($query) {
  118. $query->withField(['id', 'info', 'name', 'org_type']);
  119. }, 'user' => function ($query) {
  120. $query->withField(['id', 'phone', 'headimgurl', 'nickname', 'sex']);
  121. }, 'org' => function ($query) {
  122. $query->withField(['id', 'info', 'name', 'org_type']);
  123. }
  124. ])->field('id,phone,image_photo,is_manager,is_newbie,media_id,name,org_id,role,root_id,uid,qrcode,wx,position')->find($token['employee_id'])->toArray();
  125. $res = array_merge($detail,$token);
  126. return json(['code' => 601, 'msg' => '有未转正的新兵训练营。', 'data' => $res]);
  127. }
  128. }
  129. }
  130. return $next($request);
  131. }
  132. }