common.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. use Firebase\JWT\JWT;
  3. use Firebase\JWT\Key;
  4. /// 加密密钥
  5. $GLOBALS['token_key_secret'] = "z.1i8L?Ld+ovuA4r%4YZrz?w1Y%-NYvlrJ=TqV$[W[5=B#C[=l2gHV8gJ,DhZc";
  6. /// COOKIE 有效期
  7. $GLOBALS['cookieExpire'] = 60 * 60 * 24 * 7;
  8. /**
  9. * 响应成功json
  10. */
  11. if(!function_exists('json_success')){
  12. function json_success($data = [], $message = ""){
  13. return json([
  14. 'state' => 1,
  15. 'data' => $data,
  16. 'message' => $message ?? ""
  17. ]);
  18. }
  19. }
  20. /**
  21. * 响应失败json
  22. */
  23. if(!function_exists('json_error')){
  24. function json_error($data = [], $message = "", $code = 1){
  25. return json([
  26. 'state' => 0,
  27. 'code' => $code,
  28. 'data' => $data,
  29. 'message' => $message ?? ""
  30. ]);
  31. }
  32. }
  33. /**
  34. * 生成JWT Token
  35. *
  36. * @param array $data 待加密数据
  37. * @param int $expire 过期时间(秒),0表示使用默认过期时间
  38. * @return string
  39. */
  40. if(!function_exists('generateToken')){
  41. function generateToken($data = [], $expire = 0){
  42. $payload = [
  43. 'exp' => time() + ($expire > 0 ? $expire : $GLOBALS['cookieExpire']), // 有效期
  44. 'iat' => time(), // 签发时间
  45. ];
  46. $payload = array_merge($payload, $data);
  47. $token = JWT::encode($payload, $GLOBALS['token_key_secret'], 'HS256');
  48. return $token;
  49. }
  50. }
  51. /**
  52. * 解析JWT Token
  53. *
  54. * @param string $token JWT Token字符串
  55. * @return array|null 解析成功返回payload数组,失败返回null
  56. */
  57. if(!function_exists('parseToken')){
  58. function parseToken($token) {
  59. try {
  60. if (empty($token)) {
  61. return null;
  62. }
  63. // 使用JWT库解析token
  64. $decoded = JWT::decode($token, new Key($GLOBALS['token_key_secret'], 'HS256'));
  65. // 转换为数组
  66. $payload = (array) $decoded;
  67. // 检查是否过期
  68. if (isset($payload['exp']) && $payload['exp'] < time()) {
  69. return null;
  70. }
  71. return $payload;
  72. } catch (\Firebase\JWT\ExpiredException $e) {
  73. // Token已过期
  74. return null;
  75. } catch (\Firebase\JWT\SignatureInvalidException $e) {
  76. // 签名无效
  77. return null;
  78. } catch (\Firebase\JWT\BeforeValidException $e) {
  79. // Token尚未生效
  80. return null;
  81. } catch (\Exception $e) {
  82. // 其他异常
  83. return null;
  84. }
  85. }
  86. }
  87. /**
  88. * 验证Token是否有效
  89. *
  90. * @param string $token JWT Token字符串
  91. * @return bool
  92. */
  93. if(!function_exists('verifyToken')){
  94. function verifyToken($token) {
  95. return parseToken($token) !== null;
  96. }
  97. }
  98. /**
  99. * 检查用户登录状态
  100. *
  101. * @return array|null 登录成功返回用户信息数组,失败返回null
  102. */
  103. if(!function_exists('checkUserLogin')){
  104. function checkUserLogin() {
  105. $token = \think\facade\Cookie::get('auth_token');
  106. if (!$token) {
  107. return null;
  108. }
  109. return parseToken($token);
  110. }
  111. }
  112. /**
  113. * 检查用户权限
  114. *
  115. * @param array $user 用户信息数组
  116. * @param string $controller 控制器名称
  117. * @param string $action 操作名称
  118. * @return bool 有权限返回true,无权限返回false
  119. */
  120. if(!function_exists('checkPermission')){
  121. function checkPermission($user, $controller, $action) {
  122. // 超级管理员拥有所有权限
  123. $superAdminRoleId = \think\facade\Config::get('permission.super_admin_role_id', 1);
  124. if ($user['user_role'] == $superAdminRoleId) {
  125. return true;
  126. }
  127. // 获取用户角色权限
  128. $role = \app\model\UserRoleModel::getRoleById($user['user_role'], $user['merchant_id']);
  129. if (!$role) {
  130. return false;
  131. }
  132. $privileges = $role->privileges;
  133. // 检查是否有对应权限
  134. return isset($privileges[$controller]) &&
  135. is_array($privileges[$controller]) &&
  136. in_array($action, $privileges[$controller]);
  137. }
  138. }