UserService.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. namespace App\Services;
  3. use App\Owner;
  4. use App\User;
  5. use App\UserWorkgroup;
  6. use Firebase\JWT\JWT;
  7. use Illuminate\Database\Eloquent\Model;
  8. use Illuminate\Support\Facades\Auth;
  9. use Illuminate\Support\Facades\Cache;
  10. use App\Traits\ServiceAppAop;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Log;
  13. class UserService
  14. {
  15. use ServiceAppAop;
  16. protected $modelClass=User::class;
  17. /** @var CacheService $cacheService */
  18. private $cacheService;
  19. function __construct(){
  20. $this->cacheService = app('CacheService');
  21. }
  22. function hasRoles(User $user, $roles){
  23. $thisRoles=$this->cacheService->getOrExecute("user{$user['id']}->roles",function()use($user){
  24. return $user->roles;
  25. });
  26. return !!$roles->intersect($thisRoles)->count();
  27. }
  28. function getPermittingLogisticIds($user=null){
  29. if(!$user)return [];
  30. return $this->cacheService->getOrExecute("user{$user['id']}->getPermittingLogisticIds",function()use($user){
  31. return $user->getPermittingLogisticIdsAttribute() ?? [];
  32. })??[];
  33. }
  34. /**
  35. * 检查用户的管理员身份
  36. *
  37. * @param integer $userId
  38. *
  39. * @return bool
  40. */
  41. public function checkAdminIdentity(int $userId):bool
  42. {
  43. if ($userId == Auth::id())return array_search(Auth::user()["name"],config("users.superAdmin"))!==false;
  44. /** @var User|\stdClass $user */
  45. $user = User::query()->select("name")->find($userId);
  46. if (!$user)return false;
  47. return array_search($user->name,config("users.superAdmin"))!==false;
  48. }
  49. /**
  50. * @param integer|null $userId
  51. *
  52. * @return array
  53. */
  54. public function getUserHasOwners($userId = null)
  55. {
  56. if (!$userId)$userId = Auth::id();
  57. $key = "owners:user_".$userId;
  58. if (!Cache::has($key)){
  59. if ($this->checkAdminIdentity($userId))Cache::forever($key,array_column(Owner::query()->select("id")->whereNull("deleted_at")->get()->toArray(),"id"));
  60. else{
  61. $owners = [];
  62. /** @var User|\stdClass $user */
  63. $user = new User();
  64. $user->id = $userId;
  65. $user->load("roles.owners");
  66. $user->roles->each(function ($role)use (&$owners){
  67. $owners = array_merge($owners,array_column($role->owners->toArray(),"id"));
  68. });
  69. Cache::forever($key,$owners);
  70. }
  71. }
  72. return Cache::get($key);
  73. }
  74. /**
  75. * @param integer|null $userId
  76. *
  77. * @return array
  78. */
  79. public function getUserHasUserWorkGroups($userId = null)
  80. {
  81. if (!$userId)$userId = Auth::id();
  82. $key = "userWorkGroups:user_".$userId;
  83. if (!Cache::has($key)){
  84. if ($this->checkAdminIdentity($userId))Cache::forever($key,array_column(UserWorkgroup::query()->select("id")->get()->toArray(),"id"));
  85. else{
  86. $userWorkGroups = [];
  87. /** @var User|\stdClass $user */
  88. $user = new User();
  89. $user->id = $userId;
  90. $user->load("roles.userWorkGroups");
  91. $user->roles->each(function ($role)use (&$userWorkGroups){
  92. $userWorkGroups = array_merge($userWorkGroups,array_column($role->userWorkGroups->toArray(),"id"));
  93. });
  94. Cache::forever($key,$userWorkGroups);
  95. }
  96. }
  97. return Cache::get($key);
  98. }
  99. /**
  100. * 清除用户缓存
  101. *
  102. * @param User $user
  103. */
  104. public function clearUserCache(User $user)
  105. {
  106. Cache::tags("authorities:user")->forget("authorities:user_".$user->id);
  107. Cache::tags("authorities:user")->forget("authorities:android:user_".$user->id);
  108. Cache::forget("owners:user_".$user->id);
  109. Cache::forget("userWorkGroups:user_".$user->id);
  110. Cache::tags("AUTHORITY_MENU_MAPPING")->forget("am_mapping_".$user->id);
  111. Cache::tags("USERS")->pull("user_info_".$user->id);
  112. }
  113. /**
  114. * 获取JWT token
  115. *
  116. * @param User|\stdClass $user
  117. * @param mixed $key
  118. * @return string
  119. */
  120. public function getJWTToken($user,$key):string
  121. {
  122. $time = time();
  123. $payload = [
  124. 'iss' => $_SERVER["HTTP_HOST"], //签发者
  125. 'iat' => $time,
  126. 'nbf' => $time,
  127. 'exp' => $time+config("api.timeliness_limits.token","7200"),
  128. 'data' => [
  129. 'id' => $user->id,
  130. 'username' => $user->name
  131. ]
  132. ];
  133. $alg = 'RS256';
  134. return JWT::encode($payload, $key, $alg);
  135. }
  136. /**
  137. * 设置或刷新缓存
  138. *
  139. * @param User|\stdClass|Model $user
  140. * @param null $exp
  141. */
  142. public function setOrRefreshCache($user, $exp = null)
  143. {
  144. if (!$exp)$exp = config("api.timeliness_limits.token","7200");
  145. Cache::tags("USERS")->put("user_info_".$user->id,$user,$exp);
  146. }
  147. /**
  148. * @param integer $id
  149. * @param integer $exp
  150. * @return User|\stdClass|null
  151. */
  152. public function getOrRefreshCache(int $id,int $exp):?Model
  153. {
  154. $user = Cache::tags("USERS")->get("user_info_".$id);
  155. if ($user)return $user;
  156. $user = User::query()->find($id);
  157. if (!$user)return null;
  158. $time = $exp-time();
  159. $this->setOrRefreshCache($user,$time>0 ? $time : 7200);
  160. return $user;
  161. }
  162. public function setSingleTag($key, $token)
  163. {
  164. $val = $token."#".md5($_SERVER['HTTP_USER_AGENT']);
  165. Cache::tags(User::ANDROID_SINGLE_TAG)->put($key,$val,
  166. config("api.timeliness_limits.token","7200"));
  167. }
  168. public function verifySingleTag($key, $token):bool
  169. {
  170. $tV = Cache::tags(User::ANDROID_SINGLE_TAG)->get($key);
  171. if ($tV===null)return true;
  172. $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? "#".md5($_SERVER['HTTP_USER_AGENT']) : "";
  173. return $tV===($token.$userAgent);
  174. }
  175. /**
  176. * 这里与ownerService的getIdArr区别为映射真实ID,摒弃其余因素干扰(超管身份,超级权限等)
  177. *
  178. * @param int|null $userId
  179. * @return array
  180. */
  181. public function getUserUnderOwnerIdArr(?int $userId = null) :array
  182. {
  183. if (!$userId){
  184. /**@var $user User*/
  185. $user = Auth::user();
  186. }else{
  187. $user = new User();
  188. $user->id = $userId;
  189. }
  190. $user->load("owners:id");
  191. return array_column($user->owners->toArray(),"id");
  192. }
  193. }