From 133848976f23d9e79b00f8142f3701957f6ca93c Mon Sep 17 00:00:00 2001 From: sxu <602087911@qq.com> Date: Thu, 13 Mar 2025 20:54:05 +0800 Subject: [PATCH] oauth --- .../houqin/framework/secure/AccessToken.java | 242 ++++++ .../secure/AuthenticationPredicate.java | 5 + .../framework/secure/AuthorizingService.java | 15 + .../houqin/framework/secure/PmsCache.java | 40 + .../framework/secure/SecureManager.java | 244 ++++++ .../framework/secure/SecureProperties.java | 374 +++++++++ .../houqin/framework/secure/WebContext.java | 101 +++ .../core/auth/config/LoginProperties.java | 25 + .../core/auth/menu/vo/MgrMenuTreeVO.java | 171 ++++ .../canteen/core/auth/menu/vo/MgrMenuVO.java | 149 ++++ .../auth/oauth/controller/AuthController.java | 58 +- .../core/auth/oauth/util/OAuthUtil.java | 40 + .../core/auth/po/AuthOpsExpireMsgPO.java | 31 + .../core/auth/role/entity/MgrRoleMenu.java | 48 ++ .../auth/role/mapper/MgrRoleMenuMapper.java | 27 + .../business/MgrUserBurialPointBusiness.java | 28 + .../core/auth/user/dto/MgrUserInfo.java | 96 +++ .../core/auth/user/dto/MgrUserLoginDTO.java | 88 +++ .../auth/user/entity/MgrUserInSystem.java | 272 +++++++ .../core/auth/user/entity/MgrUserRole.java | 47 ++ .../user/mapper/MgrUserInSystemMapper.java | 23 + .../core/auth/user/mapper/MgrUserMapper.java | 7 +- .../auth/user/mapper/MgrUserRoleMapper.java | 22 + .../auth/user/service/MgrUserService.java | 449 ++++++----- .../core/auth/user/vo/MgrUserRoleInfoVO.java | 51 ++ .../core/auth/user/vo/MgrUserRolePageVO.java | 63 ++ .../common/enums/LogRecordOperTypeEnum.java | 27 + .../canteen/core/config/AccessToken.java | 484 ++++++------ .../core/config/AuthenticationPredicate.java | 10 +- .../canteen/core/config/SecureProperties.java | 743 +++++++++--------- .../bonus/canteen/core/config/SmUtils.java | 1 + .../bonus/canteen/core/config/WebContext.java | 202 ++--- .../config/json/JacksonConfiguration.java | 2 +- .../customer/service/AuthorizingService.java | 30 +- .../merchant/vo/MercMerchantEndTimeVO.java | 35 + .../notice/hawkeye/model/AllocLogRecord.java | 203 +++++ .../hawkeye/param/AllocLogRecordParam.java | 53 ++ .../service/AllocLogRecordService.java | 18 + .../impl/AllocLogRecordServiceImpl.java | 236 ++++++ .../hawkeye/util/LocalDateTimeConverter.java | 35 + .../bonus/canteen/core/secure/PmsCache.java | 80 +- .../CleanTenantIdTaskDecorator.java | 2 +- .../mapper/auth/MgrUserInSystemMapper.xml | 31 + .../mapper/auth/MgrUserRoleMapper.xml | 46 ++ 44 files changed, 3954 insertions(+), 1000 deletions(-) create mode 100644 bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AccessToken.java create mode 100644 bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthenticationPredicate.java create mode 100644 bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthorizingService.java create mode 100644 bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/PmsCache.java create mode 100644 bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureManager.java create mode 100644 bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureProperties.java create mode 100644 bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/WebContext.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/config/LoginProperties.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuTreeVO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuVO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/util/OAuthUtil.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/po/AuthOpsExpireMsgPO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/entity/MgrRoleMenu.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/mapper/MgrRoleMenuMapper.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/business/MgrUserBurialPointBusiness.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserInfo.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserLoginDTO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserInSystem.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserRole.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserInSystemMapper.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserRoleMapper.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRoleInfoVO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRolePageVO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/common/enums/LogRecordOperTypeEnum.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/merchant/vo/MercMerchantEndTimeVO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/model/AllocLogRecord.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/param/AllocLogRecordParam.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/AllocLogRecordService.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/impl/AllocLogRecordServiceImpl.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/util/LocalDateTimeConverter.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserInSystemMapper.xml create mode 100644 bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserRoleMapper.xml diff --git a/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AccessToken.java b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AccessToken.java new file mode 100644 index 00000000..9f384953 --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AccessToken.java @@ -0,0 +1,242 @@ +package com.bonus.common.houqin.framework.secure; + +import cn.hutool.core.util.ArrayUtil; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; + +import java.time.Instant; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +@JsonIgnoreProperties( + ignoreUnknown = true +) +public class AccessToken { + private static final Logger log = LoggerFactory.getLogger(AccessToken.class); + @JsonIgnore + protected static ObjectMapper objectMapper; + @JsonIgnore + protected static SecureProperties secureProperties; + @JsonIgnore + protected static StringRedisTemplate redisTemplate; + @JsonIgnore + protected static AuthenticationPredicate authenticationPredicate; + private String id; + private Long subjectId; + private String subjectName; + private Map subjectData = Maps.newHashMap(); + private String scope; + private boolean identified; + private long createTime; + private long lastTime; + + public static Optional recovery(String clientToken) { + StringRedisTemplate var10000 = redisTemplate; + String var10001 = secureProperties.getServer().getStoreKey(); + clientToken = (String)var10000.boundValueOps(var10001 + ":" + clientToken).get(); + if (StringUtils.isBlank(clientToken)) { + return Optional.empty(); + } else { + try { + AccessToken existToken = (AccessToken)objectMapper.readValue(clientToken, AccessToken.class); + return authenticationPredicate.authenticated(existToken) ? Optional.of(existToken) : Optional.empty(); + } catch (Exception var2) { + log.error("Deserialize exist token error", var2); + return Optional.empty(); + } + } + } + + public static AccessToken create(long subjectId) { + AccessToken accessToken = create(); + accessToken.setSubjectId(subjectId); + return accessToken; + } + + public static AccessToken create(long subjectId, String subjectName) { + AccessToken accessToken = create(subjectId); + accessToken.setSubjectName(subjectName); + return accessToken; + } + + public static AccessToken create() { + AccessToken accessToken = new AccessToken(); + accessToken.setId(UUID.randomUUID().toString()); + accessToken.setCreateTime(Instant.now().getEpochSecond()); + accessToken.setLastTime(Instant.now().getEpochSecond()); + return accessToken; + } + + public AccessToken touch() { + this.identified = this.isAuthenticated(); + this.lastTime = Instant.now().getEpochSecond(); + return this.store(); + } + + @JsonIgnore + public boolean isAuthenticated() { + return this.identified && !this.isExpired(); + } + + @JsonIgnore + private boolean isExpired() { + return this.lastTime + secureProperties.getExpireAfter() < Instant.now().getEpochSecond(); + } + + public AccessToken withData(Map data) { + this.subjectData = data; + return this; + } + + public AccessToken setData(String name, String value) { + this.subjectData.put(name, value); + return this; + } + + public AccessToken removeData(String... keys) { + if (ArrayUtil.isEmpty(keys)) { + return this; + } else { + String[] var2 = keys; + int var3 = keys.length; + + for(int var4 = 0; var4 < var3; ++var4) { + String key = var2[var4]; + this.subjectData.remove(key); + } + + return this; + } + } + + public AccessToken revokeAuthenticate() { + this.identified = false; + return this.store(); + } + + public AccessToken authenticate() { + if (this.subjectId == null) { + throw new RuntimeException("required subjectId is not provide"); + } else { + this.identified = true; + return this; + } + } + + public AccessToken store() { + try { + StringRedisTemplate var10000 = redisTemplate; + DefaultRedisScript var10001 = new DefaultRedisScript("redis.call('SET',KEYS[1],ARGV[1],'EX',ARGV[3]);redis.call('SET',KEYS[2],ARGV[2],'EX',ARGV[3]);"); + String[] var10002 = new String[2]; + String var10005 = secureProperties.getServer().getStoreKey(); + var10002[0] = var10005 + ":" + this.getId(); + var10005 = secureProperties.getServer().getSubjectRefTokenKey(); + var10002[1] = var10005 + ":" + this.getSubjectId() + ":" + this.getId() + ":" + this.getCreateTime(); + var10000.execute(var10001, Lists.newArrayList(var10002), new Object[]{objectMapper.writeValueAsString(this), this.getId(), String.valueOf(secureProperties.getServer().getTtl())}); + } catch (Exception var2) { + log.error("Token store error", var2); + } + + return this; + } + + public AccessToken bind() { + WebContext.get().setAccessToken(this); + return this; + } + + public void write() { + WebContext.get().getResponse().ifPresent((response) -> { + response.setHeader(secureProperties.getTokenSymbol(), this.getId()); + }); + } + + public void clear() { + try { + StringRedisTemplate var10000 = redisTemplate; + DefaultRedisScript var10001 = new DefaultRedisScript("redis.call('DEL',KEYS[1],KEYS[2]);"); + String[] var10002 = new String[2]; + String var10005 = secureProperties.getServer().getStoreKey(); + var10002[0] = var10005 + ":" + this.getId(); + var10005 = secureProperties.getServer().getSubjectRefTokenKey(); + var10002[1] = var10005 + ":" + this.getSubjectId() + ":" + this.getId() + ":" + this.getCreateTime(); + var10000.execute(var10001, Lists.newArrayList(var10002), new Object[0]); + } catch (Exception var2) { + log.error("Token clear error", var2); + } + + } + + public String getId() { + return this.id; + } + + public Long getSubjectId() { + return this.subjectId; + } + + public String getSubjectName() { + return this.subjectName; + } + + public Map getSubjectData() { + return this.subjectData; + } + + public String getScope() { + return this.scope; + } + + public boolean isIdentified() { + return this.identified; + } + + public long getCreateTime() { + return this.createTime; + } + + public long getLastTime() { + return this.lastTime; + } + + public void setId(final String id) { + this.id = id; + } + + public void setSubjectId(final Long subjectId) { + this.subjectId = subjectId; + } + + public void setSubjectName(final String subjectName) { + this.subjectName = subjectName; + } + + public void setSubjectData(final Map subjectData) { + this.subjectData = subjectData; + } + + public void setScope(final String scope) { + this.scope = scope; + } + + public void setIdentified(final boolean identified) { + this.identified = identified; + } + + public void setCreateTime(final long createTime) { + this.createTime = createTime; + } + + public void setLastTime(final long lastTime) { + this.lastTime = lastTime; + } +} diff --git a/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthenticationPredicate.java b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthenticationPredicate.java new file mode 100644 index 00000000..b827edf7 --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthenticationPredicate.java @@ -0,0 +1,5 @@ +package com.bonus.common.houqin.framework.secure; + +public interface AuthenticationPredicate { + boolean authenticated(AccessToken accessToken); +} diff --git a/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthorizingService.java b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthorizingService.java new file mode 100644 index 00000000..d050552d --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/AuthorizingService.java @@ -0,0 +1,15 @@ +package com.bonus.common.houqin.framework.secure; + +import com.google.common.collect.Sets; + +import java.util.Set; + +public interface AuthorizingService { + default Set roles(long accountId) { + return Sets.newHashSet(); + } + + default Set permissions(long accountId) { + return Sets.newHashSet(); + } +} diff --git a/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/PmsCache.java b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/PmsCache.java new file mode 100644 index 00000000..7d5c8c84 --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/PmsCache.java @@ -0,0 +1,40 @@ +package com.bonus.common.houqin.framework.secure; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.time.Instant; +import java.util.Set; + +public class PmsCache { + private long expireTime; + private Set pms; + + @JsonIgnore + public boolean isExpired() { + return Instant.now().getEpochSecond() > this.expireTime; + } + + public long getExpireTime() { + return this.expireTime; + } + + public Set getPms() { + return this.pms; + } + + public void setExpireTime(final long expireTime) { + this.expireTime = expireTime; + } + + public void setPms(final Set pms) { + this.pms = pms; + } + + public PmsCache(final long expireTime, final Set pms) { + this.expireTime = expireTime; + this.pms = pms; + } + + public PmsCache() { + } +} diff --git a/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureManager.java b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureManager.java new file mode 100644 index 00000000..16f4904f --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureManager.java @@ -0,0 +1,244 @@ +package com.bonus.common.houqin.framework.secure; + +import cn.hutool.core.map.MapUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.BoundHashOperations; +import org.springframework.data.redis.core.StringRedisTemplate; +import java.time.Instant; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class SecureManager { + private static final Logger log = LoggerFactory.getLogger(SecureManager.class); + private static SecureProperties secureProperties; + private static StringRedisTemplate redisTemplate; + private static AuthorizingService authorizingService; + private static ObjectMapper objectMapper; + + private SecureManager() { + } + + public static void setSecureProperties(SecureProperties secureProperties) { + if (SecureManager.secureProperties == null) { + SecureManager.secureProperties = secureProperties; + } + } + + public static void setRedisTemplate(StringRedisTemplate redisTemplate) { + if (SecureManager.redisTemplate == null) { + SecureManager.redisTemplate = redisTemplate; + } + } + + public static void setAuthorizingService(AuthorizingService authorizingService) { + if (SecureManager.authorizingService == null) { + SecureManager.authorizingService = authorizingService; + } + } + + public static void setObjectMapper(ObjectMapper objectMapper) { + if (SecureManager.objectMapper == null) { + SecureManager.objectMapper = objectMapper; + } + } + + private static String getPmsKey(long subjectId) { + return "permissions:subject_id:" + subjectId; + } + + private static String getRoleKey(long subjectId) { + return "roles:subject_id:" + subjectId; + } + + public static void clearAllRoleAndPermission() { + redisTemplate.delete(secureProperties.getPermissionKey()); + } + + public static void clearRoleAndPermission(long subjectId) { + redisTemplate.boundHashOps(secureProperties.getPermissionKey()).delete(new Object[]{getRoleKey(subjectId), getPmsKey(subjectId)}); + } + + public static void clearRole(long subjectId) { + redisTemplate.boundHashOps(secureProperties.getPermissionKey()).delete(new Object[]{getRoleKey(subjectId)}); + } + + public static void clearPermission(long subjectId) { + redisTemplate.boundHashOps(secureProperties.getPermissionKey()).delete(new Object[]{getPmsKey(subjectId)}); + } + + public static Set getPermission() { + return getPms(SecureManager::getPmsKey, (subjectId) -> { + return authorizingService.permissions(subjectId); + }); + } + + public static Set getRole() { + return getPms(SecureManager::getRoleKey, (subjectId) -> { + return authorizingService.roles(subjectId); + }); + } + + public static boolean hasRole(String... role) { + return getRole().containsAll(Arrays.asList(role)); + } + + public static boolean hasAnyRole(String... role) { + Stream var10000 = Stream.of(role); + Set var10001 = getRole(); + Objects.requireNonNull(var10001); + return var10000.anyMatch(var10001::contains); + } + + public static boolean hasPermission(String... pms) { + return getPermission().containsAll(Arrays.asList(pms)); + } + + public static boolean hasAnyPermission(String... pms) { + Stream var10000 = Stream.of(pms); + Set var10001 = getPermission(); + Objects.requireNonNull(var10001); + return var10000.anyMatch(var10001::contains); + } + + public static boolean isLogin() { + return (Boolean)WebContext.get().getAccessToken().map(AccessToken::isAuthenticated).orElse(false); + } + + public static Optional getSubjectId() { + return WebContext.get().getAccessToken().map(AccessToken::getSubjectId); + } + + public static Optional getSubjectName() { + return WebContext.get().getAccessToken().map(AccessToken::getSubjectName); + } + + public static Map getSubjectData() { + return (Map)WebContext.get().getAccessToken().map(AccessToken::getSubjectData).orElse(Maps.newHashMap()); + } + + public static Map attachData(Map data) { + try { + if (MapUtil.isEmpty(data)) { + return Maps.newHashMapWithExpectedSize(0); + } else { + AccessToken accessToken = (AccessToken)WebContext.get().getAccessToken().orElse(AccessToken.create()); + Objects.requireNonNull(accessToken); + data.forEach(accessToken::setData); + accessToken.bind().store(); + return accessToken.getSubjectData(); + } + } catch (Throwable var2) { + throw var2; + } + } + + public static Map attachData(String key, String value) { + try { + return attachData(Collections.singletonMap(key, value)); + } catch (Throwable var3) { + throw var3; + } + } + + public static Map removeData(String... key) { + try { + Optional accessToken = WebContext.get().getAccessToken(); + return (Map)(!accessToken.isPresent() ? Maps.newHashMap() : ((AccessToken)accessToken.get()).removeData(key).getSubjectData()); + } catch (Throwable var2) { + throw var2; + } + } + + public static Set getPms(Function keySupplier, Function> pmsSupplier) { + if (!WebContext.get().getAccessToken().isPresent()) { + return Sets.newHashSetWithExpectedSize(0); + } else { + Long subjectId = ((AccessToken)WebContext.get().getAccessToken().get()).getSubjectId(); + if (subjectId == null) { + return Sets.newHashSetWithExpectedSize(0); + } else { + BoundHashOperations pmsStore = redisTemplate.boundHashOps(secureProperties.getPermissionKey()); + String pmsKey = (String)keySupplier.apply(subjectId); + if (BooleanUtils.isNotTrue(pmsStore.hasKey(pmsKey))) { + Set pms = (Set)pmsSupplier.apply(subjectId); + if (pms == null) { + pms = Sets.newHashSetWithExpectedSize(0); + } + + try { + pmsStore.put(pmsKey, objectMapper.writeValueAsString(new PmsCache(Instant.now().plusSeconds(secureProperties.getPermissionTTL()).getEpochSecond(), (Set)pms))); + } catch (JsonProcessingException var8) { + log.error("Save permission error", var8); + } + + return (Set)pms; + } else { + String permissionValue = (String)pmsStore.get(pmsKey); + if (permissionValue == null) { + return getPms(keySupplier, pmsSupplier); + } else { + PmsCache cachedPms; + try { + cachedPms = (PmsCache)objectMapper.readValue(permissionValue, PmsCache.class); + } catch (JsonProcessingException var9) { + log.error("Read permission error", var9); + return Sets.newHashSet(); + } + + if (cachedPms.isExpired()) { + log.info("Permission cache expired, read new"); + redisTemplate.boundHashOps(secureProperties.getPermissionKey()).delete(new Object[]{pmsKey}); + return getPms(keySupplier, pmsSupplier); + } else { + return cachedPms.getPms(); + } + } + } + } + } + } + + public static void logout() { + WebContext.get().getAccessToken().ifPresent(AccessToken::clear); + } + + public static void revokeAuthenticate() { + WebContext.get().getAccessToken().ifPresent((accessToken) -> { + accessToken.revokeAuthenticate().store(); + }); + } + + public static void revokeAuthenticate(long subjectId, int reservedRecentNum) { + StringRedisTemplate var10000 = redisTemplate; + String var10001 = secureProperties.getServer().getSubjectRefTokenKey(); + Set keys = var10000.keys(var10001 + ":" + subjectId + ":*"); + if (CollectionUtils.size(keys) > reservedRecentNum) { + assert keys != null; + + Map> createTimeAsc_keys = (Map)keys.stream().collect(Collectors.groupingBy((key) -> { + return Long.parseLong(key.split(":")[4]); + }, TreeMap::new, Collectors.toList())); + List keysAsc = createTimeAsc_keys.values().stream().flatMap(Collection::stream).collect(Collectors.toList()); + List beDeleteRefKeys = keysAsc.subList(0, keysAsc.size() - reservedRecentNum); + List beDeleteTokenKeys = beDeleteRefKeys.stream().map((dk) -> { + String var100001 = secureProperties.getServer().getStoreKey(); + return var100001 + ":" + dk.split(":")[3]; + }).collect(Collectors.toList()); + redisTemplate.delete(ListUtils.sum(beDeleteRefKeys, beDeleteTokenKeys)); + } + } + + public String toString() { + return "SecureManager()"; + } +} diff --git a/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureProperties.java b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureProperties.java new file mode 100644 index 00000000..a12233f3 --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/SecureProperties.java @@ -0,0 +1,374 @@ +package com.bonus.common.houqin.framework.secure; + +import cn.hutool.core.codec.Base64Decoder; +import com.google.common.collect.Sets; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +import java.util.Set; + +@RefreshScope +@Component +@ConfigurationProperties( + prefix = "secure" +) +public class SecureProperties { + public static final String PREFIX = "secure"; + private boolean enabled = true; + private boolean prohibitUnannotatedHandler = false; + private String tokenSymbol = "X-Token"; + private String permissionKey = "secure:pms"; + private long permissionTTL = 7200L; + private long expireAfter = 7200L; + private ServerStore server = new ServerStore(); + private Security security = new Security(); + private MdcLogParameter mdc = new MdcLogParameter(); + + public boolean isEnabled() { + return this.enabled; + } + + public boolean isProhibitUnannotatedHandler() { + return this.prohibitUnannotatedHandler; + } + + public String getTokenSymbol() { + return this.tokenSymbol; + } + + public String getPermissionKey() { + return this.permissionKey; + } + + public long getPermissionTTL() { + return this.permissionTTL; + } + + public long getExpireAfter() { + return this.expireAfter; + } + + public ServerStore getServer() { + return this.server; + } + + public Security getSecurity() { + return this.security; + } + + public MdcLogParameter getMdc() { + return this.mdc; + } + + public void setEnabled(final boolean enabled) { + this.enabled = enabled; + } + + public void setProhibitUnannotatedHandler(final boolean prohibitUnannotatedHandler) { + this.prohibitUnannotatedHandler = prohibitUnannotatedHandler; + } + + public void setTokenSymbol(final String tokenSymbol) { + this.tokenSymbol = tokenSymbol; + } + + public void setPermissionKey(final String permissionKey) { + this.permissionKey = permissionKey; + } + + public void setPermissionTTL(final long permissionTTL) { + this.permissionTTL = permissionTTL; + } + + public void setExpireAfter(final long expireAfter) { + this.expireAfter = expireAfter; + } + + public void setServer(final ServerStore server) { + this.server = server; + } + + public void setSecurity(final Security security) { + this.security = security; + } + + public void setMdc(final MdcLogParameter mdc) { + this.mdc = mdc; + } + + public static class ServerStore { + private String storeKey = "secure:token"; + private String subjectRefTokenKey = "secure:subject-token"; + private long ttl = 14400L; + + public String getStoreKey() { + return this.storeKey; + } + + public String getSubjectRefTokenKey() { + return this.subjectRefTokenKey; + } + + public long getTtl() { + return this.ttl; + } + + public void setStoreKey(final String storeKey) { + this.storeKey = storeKey; + } + + public void setSubjectRefTokenKey(final String subjectRefTokenKey) { + this.subjectRefTokenKey = subjectRefTokenKey; + } + + public void setTtl(final long ttl) { + this.ttl = ttl; + } + } + + public static class Security { + private String encryptUriPrefix = "/security"; + private String keyExchangePath = "/exchange/key"; + private String publicKeyExchangePath = "/exchange/public-key"; + private Set ignoredUri = Sets.newHashSet(); + private String requestBodySignParamName = "body"; + private String clientKeySignParamName = "clientKey"; + private Set addonSignHeaderPrefix = Sets.newHashSet(new String[]{"X-Security-Ext"}); + private Set tokenHeaderNames = Sets.newHashSet(new String[]{"X-Security-Token", "X-Security-Tenant-Id", "X-Security-Sn"}); + private String tokenSignHeaderName = "X-Security-Token-Sign"; + private String serverKeySignParamName = "serverKey"; + private String serverSm4Key = "McaCOPft5/J3bUG4pdVjhg=="; + private byte[] serverSm4KeyBytes; + private String serverSm2Key; + private byte[] serverSm2KeyBytes; + private String clientSm2Key; + private byte[] clientSm2KeyBytes; + private String timestampHeaderName; + private String nonceHeaderName; + private String signHeaderName; + private String serverEncryptedClientKeyHeaderName; + private long maxWindowSeconds; + private String playKey; + + public void setServerSm4Key(String serverSm4Key) { + this.serverSm4Key = serverSm4Key; + this.serverSm4KeyBytes = Base64Decoder.decode(serverSm4Key); + } + + public Security() { + this.serverSm4KeyBytes = Base64Decoder.decode(this.serverSm4Key); + this.serverSm2Key = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCtqk5Jj7pPWh91d9mPA4Kd7fOfzBULrnAERNDV+4XBCgCgYIKoEcz1UBgi2hRANCAARykhB6sXHWTbB60Pr+laPqEP5JBRpEcySONKKP5Q03o/g3OpnQXc7aVMdLUxL8wD1wQHEu4KHmHQr7jvVt0rkM"; + this.serverSm2KeyBytes = Base64Decoder.decode(this.serverSm2Key); + this.clientSm2Key = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEcpIQerFx1k2wetD6/pWj6hD+SQUaRHMkjjSij+UNN6P4NzqZ0F3O2lTHS1MS/MA9cEBxLuCh5h0K+471bdK5DA=="; + this.clientSm2KeyBytes = Base64Decoder.decode(this.serverSm2Key); + this.timestampHeaderName = "X-Security-Timestamp"; + this.nonceHeaderName = "X-Security-Nonce"; + this.signHeaderName = "X-Security-Sign"; + this.serverEncryptedClientKeyHeaderName = "X-Security-Server-Encrypted-Client-Key"; + this.maxWindowSeconds = 90L; + this.playKey = "__play:"; + } + + public static void main(String[] args) { + String serverSm2Key = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCtqk5Jj7pPWh91d9mPA4Kd7fOfzBULrnAERNDV+4XBCgCgYIKoEcz1UBgi2hRANCAARykhB6sXHWTbB60Pr+laPqEP5JBRpEcySONKKP5Q03o/g3OpnQXc7aVMdLUxL8wD1wQHEu4KHmHQr7jvVt0rkM"; + System.out.println(Base64Decoder.decode(serverSm2Key)); + String clientSm2Key = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEcpIQerFx1k2wetD6/pWj6hD+SQUaRHMkjjSij+UNN6P4NzqZ0F3O2lTHS1MS/MA9cEBxLuCh5h0K+471bdK5DA=="; + System.out.println(Base64Decoder.decode(clientSm2Key)); + } + + public String getEncryptUriPrefix() { + return this.encryptUriPrefix; + } + + public String getKeyExchangePath() { + return this.keyExchangePath; + } + + public String getPublicKeyExchangePath() { + return this.publicKeyExchangePath; + } + + public Set getIgnoredUri() { + return this.ignoredUri; + } + + public String getRequestBodySignParamName() { + return this.requestBodySignParamName; + } + + public String getClientKeySignParamName() { + return this.clientKeySignParamName; + } + + public Set getAddonSignHeaderPrefix() { + return this.addonSignHeaderPrefix; + } + + public Set getTokenHeaderNames() { + return this.tokenHeaderNames; + } + + public String getTokenSignHeaderName() { + return this.tokenSignHeaderName; + } + + public String getServerKeySignParamName() { + return this.serverKeySignParamName; + } + + public String getServerSm4Key() { + return this.serverSm4Key; + } + + public byte[] getServerSm4KeyBytes() { + return this.serverSm4KeyBytes; + } + + public String getServerSm2Key() { + return this.serverSm2Key; + } + + public byte[] getServerSm2KeyBytes() { + return this.serverSm2KeyBytes; + } + + public String getClientSm2Key() { + return this.clientSm2Key; + } + + public byte[] getClientSm2KeyBytes() { + return this.clientSm2KeyBytes; + } + + public String getTimestampHeaderName() { + return this.timestampHeaderName; + } + + public String getNonceHeaderName() { + return this.nonceHeaderName; + } + + public String getSignHeaderName() { + return this.signHeaderName; + } + + public String getServerEncryptedClientKeyHeaderName() { + return this.serverEncryptedClientKeyHeaderName; + } + + public long getMaxWindowSeconds() { + return this.maxWindowSeconds; + } + + public String getPlayKey() { + return this.playKey; + } + + public void setEncryptUriPrefix(final String encryptUriPrefix) { + this.encryptUriPrefix = encryptUriPrefix; + } + + public void setKeyExchangePath(final String keyExchangePath) { + this.keyExchangePath = keyExchangePath; + } + + public void setPublicKeyExchangePath(final String publicKeyExchangePath) { + this.publicKeyExchangePath = publicKeyExchangePath; + } + + public void setIgnoredUri(final Set ignoredUri) { + this.ignoredUri = ignoredUri; + } + + public void setRequestBodySignParamName(final String requestBodySignParamName) { + this.requestBodySignParamName = requestBodySignParamName; + } + + public void setClientKeySignParamName(final String clientKeySignParamName) { + this.clientKeySignParamName = clientKeySignParamName; + } + + public void setAddonSignHeaderPrefix(final Set addonSignHeaderPrefix) { + this.addonSignHeaderPrefix = addonSignHeaderPrefix; + } + + public void setTokenHeaderNames(final Set tokenHeaderNames) { + this.tokenHeaderNames = tokenHeaderNames; + } + + public void setTokenSignHeaderName(final String tokenSignHeaderName) { + this.tokenSignHeaderName = tokenSignHeaderName; + } + + public void setServerKeySignParamName(final String serverKeySignParamName) { + this.serverKeySignParamName = serverKeySignParamName; + } + + public void setServerSm4KeyBytes(final byte[] serverSm4KeyBytes) { + this.serverSm4KeyBytes = serverSm4KeyBytes; + } + + public void setServerSm2Key(final String serverSm2Key) { + this.serverSm2Key = serverSm2Key; + } + + public void setServerSm2KeyBytes(final byte[] serverSm2KeyBytes) { + this.serverSm2KeyBytes = serverSm2KeyBytes; + } + + public void setClientSm2Key(final String clientSm2Key) { + this.clientSm2Key = clientSm2Key; + } + + public void setClientSm2KeyBytes(final byte[] clientSm2KeyBytes) { + this.clientSm2KeyBytes = clientSm2KeyBytes; + } + + public void setTimestampHeaderName(final String timestampHeaderName) { + this.timestampHeaderName = timestampHeaderName; + } + + public void setNonceHeaderName(final String nonceHeaderName) { + this.nonceHeaderName = nonceHeaderName; + } + + public void setSignHeaderName(final String signHeaderName) { + this.signHeaderName = signHeaderName; + } + + public void setServerEncryptedClientKeyHeaderName(final String serverEncryptedClientKeyHeaderName) { + this.serverEncryptedClientKeyHeaderName = serverEncryptedClientKeyHeaderName; + } + + public void setMaxWindowSeconds(final long maxWindowSeconds) { + this.maxWindowSeconds = maxWindowSeconds; + } + + public void setPlayKey(final String playKey) { + this.playKey = playKey; + } + + } + + public static class MdcLogParameter { + private String subjectId = "x-id"; + private String subjectName = "x-name"; + + public String getSubjectId() { + return this.subjectId; + } + + public String getSubjectName() { + return this.subjectName; + } + + public void setSubjectId(final String subjectId) { + this.subjectId = subjectId; + } + + public void setSubjectName(final String subjectName) { + this.subjectName = subjectName; + } + } +} diff --git a/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/WebContext.java b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/WebContext.java new file mode 100644 index 00000000..99ba7c48 --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/common/houqin/framework/secure/WebContext.java @@ -0,0 +1,101 @@ +package com.bonus.common.houqin.framework.secure; + +import com.google.common.collect.Maps; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; +import java.util.Optional; + +public class WebContext { + private static final ThreadLocal THREAD_CONTEXT = new InheritableThreadLocal() { + protected Context initialValue() { + return new Context(); + } + }; + + private WebContext() { + } + + public static void reset() { + THREAD_CONTEXT.remove(); + } + + public static Context get() { + return (Context)THREAD_CONTEXT.get(); + } + + public static void set(Context context) { + THREAD_CONTEXT.set(context); + } + + public static class Context { + private HttpServletRequest request; + private HttpServletResponse response; + private AccessToken accessToken; + private Map attributes = Maps.newHashMap(); + + public Context(HttpServletRequest request, HttpServletResponse response) { + this.request = request; + this.response = response; + } + + public void setAttribute(String key, Object data) { + this.attributes.put(key, data); + } + + public Object getAttribute(String key) { + return this.attributes.get(key); + } + + public void removeAttribute(String key) { + this.attributes.remove(key); + } + + public void clearAttribute() { + this.attributes.clear(); + } + + public Optional getAccessToken() { + return Optional.ofNullable(this.accessToken); + } + + public Optional getRequest() { + return Optional.ofNullable(this.request); + } + + public Optional getResponse() { + return Optional.ofNullable(this.response); + } + + public Map getAttributes() { + return this.attributes; + } + + public void setRequest(final HttpServletRequest request) { + this.request = request; + } + + public void setResponse(final HttpServletResponse response) { + this.response = response; + } + + public void setAccessToken(final AccessToken accessToken) { + this.accessToken = accessToken; + } + + public void setAttributes(final Map attributes) { + this.attributes = attributes; + } + + public Context() { + } + + public Context(final HttpServletRequest request, final HttpServletResponse response, final AccessToken accessToken, final Map attributes) { + this.request = request; + this.response = response; + this.accessToken = accessToken; + this.attributes = attributes; + } + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/config/LoginProperties.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/config/LoginProperties.java new file mode 100644 index 00000000..c7f7a416 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/config/LoginProperties.java @@ -0,0 +1,25 @@ +package com.bonus.canteen.core.auth.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties( + prefix = "system.login" +) +public class LoginProperties { + public static final String PREFIX = "system.login"; + private Integer reservedRecentNum; + + public Integer getReservedRecentNum() { + return this.reservedRecentNum; + } + + public void setReservedRecentNum(final Integer reservedRecentNum) { + this.reservedRecentNum = reservedRecentNum; + } + + public String toString() { + return "LoginProperties(reservedRecentNum=" + this.getReservedRecentNum() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuTreeVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuTreeVO.java new file mode 100644 index 00000000..52742d97 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuTreeVO.java @@ -0,0 +1,171 @@ +package com.bonus.canteen.core.auth.menu.vo; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("菜单树") +public class MgrMenuTreeVO { + @TableId + @ApiModelProperty("菜单id") + private Long menuId; + @ApiModelProperty("编码") + private String menuCode; + @ApiModelProperty("菜单名称") + private @NotBlank( + message = "菜单名称不能为空" +) String name; + @ApiModelProperty("菜单父id") + private @NotNull( + message = "菜单父ID不能为空" +) Long parentId; + @ApiModelProperty("删除标记") + private Integer delFlag; + @ApiModelProperty("是否默认选中") + private Integer ifDefault; + @ApiModelProperty("排序号") + private Integer sort; + @ApiModelProperty("是否有子级") + private Integer hasChildren; + @ApiModelProperty("节点状态:1全选;2半选") + private Integer halfSelect; + @ApiModelProperty("0:菜单;1:按钮;2:目录") + private Integer type; + @ApiModelProperty("页面是否缓存(1缓存 2不缓存)") + private Integer ifCache; + @ApiModelProperty("菜单状态(1显示 2隐藏)") + private Integer ifVisible; + @ApiModelProperty("组件路径") + private String component; + @ApiModelProperty("菜单图标") + private String icon; + @ApiModelProperty("菜单归属类型:1:web,2:app") + private Integer webType; + + public Long getMenuId() { + return this.menuId; + } + + public String getMenuCode() { + return this.menuCode; + } + + public String getName() { + return this.name; + } + + public Long getParentId() { + return this.parentId; + } + + public Integer getDelFlag() { + return this.delFlag; + } + + public Integer getIfDefault() { + return this.ifDefault; + } + + public Integer getSort() { + return this.sort; + } + + public Integer getHasChildren() { + return this.hasChildren; + } + + public Integer getHalfSelect() { + return this.halfSelect; + } + + public Integer getType() { + return this.type; + } + + public Integer getIfCache() { + return this.ifCache; + } + + public Integer getIfVisible() { + return this.ifVisible; + } + + public String getComponent() { + return this.component; + } + + public String getIcon() { + return this.icon; + } + + public Integer getWebType() { + return this.webType; + } + + public void setMenuId(final Long menuId) { + this.menuId = menuId; + } + + public void setMenuCode(final String menuCode) { + this.menuCode = menuCode; + } + + public void setName(final String name) { + this.name = name; + } + + public void setParentId(final Long parentId) { + this.parentId = parentId; + } + + public void setDelFlag(final Integer delFlag) { + this.delFlag = delFlag; + } + + public void setIfDefault(final Integer ifDefault) { + this.ifDefault = ifDefault; + } + + public void setSort(final Integer sort) { + this.sort = sort; + } + + public void setHasChildren(final Integer hasChildren) { + this.hasChildren = hasChildren; + } + + public void setHalfSelect(final Integer halfSelect) { + this.halfSelect = halfSelect; + } + + public void setType(final Integer type) { + this.type = type; + } + + public void setIfCache(final Integer ifCache) { + this.ifCache = ifCache; + } + + public void setIfVisible(final Integer ifVisible) { + this.ifVisible = ifVisible; + } + + public void setComponent(final String component) { + this.component = component; + } + + public void setIcon(final String icon) { + this.icon = icon; + } + + public void setWebType(final Integer webType) { + this.webType = webType; + } + + public String toString() { + Long var10000 = this.getMenuId(); + return "MgrMenuTreeVO(menuId=" + var10000 + ", menuCode=" + this.getMenuCode() + ", name=" + this.getName() + ", parentId=" + this.getParentId() + ", delFlag=" + this.getDelFlag() + ", ifDefault=" + this.getIfDefault() + ", sort=" + this.getSort() + ", hasChildren=" + this.getHasChildren() + ", halfSelect=" + this.getHalfSelect() + ", type=" + this.getType() + ", ifCache=" + this.getIfCache() + ", ifVisible=" + this.getIfVisible() + ", component=" + this.getComponent() + ", icon=" + this.getIcon() + ", webType=" + this.getWebType() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuVO.java new file mode 100644 index 00000000..7718342d --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/menu/vo/MgrMenuVO.java @@ -0,0 +1,149 @@ +package com.bonus.canteen.core.auth.menu.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel("菜单") +public class MgrMenuVO { + @ApiModelProperty("菜单ID") + private String menuId; + @ApiModelProperty("编码") + private String menuCode; + @ApiModelProperty("菜单名称") + private @NotBlank( + message = "菜单名称不能为空" +) String name; + @ApiModelProperty("菜单父id") + private @NotNull( + message = "菜单父ID不能为空" +) Long parentId; + @ApiModelProperty("删除标记") + private Integer delFlag; + @ApiModelProperty("是否默认选中") + private Integer ifDefault; + @ApiModelProperty("排序号") + private Integer sort; + @ApiModelProperty("0:菜单;1:按钮;2:目录") + private Integer type; + @ApiModelProperty("页面是否缓存(1缓存 2不缓存)") + private Integer ifCache; + @ApiModelProperty("菜单状态(1显示 2隐藏)") + private Integer ifVisible; + @ApiModelProperty("组件路径") + private String component; + @ApiModelProperty("菜单图标") + private String icon; + @ApiModelProperty("菜单归属类型:1:web,2:app") + private Integer webType; + + public String getMenuId() { + return this.menuId; + } + + public String getMenuCode() { + return this.menuCode; + } + + public String getName() { + return this.name; + } + + public Long getParentId() { + return this.parentId; + } + + public Integer getDelFlag() { + return this.delFlag; + } + + public Integer getIfDefault() { + return this.ifDefault; + } + + public Integer getSort() { + return this.sort; + } + + public Integer getType() { + return this.type; + } + + public Integer getIfCache() { + return this.ifCache; + } + + public Integer getIfVisible() { + return this.ifVisible; + } + + public String getComponent() { + return this.component; + } + + public String getIcon() { + return this.icon; + } + + public Integer getWebType() { + return this.webType; + } + + public void setMenuId(final String menuId) { + this.menuId = menuId; + } + + public void setMenuCode(final String menuCode) { + this.menuCode = menuCode; + } + + public void setName(final String name) { + this.name = name; + } + + public void setParentId(final Long parentId) { + this.parentId = parentId; + } + + public void setDelFlag(final Integer delFlag) { + this.delFlag = delFlag; + } + + public void setIfDefault(final Integer ifDefault) { + this.ifDefault = ifDefault; + } + + public void setSort(final Integer sort) { + this.sort = sort; + } + + public void setType(final Integer type) { + this.type = type; + } + + public void setIfCache(final Integer ifCache) { + this.ifCache = ifCache; + } + + public void setIfVisible(final Integer ifVisible) { + this.ifVisible = ifVisible; + } + + public void setComponent(final String component) { + this.component = component; + } + + public void setIcon(final String icon) { + this.icon = icon; + } + + public void setWebType(final Integer webType) { + this.webType = webType; + } + + public String toString() { + String var10000 = this.getMenuId(); + return "MgrMenuVO(menuId=" + var10000 + ", menuCode=" + this.getMenuCode() + ", name=" + this.getName() + ", parentId=" + this.getParentId() + ", delFlag=" + this.getDelFlag() + ", ifDefault=" + this.getIfDefault() + ", sort=" + this.getSort() + ", type=" + this.getType() + ", ifCache=" + this.getIfCache() + ", ifVisible=" + this.getIfVisible() + ", component=" + this.getComponent() + ", icon=" + this.getIcon() + ", webType=" + this.getWebType() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/controller/AuthController.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/controller/AuthController.java index c2d0cadc..c0534662 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/controller/AuthController.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/controller/AuthController.java @@ -8,15 +8,21 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.bonus.canteen.core.config.SecureProperties; +import com.bonus.canteen.core.auth.oauth.util.OAuthUtil; +import com.bonus.canteen.core.auth.user.dto.MgrUserLoginDTO; +import com.bonus.canteen.core.auth.user.service.MgrUserService; import com.bonus.canteen.core.config.SmUtils; +import com.bonus.canteen.core.customer.model.PigxUser; import com.bonus.canteen.core.device.mq.MacMessageService; import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.houqin.framework.secure.SecureProperties; import com.google.common.base.Joiner; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import com.bonus.canteen.core.auth.oauth.vo.DeviceLoginResponseVo; import com.bonus.canteen.core.common.utils.HeaderFetchUtil; +import com.bonus.common.houqin.framework.secure.AccessToken; +import com.bonus.common.houqin.framework.secure.WebContext; import com.bonus.canteen.core.device.manage.controller.deprecated.vo.MessageConfigVO; import com.bonus.canteen.core.device.manage.model.DeviceInfoInSystem; import com.bonus.canteen.core.device.manage.service.DeviceInfoService; @@ -44,8 +50,8 @@ public class AuthController { private static final String HEADER_SECURITY_TENANT_ID = "X-Security-Tenant-Id"; private static final String HEADER_SECURITY_TOKEN = "X-Security-Token"; private static final String HEADER_SECURITY_SN = "X-Security-Sn"; -// @Autowired -// private MgrUserService mgrUserService; + @Autowired + private MgrUserService mgrUserService; @Autowired @Lazy private MercMerchantApi mercMerchantApi; @@ -90,29 +96,29 @@ public class AuthController { // // return LeResponse.succ(object); // } -// -// @PostMapping({"/token"}) -// @RequiresGuest -// @ApiOperation("设备登陆接口登陆") -// public LeResponse login(@RequestParam String content) { -// MgrUserLoginDTO loginDTO = (MgrUserLoginDTO)JSON.parseObject(content, MgrUserLoginDTO.class); -// -// JSONObject object; -// try { -// PigxUser user = this.mgrUserService.login(loginDTO); -// object = JSON.parseObject(JSON.toJSONString(user)); -// object.put("user_id", user.getId()); -// object.put("merchant_id", user.getMerchantId()); -// if (WebContext.get().getAccessToken().isPresent()) { -// object.put("securityTokenSign", OAuthUtil.responseSetSecurityTokenSign(user.getMerchantId(), ((AccessToken)WebContext.get().getAccessToken().get()).getId())); -// } -// } catch (LeCheckedException var5) { -// return LeResponse.fail(var5.getMessage()); -// } -// -// return LeResponse.succ(object); -// } -// + + @PostMapping({"/token"}) + @ApiOperation("设备登陆接口登陆") + public AjaxResult login(@RequestParam String content) { + MgrUserLoginDTO loginDTO = (MgrUserLoginDTO)JSON.parseObject(content, MgrUserLoginDTO.class); + + JSONObject object; + try { + PigxUser user = this.mgrUserService.login(loginDTO); + object = JSON.parseObject(JSON.toJSONString(user)); + object.put("user_id", user.getId()); + object.put("merchant_id", user.getMerchantId()); + if (WebContext.get().getAccessToken().isPresent()) { + object.put("securityTokenSign", OAuthUtil.responseSetSecurityTokenSign(user.getMerchantId(), + ((AccessToken)WebContext.get().getAccessToken().get()).getId())); + } + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + + return AjaxResult.success(object); + } + // @DeleteMapping({"/logOut"}) // @RequiresAuthentication // @ApiOperation("退出登陆") diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/util/OAuthUtil.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/util/OAuthUtil.java new file mode 100644 index 00000000..f433e73a --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/oauth/util/OAuthUtil.java @@ -0,0 +1,40 @@ +package com.bonus.canteen.core.auth.oauth.util; + +import cn.hutool.core.util.ObjectUtil; +import javax.servlet.http.HttpServletRequest; +import com.bonus.canteen.core.common.utils.SpringContextHolder; +import com.bonus.common.houqin.framework.secure.SecureProperties; +import com.bonus.canteen.core.config.SmUtils; +import org.springframework.context.annotation.Lazy; +import com.bonus.common.houqin.framework.secure.WebContext; +import java.util.TreeMap; + +public class OAuthUtil { + private static final String HEADER_SECURITY_TENANT_ID = "X-Security-Tenant-Id"; + private static final String HEADER_SECURITY_TOKEN = "X-Security-Token"; + @Lazy + private static final SecureProperties secureProperties = (SecureProperties) SpringContextHolder.getBean(SecureProperties.class); + + private OAuthUtil() { + } + + public static String responseSetSecurityTokenSign(Long merchantId, String token) { + TreeMap needSignMap = new TreeMap(); + String securityTokenSign = null; + if (WebContext.get().getRequest().isPresent()) { + String encryptKey = ((HttpServletRequest)WebContext.get().getRequest().get()).getHeader(secureProperties.getSecurity().getServerEncryptedClientKeyHeaderName()); + if (ObjectUtil.isNotNull(encryptKey)) { + if (ObjectUtil.isNotNull(merchantId)) { + needSignMap.put("X-Security-Tenant-Id", String.valueOf(merchantId)); + } + + needSignMap.put("X-Security-Token", token); + String serverEncryptedClientKey = ((HttpServletRequest)WebContext.get().getRequest().get()).getHeader(secureProperties.getSecurity().getServerEncryptedClientKeyHeaderName()); + String clientKey = SmUtils.decryptBySm4WithServerKey(serverEncryptedClientKey); + securityTokenSign = SmUtils.signAuthTokenBySm3(needSignMap, clientKey); + } + } + + return securityTokenSign; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/po/AuthOpsExpireMsgPO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/po/AuthOpsExpireMsgPO.java new file mode 100644 index 00000000..228b4e93 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/po/AuthOpsExpireMsgPO.java @@ -0,0 +1,31 @@ +package com.bonus.canteen.core.auth.po; + +import io.swagger.annotations.ApiModelProperty; + +public class AuthOpsExpireMsgPO { + @ApiModelProperty("tokenId") + private String accessTokenId; + @ApiModelProperty("用户id") + private Long userId; + + public String getAccessTokenId() { + return this.accessTokenId; + } + + public Long getUserId() { + return this.userId; + } + + public void setAccessTokenId(final String accessTokenId) { + this.accessTokenId = accessTokenId; + } + + public void setUserId(final Long userId) { + this.userId = userId; + } + + public String toString() { + String var10000 = this.getAccessTokenId(); + return "AuthOpsExpireMsgPO(accessTokenId=" + var10000 + ", userId=" + this.getUserId() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/entity/MgrRoleMenu.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/entity/MgrRoleMenu.java new file mode 100644 index 00000000..7d675f29 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/entity/MgrRoleMenu.java @@ -0,0 +1,48 @@ +package com.bonus.canteen.core.auth.role.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@TableName("mgr_role_menu") +@ApiModel("角色菜单表") +public class MgrRoleMenu extends Model { + private static final long serialVersionUID = 1L; + @ApiModelProperty("角色ID") + private Long roleId; + @ApiModelProperty("菜单ID") + private Long menuId; + @ApiModelProperty("节点状态:1全选;2半选") + private Integer halfSelect; + + public Long getRoleId() { + return this.roleId; + } + + public Long getMenuId() { + return this.menuId; + } + + public Integer getHalfSelect() { + return this.halfSelect; + } + + public void setRoleId(final Long roleId) { + this.roleId = roleId; + } + + public void setMenuId(final Long menuId) { + this.menuId = menuId; + } + + public void setHalfSelect(final Integer halfSelect) { + this.halfSelect = halfSelect; + } + + public String toString() { + Long var10000 = this.getRoleId(); + return "MgrRoleMenu(roleId=" + var10000 + ", menuId=" + this.getMenuId() + ", halfSelect=" + this.getHalfSelect() + ")"; + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/mapper/MgrRoleMenuMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/mapper/MgrRoleMenuMapper.java new file mode 100644 index 00000000..77df18c8 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/role/mapper/MgrRoleMenuMapper.java @@ -0,0 +1,27 @@ +package com.bonus.canteen.core.auth.role.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bonus.canteen.core.auth.menu.vo.MgrMenuTreeVO; +import com.bonus.canteen.core.auth.menu.vo.MgrMenuVO; +import com.bonus.canteen.core.auth.role.entity.MgrRoleMenu; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface MgrRoleMenuMapper extends BaseMapper { + int insertBatch(@Param("roleId") Long roleId, @Param("menus") List menus); + + List listPermissions(@Param("userId") Long userId); + + List listPermissionsByRoleCode(@Param("userId") Long userId, @Param("roleCode") String roleCode); + + List getTenantMenu(@Param("excludeMiddle") Integer excludeMiddle, @Param("userId") Long userId, @Param("isAdmin") boolean isAdmin); + + List listMenuListByRoleCode(@Param("userId") Long userId, @Param("roleCode") String roleCode, @Param("webType") Integer webType, @Param("typeList") List typeList); + + void clearUnUsedPermissions(); + + void insertBatchNew(@Param("insertList") List insertList); +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/business/MgrUserBurialPointBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/business/MgrUserBurialPointBusiness.java new file mode 100644 index 00000000..2856c63a --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/business/MgrUserBurialPointBusiness.java @@ -0,0 +1,28 @@ +package com.bonus.canteen.core.auth.user.business; + +import cn.hutool.core.collection.CollUtil; +import com.bonus.canteen.core.auth.user.dto.MgrUserLoginDTO; +import com.bonus.canteen.core.common.custom.business.CustomBusiness; +import com.bonus.canteen.core.customer.model.PigxUser; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MgrUserBurialPointBusiness implements CustomBusiness { + public String name() { + return "操作员"; + } + + public List versions() { + return CollUtil.newArrayList(new CustomBusiness.Version[]{CustomBusiness.Version.of("5.6.8", "初版")}); + } + + public String didBeforeLogin(MgrUserLoginDTO loginDTO) { + return null; + } + + public PigxUser didBeforeAppAccountLogin(MgrUserLoginDTO loginDTO) { + return null; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserInfo.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserInfo.java new file mode 100644 index 00000000..1573318a --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserInfo.java @@ -0,0 +1,96 @@ +package com.bonus.canteen.core.auth.user.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import com.bonus.canteen.core.auth.user.entity.MgrUser; + +import java.io.Serializable; +import java.util.Set; + +@ApiModel("用户信息") +public class MgrUserInfo implements Serializable { + @ApiModelProperty("用户基本信息") + private MgrUser mgrUser; + private Long tenantId; + @ApiModelProperty("食堂类范围id") + private Long canteenEffId; + @ApiModelProperty("人员类范围id") + private Long custEffId; + @ApiModelProperty("菜品类范围id") + private Long dishesEffId; + @ApiModelProperty("角色标识") + private String roleCode; + @ApiModelProperty("权限标识集合") + private Set permissions; + @ApiModelProperty("角色标识集合") + private Set roles; + + public MgrUser getMgrUser() { + return this.mgrUser; + } + + public Long getTenantId() { + return this.tenantId; + } + + public Long getCanteenEffId() { + return this.canteenEffId; + } + + public Long getCustEffId() { + return this.custEffId; + } + + public Long getDishesEffId() { + return this.dishesEffId; + } + + public String getRoleCode() { + return this.roleCode; + } + + public Set getPermissions() { + return this.permissions; + } + + public Set getRoles() { + return this.roles; + } + + public void setMgrUser(final MgrUser mgrUser) { + this.mgrUser = mgrUser; + } + + public void setTenantId(final Long tenantId) { + this.tenantId = tenantId; + } + + public void setCanteenEffId(final Long canteenEffId) { + this.canteenEffId = canteenEffId; + } + + public void setCustEffId(final Long custEffId) { + this.custEffId = custEffId; + } + + public void setDishesEffId(final Long dishesEffId) { + this.dishesEffId = dishesEffId; + } + + public void setRoleCode(final String roleCode) { + this.roleCode = roleCode; + } + + public void setPermissions(final Set permissions) { + this.permissions = permissions; + } + + public void setRoles(final Set roles) { + this.roles = roles; + } + + public String toString() { + String var10000 = String.valueOf(this.getMgrUser()); + return "MgrUserInfo(mgrUser=" + var10000 + ", tenantId=" + this.getTenantId() + ", canteenEffId=" + this.getCanteenEffId() + ", custEffId=" + this.getCustEffId() + ", dishesEffId=" + this.getDishesEffId() + ", roleCode=" + this.getRoleCode() + ", permissions=" + String.valueOf(this.getPermissions()) + ", roles=" + String.valueOf(this.getRoles()) + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserLoginDTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserLoginDTO.java new file mode 100644 index 00000000..342029f3 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/dto/MgrUserLoginDTO.java @@ -0,0 +1,88 @@ +package com.bonus.canteen.core.auth.user.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.NotBlank; + +import java.io.Serializable; + +@ApiModel("登录入参") +public class MgrUserLoginDTO implements Serializable { + @ApiModelProperty("用户名") + private @NotBlank( + message = "用户名不能为空" +) String username; + @ApiModelProperty("密码") + private @NotBlank( + message = "密码不能为空" +) String password; + private String scope; + private String grant_type; + private String role; + private String openid; + + public String getUsername() { + return this.username; + } + + public String getPassword() { + return this.password; + } + + public String getScope() { + return this.scope; + } + + public String getGrant_type() { + return this.grant_type; + } + + public String getRole() { + return this.role; + } + + public String getOpenid() { + return this.openid; + } + + public void setUsername(final String username) { + this.username = username; + } + + public void setPassword(final String password) { + this.password = password; + } + + public void setScope(final String scope) { + this.scope = scope; + } + + public void setGrant_type(final String grant_type) { + this.grant_type = grant_type; + } + + public void setRole(final String role) { + this.role = role; + } + + public void setOpenid(final String openid) { + this.openid = openid; + } + + public String toString() { + String var10000 = this.getUsername(); + return "MgrUserLoginDTO(username=" + var10000 + ", password=" + this.getPassword() + ", scope=" + this.getScope() + ", grant_type=" + this.getGrant_type() + ", role=" + this.getRole() + ", openid=" + this.getOpenid() + ")"; + } + + public MgrUserLoginDTO(final String username, final String password, final String scope, final String grant_type, final String role, final String openid) { + this.username = username; + this.password = password; + this.scope = scope; + this.grant_type = grant_type; + this.role = role; + this.openid = openid; + } + + public MgrUserLoginDTO() { + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserInSystem.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserInSystem.java new file mode 100644 index 00000000..69f15dfc --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserInSystem.java @@ -0,0 +1,272 @@ +package com.bonus.canteen.core.auth.user.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import com.bonus.canteen.core.common.encrypt.SM4EncDecHandler; + +import java.time.LocalDateTime; + +@TableName( + value = "mgr_user", + autoResultMap = true +) +public class MgrUserInSystem extends Model { + private static final long serialVersionUID = 1L; + @ApiModelProperty("用户编号") + @TableId + private Long userId; + @ApiModelProperty("用户名") + private String username; + @ApiModelProperty("密码") + private String password; + @ApiModelProperty("真实姓名") + @TableField( + value = "real_name", + typeHandler = SM4EncDecHandler.class + ) + private String realName; + @ApiModelProperty("随机盐") + private String salt; + @ApiModelProperty("电话号码") + @TableField( + value = "phone", + typeHandler = SM4EncDecHandler.class + ) + private String phone; + @ApiModelProperty("操作员头像") + private String avatar; + @ApiModelProperty("部门id") + private Long deptId; + @ApiModelProperty("用户类型(0-本地用户, 1-AD账户)") + private Integer userType; + @ApiModelProperty("激活标识") + private String lockFlag; + @ApiModelProperty("标识") + private Integer delFlag; + @ApiModelProperty("微信登录openId") + private String wxOpenid; + @ApiModelProperty("小程序openId") + private String miniOpenid; + @ApiModelProperty("QQ openId") + private String qqOpenid; + @ApiModelProperty("码云标识") + private String giteeLogin; + @ApiModelProperty("开源中国标识") + private String oscId; + @ApiModelProperty("商户id") + private Long tenantId; + @ApiModelProperty("授权截止时间") + private LocalDateTime endTime; + @ApiModelProperty("乐观锁") + private Integer revision; + @ApiModelProperty("创建人") + private String crby; + @ApiModelProperty("创建时间") + private LocalDateTime crtime; + @ApiModelProperty("更新人") + private String upby; + @ApiModelProperty("更新时间") + private LocalDateTime uptime; + @ApiModelProperty("是否修改过密码") + private Integer editFlag; + + public Long getUserId() { + return this.userId; + } + + public String getUsername() { + return this.username; + } + + public String getPassword() { + return this.password; + } + + public String getRealName() { + return this.realName; + } + + public String getSalt() { + return this.salt; + } + + public String getPhone() { + return this.phone; + } + + public String getAvatar() { + return this.avatar; + } + + public Long getDeptId() { + return this.deptId; + } + + public Integer getUserType() { + return this.userType; + } + + public String getLockFlag() { + return this.lockFlag; + } + + public Integer getDelFlag() { + return this.delFlag; + } + + public String getWxOpenid() { + return this.wxOpenid; + } + + public String getMiniOpenid() { + return this.miniOpenid; + } + + public String getQqOpenid() { + return this.qqOpenid; + } + + public String getGiteeLogin() { + return this.giteeLogin; + } + + public String getOscId() { + return this.oscId; + } + + public Long getTenantId() { + return this.tenantId; + } + + public LocalDateTime getEndTime() { + return this.endTime; + } + + public Integer getRevision() { + return this.revision; + } + + public String getCrby() { + return this.crby; + } + + public LocalDateTime getCrtime() { + return this.crtime; + } + + public String getUpby() { + return this.upby; + } + + public LocalDateTime getUptime() { + return this.uptime; + } + + public Integer getEditFlag() { + return this.editFlag; + } + + public void setUserId(final Long userId) { + this.userId = userId; + } + + public void setUsername(final String username) { + this.username = username; + } + + public void setPassword(final String password) { + this.password = password; + } + + public void setRealName(final String realName) { + this.realName = realName; + } + + public void setSalt(final String salt) { + this.salt = salt; + } + + public void setPhone(final String phone) { + this.phone = phone; + } + + public void setAvatar(final String avatar) { + this.avatar = avatar; + } + + public void setDeptId(final Long deptId) { + this.deptId = deptId; + } + + public void setUserType(final Integer userType) { + this.userType = userType; + } + + public void setLockFlag(final String lockFlag) { + this.lockFlag = lockFlag; + } + + public void setDelFlag(final Integer delFlag) { + this.delFlag = delFlag; + } + + public void setWxOpenid(final String wxOpenid) { + this.wxOpenid = wxOpenid; + } + + public void setMiniOpenid(final String miniOpenid) { + this.miniOpenid = miniOpenid; + } + + public void setQqOpenid(final String qqOpenid) { + this.qqOpenid = qqOpenid; + } + + public void setGiteeLogin(final String giteeLogin) { + this.giteeLogin = giteeLogin; + } + + public void setOscId(final String oscId) { + this.oscId = oscId; + } + + public void setTenantId(final Long tenantId) { + this.tenantId = tenantId; + } + + public void setEndTime(final LocalDateTime endTime) { + this.endTime = endTime; + } + + public void setRevision(final Integer revision) { + this.revision = revision; + } + + public void setCrby(final String crby) { + this.crby = crby; + } + + public void setCrtime(final LocalDateTime crtime) { + this.crtime = crtime; + } + + public void setUpby(final String upby) { + this.upby = upby; + } + + public void setUptime(final LocalDateTime uptime) { + this.uptime = uptime; + } + + public void setEditFlag(final Integer editFlag) { + this.editFlag = editFlag; + } + + public String toString() { + Long var10000 = this.getUserId(); + return "MgrUserInSystem(userId=" + var10000 + ", username=" + this.getUsername() + ", password=" + this.getPassword() + ", realName=" + this.getRealName() + ", salt=" + this.getSalt() + ", phone=" + this.getPhone() + ", avatar=" + this.getAvatar() + ", deptId=" + this.getDeptId() + ", userType=" + this.getUserType() + ", lockFlag=" + this.getLockFlag() + ", delFlag=" + this.getDelFlag() + ", wxOpenid=" + this.getWxOpenid() + ", miniOpenid=" + this.getMiniOpenid() + ", qqOpenid=" + this.getQqOpenid() + ", giteeLogin=" + this.getGiteeLogin() + ", oscId=" + this.getOscId() + ", tenantId=" + this.getTenantId() + ", endTime=" + String.valueOf(this.getEndTime()) + ", revision=" + this.getRevision() + ", crby=" + this.getCrby() + ", crtime=" + String.valueOf(this.getCrtime()) + ", upby=" + this.getUpby() + ", uptime=" + String.valueOf(this.getUptime()) + ", editFlag=" + this.getEditFlag() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserRole.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserRole.java new file mode 100644 index 00000000..2fe5acdf --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/entity/MgrUserRole.java @@ -0,0 +1,47 @@ +package com.bonus.canteen.core.auth.user.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@TableName("mgr_user_role") +@ApiModel("用户角色关联") +public class MgrUserRole extends Model { + private static final long serialVersionUID = 1L; + @ApiModelProperty("用户id") + private Long userId; + @ApiModelProperty("角色id") + private Long roleId; + @ApiModelProperty("是否默认,1:是,2:否") + private Integer ifDefault; + + public Long getUserId() { + return this.userId; + } + + public Long getRoleId() { + return this.roleId; + } + + public Integer getIfDefault() { + return this.ifDefault; + } + + public void setUserId(final Long userId) { + this.userId = userId; + } + + public void setRoleId(final Long roleId) { + this.roleId = roleId; + } + + public void setIfDefault(final Integer ifDefault) { + this.ifDefault = ifDefault; + } + + public String toString() { + Long var10000 = this.getUserId(); + return "MgrUserRole(userId=" + var10000 + ", roleId=" + this.getRoleId() + ", ifDefault=" + this.getIfDefault() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserInSystemMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserInSystemMapper.java new file mode 100644 index 00000000..35359284 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserInSystemMapper.java @@ -0,0 +1,23 @@ +package com.bonus.canteen.core.auth.user.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bonus.canteen.core.auth.user.entity.MgrUserInSystem; +import com.bonus.canteen.core.merchant.vo.MercMerchantEndTimeVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface MgrUserInSystemMapper extends BaseMapper { + MercMerchantEndTimeVO selectMerchantByMerchantId(Long merchantId); + + @Select({"select username, password from mgr_user ${ew.customSqlSegment}"}) + MgrUserInSystem selectPasswordByUserId(@Param("ew") Wrapper wrapper); + + @Select({"select tenant_id from merc_merchant where third_merchant_id = #{thirdMerchantId}"}) + Long selectMerchantIdByThird(String thirdMerchantId); + + @Select({"select user_type from mgr_user where username = #{username} and del_flag = #{delFlag}"}) + Integer selectUserTypeByUsername(@Param("username") String username, @Param("delFlag") Integer delFlag); +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserMapper.java index 2618e3e9..c6edc7bb 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserMapper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bonus.canteen.core.auth.role.dto.MgrRoleUserDTO; import com.bonus.canteen.core.auth.role.vo.MgrRoleUserVO; import com.bonus.canteen.core.auth.user.entity.MgrUser; +import feign.Param; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -42,9 +43,9 @@ public interface MgrUserMapper extends BaseMapper { // Long selectUserIdByCustId(@Param("custId") Long custId); // // String selectUserNameIdByCustId(@Param("custId") Long custId); -// -// Long selectCustIdByUserId(@Param("userId") Long userId); -// + + Long selectCustIdByUserId(@Param("userId") Long userId); + // List getUserExcludeSupplier(@Param("delFlag") Integer delFlag); // // MgrUser getUserByRoleCode(@Param("roleCode") String roleCode); diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserRoleMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserRoleMapper.java new file mode 100644 index 00000000..e1cfcc07 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/mapper/MgrUserRoleMapper.java @@ -0,0 +1,22 @@ +package com.bonus.canteen.core.auth.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bonus.canteen.core.auth.user.entity.MgrUserRole; +import com.bonus.canteen.core.auth.user.vo.MgrUserRoleInfoVO; +import com.bonus.canteen.core.auth.user.vo.MgrUserRolePageVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +@Mapper +public interface MgrUserRoleMapper extends BaseMapper { + Set listRoles(@Param("userId") Long userId); + + List getUserRoleVOByUserIdList(@Param("userIdList") List userIdList); + + List getMgrUserRoleListByUserId(@Param("userId") Long userId); + + void updateDefaultByRoleCode(@Param("roleCode") String roleCode, @Param("userId") Long userId, @Param("ifDefault") Integer ifDefault); +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/service/MgrUserService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/service/MgrUserService.java index c04ca20d..52dfbc98 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/service/MgrUserService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/service/MgrUserService.java @@ -1,50 +1,97 @@ package com.bonus.canteen.core.auth.user.service; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.parser.Feature; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bonus.canteen.core.auth.config.LoginProperties; +import com.bonus.canteen.core.auth.enums.RoleCodeV2Enum; +import com.bonus.canteen.core.auth.menu.vo.MgrMenuVO; +import com.bonus.canteen.core.auth.po.AuthOpsExpireMsgPO; +import com.bonus.canteen.core.auth.role.MgrRoleTypeV2Enum; import com.bonus.canteen.core.auth.role.dto.MgrRoleUserDTO; import com.bonus.canteen.core.auth.role.dto.MgrRoleUserListDTO; +import com.bonus.canteen.core.auth.role.mapper.MgrRoleMenuMapper; import com.bonus.canteen.core.auth.role.vo.MgrRoleUserVO; +import com.bonus.canteen.core.auth.user.business.MgrUserBurialPointBusiness; +import com.bonus.canteen.core.auth.user.dto.MgrUserInfo; +import com.bonus.canteen.core.auth.user.dto.MgrUserLoginDTO; import com.bonus.canteen.core.auth.user.entity.MgrUser; +import com.bonus.canteen.core.auth.user.entity.MgrUserInSystem; +import com.bonus.canteen.core.auth.user.mapper.MgrUserInSystemMapper; import com.bonus.canteen.core.auth.user.mapper.MgrUserMapper; +import com.bonus.canteen.core.auth.user.mapper.MgrUserRoleMapper; +import com.bonus.canteen.core.auth.user.vo.MgrUserRoleInfoVO; +import com.bonus.canteen.core.common.constant.LeMqConstant; +import com.bonus.canteen.core.common.enums.LogRecordOperTypeEnum; +import com.bonus.canteen.core.common.utils.TenantContextHolder; +import com.bonus.canteen.core.notice.hawkeye.service.AllocLogRecordService; +import com.bonus.common.houqin.framework.secure.AccessToken; +import com.bonus.canteen.core.customer.model.PigxUser; import com.bonus.canteen.core.customer.utils.DelFlagEnum; +import com.bonus.canteen.core.data.dataset.Executors; +import com.bonus.canteen.core.merchant.constant.MerchantStatusEnum; +import com.bonus.canteen.core.merchant.vo.MercMerchantEndTimeVO; +import com.bonus.canteen.core.notice.hawkeye.model.AllocLogRecord; +import com.bonus.canteen.core.order.mq.MqUtil; +import com.bonus.common.core.exception.ServiceException; +import com.bonus.common.houqin.constant.LeConstants; +import com.bonus.common.houqin.framework.secure.SecureManager; +import com.bonus.common.houqin.i18n.I18n; +import com.bonus.common.houqin.utils.AesEncryptUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; - -import java.util.List; +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Service public class MgrUserService extends ServiceImpl { private static final Logger log = LoggerFactory.getLogger(MgrUserService.class); private static final String USER_LOCK = "user-lock-"; private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); -// @Autowired -// private MgrUserInSystemMapper mgrUserInSystemMapper; + @Autowired + private MgrUserInSystemMapper mgrUserInSystemMapper; // @Autowired // private MgrRoleService mgrRoleService; // @Autowired // @Lazy // private CustInfoApi custInfoApi; -// @Autowired -// @Lazy -// private AllocLogRecordService allocLogRecordService; -// @Autowired -// private MgrUserRoleMapper mgrUserRoleMapper; -// @Autowired -// private MgrUserMapper mgrUserMapper; + @Autowired + @Lazy + private AllocLogRecordService allocLogRecordService; + @Autowired + private MgrUserRoleMapper mgrUserRoleMapper; + @Autowired + private MgrUserMapper mgrUserMapper; // @Autowired // private MgrRoleMapper mgrRoleMapper; -// @Autowired -// private StringRedisTemplate stringRedisTemplate; -// @Autowired -// private MgrRoleMenuMapper mgrRoleMenuMapper; + @Autowired + private StringRedisTemplate stringRedisTemplate; + @Autowired + private MgrRoleMenuMapper mgrRoleMenuMapper; // @Autowired // private MgrRoleAppMenuService mgrRoleAppMenuService; -// @Autowired -// private AesEncryptUtil aesEncryptUtil; -// @Autowired -// private LoginProperties loginProperties; + @Autowired + private AesEncryptUtil aesEncryptUtil; + @Autowired + private LoginProperties loginProperties; // @Autowired // private CustomBizApi customBizApi; // @Autowired @@ -65,9 +112,9 @@ public class MgrUserService extends ServiceImpl { // @Autowired // @Lazy // private BackStaffApi backStaffApi; -// @Autowired -// @Lazy -// private MgrUserBurialPointBusiness mgrUserBurialPointBusiness; + @Autowired + @Lazy + private MgrUserBurialPointBusiness mgrUserBurialPointBusiness; // @Transactional( // rollbackFor = {Exception.class} @@ -275,80 +322,80 @@ public class MgrUserService extends ServiceImpl { // int countDrpWarehouse = this.mgrUserMapper.checkDrpWarehouse(userId); // return countBasicsDining > 0 || countBasicsShopstalls > 0 || countDrpWarehouse > 0; // } -// -// public MgrUserInfo getUserInfoByUsername(String realUsername) throws LeCheckedException { -// MgrUserInSystem mgrUser = (MgrUserInSystem)Executors.readInSystem(() -> { -// return (MgrUserInSystem)this.mgrUserInSystemMapper.selectOne((Wrapper)((LambdaQueryWrapper)Wrappers.lambdaQuery(MgrUserInSystem.class).eq(MgrUserInSystem::getUsername, realUsername)).eq(MgrUserInSystem::getDelFlag, DelFlagEnum.DEL_FALSE.key())); -// }); -// if (mgrUser == null) { -// log.info("***根据用户名 : {} 未查询到用户的数据, 返回用户名密码错误****************", realUsername); -// throw new LeCheckedException(I18n.getMessage("auth_error_password", new Object[0])); -// } else if (ObjectUtil.isNotNull(mgrUser.getEndTime()) && LocalDateTime.now().isAfter(mgrUser.getEndTime())) { -// throw new LeCheckedException("授权已过期,请重新授权"); -// } else if (mgrUser.getUserId() == 0L) { -// return this.createMgrUserInfo((MgrUser)BeanUtil.copyProperties(mgrUser, MgrUser.class, new String[0]), (Long)null, (Long)null, (Long)null, (Long)null, CollUtil.newHashSet(new String[]{RoleCodeV2Enum.ROLE_ADMIN.key()}), CollUtil.newHashSet(new String[]{"1"})); -// } else { -// MercMerchantEndTimeVO mercMerchantVO = (MercMerchantEndTimeVO)Executors.readInSystem(() -> { -// return this.mgrUserInSystemMapper.selectMerchantByMerchantId(mgrUser.getTenantId()); -// }); -// if (mercMerchantVO != null && !LocalDateTime.now().isAfter(mercMerchantVO.getEndTime())) { -// if (!MerchantStatusEnum.NORMAL.key().equals(mercMerchantVO.getStatus())) { -// throw new LeCheckedException(I18n.getMessage("auth_disable_account", new Object[0])); -// } else { -// TenantContextHolder.setTenantId(mgrUser.getTenantId()); -// if (this.checkCustState(mgrUser.getUserId())) { -// log.info("用户已注销,不可以登录~~~~~~~~"); -// throw new LeCheckedException(I18n.getMessage("auth_cust_cancel", new Object[0])); -// } else { -// List userRoleInfoVOList = this.mgrUserRoleMapper.getMgrUserRoleListByUserId(mgrUser.getUserId()); -// if (ObjectUtil.isEmpty(userRoleInfoVOList)) { -// log.info("用户未配置角色,不可以登录~~~~~~~~"); -// throw new LeCheckedException(I18n.getMessage("auth_no_role", new Object[0])); -// } else { -// Set permissions = (Set)this.mgrRoleMenuMapper.listPermissions(mgrUser.getUserId()).stream().map(MgrMenuVO::getMenuCode).collect(Collectors.toSet()); -// Set roles = (Set)userRoleInfoVOList.stream().map(MgrUserRoleInfoVO::getRoleCode).collect(Collectors.toSet()); -// MgrUserInfo userInfo = this.createMgrUserInfo((MgrUser)BeanUtil.copyProperties(mgrUser, MgrUser.class, new String[0]), -1L, -1L, -1L, mgrUser.getTenantId(), permissions, roles); -// Iterator var8 = userRoleInfoVOList.iterator(); -// -// while(true) { -// MgrUserRoleInfoVO userRoleVO; -// do { -// if (!var8.hasNext()) { -// log.info("商家操作员登录用户详细信息userInfo : {}", userInfo); -// return userInfo; -// } -// -// userRoleVO = (MgrUserRoleInfoVO)var8.next(); -// } while(!MgrRoleTypeV2Enum.ROLE_ADMIN.getKey().equals(userRoleVO.getRoleType()) && !LeConstants.COMMON_YES.equals(userRoleVO.getIfDefault())); -// -// userInfo.setRoleCode(userRoleVO.getRoleCode()); -// } -// } -// } -// } -// } else { -// throw new LeCheckedException(I18n.getMessage("auth_overtime_account", new Object[0])); -// } -// } -// } -// -// private boolean checkCustState(Long userId) { -// Long custId = this.mgrUserMapper.selectCustIdByUserId(userId); -// return ObjectUtil.isNull(custId); -// } -// -// private MgrUserInfo createMgrUserInfo(MgrUser mgrUser, Long canteenEffId, Long custEffId, Long dishesEffId, Long tenantId, Set permissions, Set roles) { -// MgrUserInfo userInfo = new MgrUserInfo(); -// userInfo.setMgrUser(mgrUser); -// userInfo.setCanteenEffId(canteenEffId); -// userInfo.setCustEffId(custEffId); -// userInfo.setDishesEffId(dishesEffId); -// userInfo.setTenantId(tenantId); -// userInfo.setPermissions(permissions); -// userInfo.setRoles(roles); -// return userInfo; -// } -// + + public MgrUserInfo getUserInfoByUsername(String realUsername) throws Exception { + MgrUserInSystem mgrUser = (MgrUserInSystem)Executors.readInSystem(() -> { + return null; // (MgrUserInSystem)this.mgrUserInSystemMapper.selectOne((Wrapper)((LambdaQueryWrapper)Wrappers.lambdaQuery(MgrUserInSystem.class).eq(MgrUserInSystem::getUsername, realUsername)).eq(MgrUserInSystem::getDelFlag, DelFlagEnum.DEL_FALSE.key())); + }); + if (mgrUser == null) { + log.info("***根据用户名 : {} 未查询到用户的数据, 返回用户名密码错误****************", realUsername); + throw new ServiceException(I18n.getMessage("auth_error_password", new Object[0])); + } else if (ObjectUtil.isNotNull(mgrUser.getEndTime()) && LocalDateTime.now().isAfter(mgrUser.getEndTime())) { + throw new ServiceException("授权已过期,请重新授权"); + } else if (mgrUser.getUserId() == 0L) { + return this.createMgrUserInfo((MgrUser) BeanUtil.copyProperties(mgrUser, MgrUser.class, new String[0]), (Long)null, (Long)null, (Long)null, (Long)null, CollUtil.newHashSet(new String[]{RoleCodeV2Enum.ROLE_ADMIN.key()}), CollUtil.newHashSet(new String[]{"1"})); + } else { + MercMerchantEndTimeVO mercMerchantVO = (MercMerchantEndTimeVO)Executors.readInSystem(() -> { + return this.mgrUserInSystemMapper.selectMerchantByMerchantId(mgrUser.getTenantId()); + }); + if (mercMerchantVO != null && !LocalDateTime.now().isAfter(mercMerchantVO.getEndTime())) { + if (!MerchantStatusEnum.NORMAL.key().equals(mercMerchantVO.getStatus())) { + throw new ServiceException(I18n.getMessage("auth_disable_account", new Object[0])); + } else { + TenantContextHolder.setTenantId(mgrUser.getTenantId()); + if (this.checkCustState(mgrUser.getUserId())) { + log.info("用户已注销,不可以登录~~~~~~~~"); + throw new ServiceException(I18n.getMessage("auth_cust_cancel", new Object[0])); + } else { + List userRoleInfoVOList = this.mgrUserRoleMapper.getMgrUserRoleListByUserId(mgrUser.getUserId()); + if (ObjectUtil.isEmpty(userRoleInfoVOList)) { + log.info("用户未配置角色,不可以登录~~~~~~~~"); + throw new ServiceException(I18n.getMessage("auth_no_role", new Object[0])); + } else { + Set permissions = (Set)this.mgrRoleMenuMapper.listPermissions(mgrUser.getUserId()).stream().map(MgrMenuVO::getMenuCode).collect(Collectors.toSet()); + Set roles = (Set)userRoleInfoVOList.stream().map(MgrUserRoleInfoVO::getRoleCode).collect(Collectors.toSet()); + MgrUserInfo userInfo = this.createMgrUserInfo((MgrUser)BeanUtil.copyProperties(mgrUser, MgrUser.class, new String[0]), -1L, -1L, -1L, mgrUser.getTenantId(), permissions, roles); + Iterator var8 = userRoleInfoVOList.iterator(); + + while(true) { + MgrUserRoleInfoVO userRoleVO; + do { + if (!var8.hasNext()) { + log.info("商家操作员登录用户详细信息userInfo : {}", userInfo); + return userInfo; + } + + userRoleVO = (MgrUserRoleInfoVO)var8.next(); + } while(!MgrRoleTypeV2Enum.ROLE_ADMIN.getKey().equals(userRoleVO.getRoleType()) && !LeConstants.COMMON_YES.equals(userRoleVO.getIfDefault())); + + userInfo.setRoleCode(userRoleVO.getRoleCode()); + } + } + } + } + } else { + throw new Exception(I18n.getMessage("auth_overtime_account", new Object[0])); + } + } + } + + private boolean checkCustState(Long userId) { + Long custId = this.mgrUserMapper.selectCustIdByUserId(userId); + return ObjectUtil.isNull(custId); + } + + private MgrUserInfo createMgrUserInfo(MgrUser mgrUser, Long canteenEffId, Long custEffId, Long dishesEffId, Long tenantId, Set permissions, Set roles) { + MgrUserInfo userInfo = new MgrUserInfo(); + userInfo.setMgrUser(mgrUser); + userInfo.setCanteenEffId(canteenEffId); + userInfo.setCustEffId(custEffId); + userInfo.setDishesEffId(dishesEffId); + userInfo.setTenantId(tenantId); + userInfo.setPermissions(permissions); + userInfo.setRoles(roles); + return userInfo; + } + // public MgrUserOpsPO authTempOpsUser() { // Long merchantId = TenantContextHolder.getTenantId(); // MgrUserInSystem oldUserSystem = (MgrUserInSystem)Executors.readInSystem(() -> { @@ -517,108 +564,114 @@ public class MgrUserService extends ServiceImpl { // return pigxUser; // } // } -// -// public PigxUser login(MgrUserLoginDTO loginDTO) throws LeCheckedException { -// String realUsername = this.mgrUserBurialPointBusiness.didBeforeLogin(loginDTO); -// if (CharSequenceUtil.isNotBlank(realUsername)) { -// return this.getPigxUser(realUsername); -// } else { -// realUsername = loginDTO.getUsername(); -// ValueOperations valueOperations = this.stringRedisTemplate.opsForValue(); -// String s = (String)this.stringRedisTemplate.opsForValue().get("user-lock-" + realUsername); -// if (CharSequenceUtil.isNotBlank(s)) { -// if (Integer.parseInt(s) > 4 && Integer.parseInt(s) < 10) { -// valueOperations.increment("user-lock-" + realUsername); -// throw new LeException(I18n.getMessage("auth_lock_account", new Object[0])); -// } -// -// if (Integer.parseInt(s) > 10) { -// throw new LeException(I18n.getMessage("auth_lock_account_time", new Object[0])); -// } -// } -// -// boolean flag = this.matches(loginDTO); -// if (!flag) { -// this.handleLoginError(realUsername); -// throw new LeException(I18n.getMessage("auth_error_password_username", new Object[0])); -// } else { -// return this.getPigxUser(realUsername); -// } -// } -// } -// -// protected PigxUser getPigxUser(String realUsername) throws LeCheckedException { -// MgrUserInfo info = this.getUserInfoByUsername(realUsername); -// PigxUser user = PigxUser.builder().username(info.getMgrUser().getUsername()).id(info.getMgrUser().getUserId()).roleCode(info.getRoleCode()).merchantId(info.getTenantId()).canteenEffId(info.getCanteenEffId()).custEffId(info.getCustEffId()).dishesEffId(info.getDishesEffId()).build(); -// -// try { -// AccessToken accessToken = AccessToken.create(user.getId()); -// accessToken.setSubjectName(realUsername); -// Map subjectData = (Map)JSON.parseObject(JSON.toJSONString(user), new TypeReference>(this) { -// }, new Feature[0]); -// accessToken.setSubjectData(subjectData); -// accessToken.setScope(user.getMerchantId() == null ? null : String.valueOf(user.getMerchantId())); -// accessToken.bind().authenticate().store().write(); -// if (String.valueOf(TenantContextHolder.getTenantId()).equals(info.getMgrUser().getUsername())) { -// AuthOpsExpireMsgPO opsExpireMsgPO = new AuthOpsExpireMsgPO(); -// opsExpireMsgPO.setUserId(info.getMgrUser().getUserId()); -// opsExpireMsgPO.setAccessTokenId(accessToken.getId()); -// MqUtil.sendDelay(JSON.toJSONString(opsExpireMsgPO), LeMqConstant.Topic.AUTH_OPS_USER_EXPIRE, 86400000); -// } -// -// this.update((Wrapper)((LambdaUpdateWrapper)((LambdaUpdateWrapper)Wrappers.lambdaUpdate().set(MgrUser::getLoginTime, LocalDateTime.now())).set(MgrUser::getUptime, LocalDateTime.now())).eq(MgrUser::getUserId, user.getId())); -// if (Objects.nonNull(this.loginProperties.getReservedRecentNum())) { -// SecureManager.revokeAuthenticate(user.getId(), this.loginProperties.getReservedRecentNum()); -// } -// } catch (Exception var7) { -// String var10002 = I18n.getMessage("auth_login_fail", new Object[0]); -// throw new LeException(var10002 + var7.getMessage()); -// } -// -// if (!"admin".equals(user.getUsername())) { -// AllocLogRecord logRecord = new AllocLogRecord(user.getId(), user.getUsername(), "/oauth/token", "人员登录", LogRecordOperTypeEnum.LOGIN.getKey()); -// this.allocLogRecordService.saveLogRecordForCustom(logRecord); -// } -// -// return user; -// } -// -// private boolean matches(MgrUserLoginDTO loginDTO) { -// boolean flag = false; -// String username = loginDTO.getUsername(); -// String password = loginDTO.getPassword(); -// password = this.aesEncryptUtil.aesDecode(password); -// MgrUserInSystem user = (MgrUserInSystem)Executors.readInSystem(() -> { -// return (MgrUserInSystem)this.mgrUserInSystemMapper.selectOne((Wrapper)((LambdaQueryWrapper)Wrappers.lambdaQuery().select(new SFunction[]{MgrUserInSystem::getPassword, MgrUserInSystem::getUserId, MgrUserInSystem::getLockFlag}).eq(MgrUserInSystem::getUsername, username)).eq(MgrUserInSystem::getDelFlag, LeConstants.COMMON_NO)); -// }); -// if (ObjectUtil.isNotNull(user) && encoder.matches(password, user.getPassword())) { -// flag = true; -// } -// -// return flag; -// } -// -// private void handleLoginError(String username) { -// ValueOperations valueOperations = this.stringRedisTemplate.opsForValue(); -// String value = (String)valueOperations.get("user-lock-" + username); -// if (CharSequenceUtil.isBlank(value)) { -// valueOperations.increment("user-lock-" + username); -// this.stringRedisTemplate.expire("user-lock-" + username, 30L, TimeUnit.SECONDS); -// } -// -// Long increment = valueOperations.increment("user-lock-" + username); -// if (!ObjectUtil.isNull(increment)) { -// if (5 == increment.intValue()) { -// this.stringRedisTemplate.expire("user-lock-" + username, 2L, TimeUnit.MINUTES); -// } -// -// if (10 == increment.intValue()) { -// this.stringRedisTemplate.expire("user-lock-" + username, 10L, TimeUnit.MINUTES); -// } -// -// } -// } -// + + public PigxUser login(MgrUserLoginDTO loginDTO) throws Exception { + String realUsername = this.mgrUserBurialPointBusiness.didBeforeLogin(loginDTO); + if (CharSequenceUtil.isNotBlank(realUsername)) { + return this.getPigxUser(realUsername); + } else { + realUsername = loginDTO.getUsername(); + ValueOperations valueOperations = this.stringRedisTemplate.opsForValue(); + String s = (String)this.stringRedisTemplate.opsForValue().get("user-lock-" + realUsername); + if (CharSequenceUtil.isNotBlank(s)) { + if (Integer.parseInt(s) > 4 && Integer.parseInt(s) < 10) { + valueOperations.increment("user-lock-" + realUsername); + throw new ServiceException(I18n.getMessage("auth_lock_account", new Object[0])); + } + + if (Integer.parseInt(s) > 10) { + throw new ServiceException(I18n.getMessage("auth_lock_account_time", new Object[0])); + } + } + + boolean flag = this.matches(loginDTO); + if (!flag) { + this.handleLoginError(realUsername); + throw new ServiceException(I18n.getMessage("auth_error_password_username", new Object[0])); + } else { + return this.getPigxUser(realUsername); + } + } + } + + protected PigxUser getPigxUser(String realUsername) throws Exception { + MgrUserInfo info = this.getUserInfoByUsername(realUsername); + PigxUser user = PigxUser.builder().username(info.getMgrUser().getUsername()).id(info.getMgrUser().getUserId()).roleCode(info.getRoleCode()).merchantId(info.getTenantId()).canteenEffId(info.getCanteenEffId()).custEffId(info.getCustEffId()).dishesEffId(info.getDishesEffId()).build(); + + try { + AccessToken accessToken = AccessToken.create(user.getId()); + accessToken.setSubjectName(realUsername); + Map subjectData = (Map) JSON.parseObject(JSON.toJSONString(user)); + accessToken.setSubjectData(subjectData); + accessToken.setScope(user.getMerchantId() == null ? null : String.valueOf(user.getMerchantId())); + accessToken.bind().authenticate().store().write(); + if (String.valueOf(TenantContextHolder.getTenantId()).equals(info.getMgrUser().getUsername())) { + AuthOpsExpireMsgPO opsExpireMsgPO = new AuthOpsExpireMsgPO(); + opsExpireMsgPO.setUserId(info.getMgrUser().getUserId()); + opsExpireMsgPO.setAccessTokenId(accessToken.getId()); + MqUtil.sendDelay(JSON.toJSONString(opsExpireMsgPO), LeMqConstant.Topic.AUTH_OPS_USER_EXPIRE, 86400000); + } + +// this.update((Wrapper)((LambdaUpdateWrapper)((LambdaUpdateWrapper) Wrappers.lambdaUpdate() +// .set(MgrUser::getLoginTime, LocalDateTime.now())) +// .set(MgrUser::getUptime, LocalDateTime.now())) +// .eq(MgrUser::getUserId, user.getId())); + if (Objects.nonNull(this.loginProperties.getReservedRecentNum())) { + SecureManager.revokeAuthenticate(user.getId(), this.loginProperties.getReservedRecentNum()); + } + } catch (Exception var7) { + String var10002 = I18n.getMessage("auth_login_fail", new Object[0]); + throw new ServiceException(var10002 + var7.getMessage()); + } + + if (!"admin".equals(user.getUsername())) { + AllocLogRecord logRecord = new AllocLogRecord(user.getId(), user.getUsername(), "/oauth/token", "人员登录", LogRecordOperTypeEnum.LOGIN.getKey()); + this.allocLogRecordService.saveLogRecordForCustom(logRecord); + } + + return user; + } + + private boolean matches(MgrUserLoginDTO loginDTO) { + boolean flag = false; + String username = loginDTO.getUsername(); + String password = loginDTO.getPassword(); + password = AesEncryptUtil.aesDecode(password); + MgrUserInSystem user = (MgrUserInSystem) Executors.readInSystem(() -> { + return null; +// return (MgrUserInSystem)this.mgrUserInSystemMapper.selectOne((Wrapper)((LambdaQueryWrapper)Wrappers.lambdaQuery() +// .select(MgrUserInSystem::getPassword, MgrUserInSystem::getUserId, MgrUserInSystem::getLockFlag) +// .eq(MgrUserInSystem::getUsername, username)) +// .eq(MgrUserInSystem::getDelFlag, LeConstants.COMMON_NO)); + }); + if (ObjectUtil.isNotNull(user) && encoder.matches(password, user.getPassword())) { + flag = true; + } + + return flag; + } + + private void handleLoginError(String username) { + ValueOperations valueOperations = this.stringRedisTemplate.opsForValue(); + String value = (String)valueOperations.get("user-lock-" + username); + if (CharSequenceUtil.isBlank(value)) { + valueOperations.increment("user-lock-" + username); + this.stringRedisTemplate.expire("user-lock-" + username, 30L, TimeUnit.SECONDS); + } + + Long increment = valueOperations.increment("user-lock-" + username); + if (!ObjectUtil.isNull(increment)) { + if (5 == increment.intValue()) { + this.stringRedisTemplate.expire("user-lock-" + username, 2L, TimeUnit.MINUTES); + } + + if (10 == increment.intValue()) { + this.stringRedisTemplate.expire("user-lock-" + username, 10L, TimeUnit.MINUTES); + } + + } + } + // public MgrUserInfoVO getMgrUserInfo(Long userId) { // MgrUserDetailVO mgrUserDetailVO = ((MgrUserMapper)this.baseMapper).selectUserInfoByUserId(userId, DelFlagEnum.DEL_FALSE.key()); // if (ObjectUtil.isNull(mgrUserDetailVO)) { diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRoleInfoVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRoleInfoVO.java new file mode 100644 index 00000000..3848fdbc --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRoleInfoVO.java @@ -0,0 +1,51 @@ +package com.bonus.canteen.core.auth.user.vo; + +import io.swagger.annotations.ApiModelProperty; + +public class MgrUserRoleInfoVO { + @ApiModelProperty("角色id") + private Long roleId; + @ApiModelProperty("角色code") + private String roleCode; + @ApiModelProperty("是否默认,1:是,2:否") + private Integer ifDefault; + @ApiModelProperty("角色类型") + private Integer roleType; + + public Long getRoleId() { + return this.roleId; + } + + public String getRoleCode() { + return this.roleCode; + } + + public Integer getIfDefault() { + return this.ifDefault; + } + + public Integer getRoleType() { + return this.roleType; + } + + public void setRoleId(final Long roleId) { + this.roleId = roleId; + } + + public void setRoleCode(final String roleCode) { + this.roleCode = roleCode; + } + + public void setIfDefault(final Integer ifDefault) { + this.ifDefault = ifDefault; + } + + public void setRoleType(final Integer roleType) { + this.roleType = roleType; + } + + public String toString() { + Long var10000 = this.getRoleId(); + return "MgrUserRoleInfoVO(roleId=" + var10000 + ", roleCode=" + this.getRoleCode() + ", ifDefault=" + this.getIfDefault() + ", roleType=" + this.getRoleType() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRolePageVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRolePageVO.java new file mode 100644 index 00000000..4dc03a3f --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/auth/user/vo/MgrUserRolePageVO.java @@ -0,0 +1,63 @@ +package com.bonus.canteen.core.auth.user.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel("角色分页") +public class MgrUserRolePageVO { + @ApiModelProperty("用户id") + private Long userId; + @ApiModelProperty("角色id") + private Long roleId; + @ApiModelProperty("角色名称") + private String roleName; + @ApiModelProperty("角色标识") + private String roleCode; + @ApiModelProperty("描述") + private String roleDesc; + + public Long getUserId() { + return this.userId; + } + + public Long getRoleId() { + return this.roleId; + } + + public String getRoleName() { + return this.roleName; + } + + public String getRoleCode() { + return this.roleCode; + } + + public String getRoleDesc() { + return this.roleDesc; + } + + public void setUserId(final Long userId) { + this.userId = userId; + } + + public void setRoleId(final Long roleId) { + this.roleId = roleId; + } + + public void setRoleName(final String roleName) { + this.roleName = roleName; + } + + public void setRoleCode(final String roleCode) { + this.roleCode = roleCode; + } + + public void setRoleDesc(final String roleDesc) { + this.roleDesc = roleDesc; + } + + public String toString() { + Long var10000 = this.getUserId(); + return "MgrUserRolePageVO(userId=" + var10000 + ", roleId=" + this.getRoleId() + ", roleName=" + this.getRoleName() + ", roleCode=" + this.getRoleCode() + ", roleDesc=" + this.getRoleDesc() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/common/enums/LogRecordOperTypeEnum.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/common/enums/LogRecordOperTypeEnum.java new file mode 100644 index 00000000..b3da6571 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/common/enums/LogRecordOperTypeEnum.java @@ -0,0 +1,27 @@ +package com.bonus.canteen.core.common.enums; + +public enum LogRecordOperTypeEnum { + LOGIN(1, "登录"), + SIGN_OUT(2, "退出"), + ADD(3, "新增"), + MODIFY(4, "修改"), + REMOVE(5, "删除"), + QUERY(6, "查询"); + + private final int key; + private final String desc; + + private LogRecordOperTypeEnum(Integer key, String desc) { + this.key = key; + this.desc = desc; + } + + public int getKey() { + return this.key; + } + + public String getDesc() { + return this.desc; + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AccessToken.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AccessToken.java index 628d59b4..b5a112a1 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AccessToken.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AccessToken.java @@ -1,242 +1,242 @@ -package com.bonus.canteen.core.config; - -import cn.hutool.core.util.ArrayUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.script.DefaultRedisScript; - -import java.time.Instant; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; - -@JsonIgnoreProperties( - ignoreUnknown = true -) -public class AccessToken { - private static final Logger log = LoggerFactory.getLogger(AccessToken.class); - @JsonIgnore - protected static ObjectMapper objectMapper; - @JsonIgnore - protected static SecureProperties secureProperties; - @JsonIgnore - protected static StringRedisTemplate redisTemplate; - @JsonIgnore - protected static AuthenticationPredicate authenticationPredicate; - private String id; - private Long subjectId; - private String subjectName; - private Map subjectData = Maps.newHashMap(); - private String scope; - private boolean identified; - private long createTime; - private long lastTime; - - public static Optional recovery(String clientToken) { - StringRedisTemplate var10000 = redisTemplate; - String var10001 = secureProperties.getServer().getStoreKey(); - clientToken = (String)var10000.boundValueOps(var10001 + ":" + clientToken).get(); - if (StringUtils.isBlank(clientToken)) { - return Optional.empty(); - } else { - try { - AccessToken existToken = (AccessToken)objectMapper.readValue(clientToken, AccessToken.class); - return authenticationPredicate.authenticated(existToken) ? Optional.of(existToken) : Optional.empty(); - } catch (Exception var2) { - log.error("Deserialize exist token error", var2); - return Optional.empty(); - } - } - } - - public static AccessToken create(long subjectId) { - AccessToken accessToken = create(); - accessToken.setSubjectId(subjectId); - return accessToken; - } - - public static AccessToken create(long subjectId, String subjectName) { - AccessToken accessToken = create(subjectId); - accessToken.setSubjectName(subjectName); - return accessToken; - } - - public static AccessToken create() { - AccessToken accessToken = new AccessToken(); - accessToken.setId(UUID.randomUUID().toString()); - accessToken.setCreateTime(Instant.now().getEpochSecond()); - accessToken.setLastTime(Instant.now().getEpochSecond()); - return accessToken; - } - - public AccessToken touch() { - this.identified = this.isAuthenticated(); - this.lastTime = Instant.now().getEpochSecond(); - return this.store(); - } - - @JsonIgnore - public boolean isAuthenticated() { - return this.identified && !this.isExpired(); - } - - @JsonIgnore - private boolean isExpired() { - return this.lastTime + secureProperties.getExpireAfter() < Instant.now().getEpochSecond(); - } - - public AccessToken withData(Map data) { - this.subjectData = data; - return this; - } - - public AccessToken setData(String name, String value) { - this.subjectData.put(name, value); - return this; - } - - public AccessToken removeData(String... keys) { - if (ArrayUtil.isEmpty(keys)) { - return this; - } else { - String[] var2 = keys; - int var3 = keys.length; - - for(int var4 = 0; var4 < var3; ++var4) { - String key = var2[var4]; - this.subjectData.remove(key); - } - - return this; - } - } - - public AccessToken revokeAuthenticate() { - this.identified = false; - return this.store(); - } - - public AccessToken authenticate() { - if (this.subjectId == null) { - throw new RuntimeException("required subjectId is not provide"); - } else { - this.identified = true; - return this; - } - } - - public AccessToken store() { - try { - StringRedisTemplate var10000 = redisTemplate; - DefaultRedisScript var10001 = new DefaultRedisScript("redis.call('SET',KEYS[1],ARGV[1],'EX',ARGV[3]);redis.call('SET',KEYS[2],ARGV[2],'EX',ARGV[3]);"); - String[] var10002 = new String[2]; - String var10005 = secureProperties.getServer().getStoreKey(); - var10002[0] = var10005 + ":" + this.getId(); - var10005 = secureProperties.getServer().getSubjectRefTokenKey(); - var10002[1] = var10005 + ":" + this.getSubjectId() + ":" + this.getId() + ":" + this.getCreateTime(); - var10000.execute(var10001, Lists.newArrayList(var10002), new Object[]{objectMapper.writeValueAsString(this), this.getId(), String.valueOf(secureProperties.getServer().getTtl())}); - } catch (Exception var2) { - log.error("Token store error", var2); - } - - return this; - } - - public AccessToken bind() { - WebContext.get().setAccessToken(this); - return this; - } - - public void write() { - WebContext.get().getResponse().ifPresent((response) -> { - response.setHeader(secureProperties.getTokenSymbol(), this.getId()); - }); - } - - public void clear() { - try { - StringRedisTemplate var10000 = redisTemplate; - DefaultRedisScript var10001 = new DefaultRedisScript("redis.call('DEL',KEYS[1],KEYS[2]);"); - String[] var10002 = new String[2]; - String var10005 = secureProperties.getServer().getStoreKey(); - var10002[0] = var10005 + ":" + this.getId(); - var10005 = secureProperties.getServer().getSubjectRefTokenKey(); - var10002[1] = var10005 + ":" + this.getSubjectId() + ":" + this.getId() + ":" + this.getCreateTime(); - var10000.execute(var10001, Lists.newArrayList(var10002), new Object[0]); - } catch (Exception var2) { - log.error("Token clear error", var2); - } - - } - - public String getId() { - return this.id; - } - - public Long getSubjectId() { - return this.subjectId; - } - - public String getSubjectName() { - return this.subjectName; - } - - public Map getSubjectData() { - return this.subjectData; - } - - public String getScope() { - return this.scope; - } - - public boolean isIdentified() { - return this.identified; - } - - public long getCreateTime() { - return this.createTime; - } - - public long getLastTime() { - return this.lastTime; - } - - public void setId(final String id) { - this.id = id; - } - - public void setSubjectId(final Long subjectId) { - this.subjectId = subjectId; - } - - public void setSubjectName(final String subjectName) { - this.subjectName = subjectName; - } - - public void setSubjectData(final Map subjectData) { - this.subjectData = subjectData; - } - - public void setScope(final String scope) { - this.scope = scope; - } - - public void setIdentified(final boolean identified) { - this.identified = identified; - } - - public void setCreateTime(final long createTime) { - this.createTime = createTime; - } - - public void setLastTime(final long lastTime) { - this.lastTime = lastTime; - } -} +//package com.bonus.canteen.core.config; +// +//import cn.hutool.core.util.ArrayUtil; +//import com.bonus.common.houqin.framework.secure.SecureProperties; +//import com.fasterxml.jackson.annotation.JsonIgnore; +//import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.google.common.collect.Lists; +//import com.google.common.collect.Maps; +//import org.apache.commons.lang3.StringUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.data.redis.core.StringRedisTemplate; +//import org.springframework.data.redis.core.script.DefaultRedisScript; +//import java.time.Instant; +//import java.util.Map; +//import java.util.Optional; +//import java.util.UUID; +// +//@JsonIgnoreProperties( +// ignoreUnknown = true +//) +//public class AccessToken { +// private static final Logger log = LoggerFactory.getLogger(AccessToken.class); +// @JsonIgnore +// protected static ObjectMapper objectMapper; +// @JsonIgnore +// protected static SecureProperties secureProperties; +// @JsonIgnore +// protected static StringRedisTemplate redisTemplate; +// @JsonIgnore +// protected static AuthenticationPredicate authenticationPredicate; +// private String id; +// private Long subjectId; +// private String subjectName; +// private Map subjectData = Maps.newHashMap(); +// private String scope; +// private boolean identified; +// private long createTime; +// private long lastTime; +// +// public static Optional recovery(String clientToken) { +// StringRedisTemplate var10000 = redisTemplate; +// String var10001 = secureProperties.getServer().getStoreKey(); +// clientToken = (String)var10000.boundValueOps(var10001 + ":" + clientToken).get(); +// if (StringUtils.isBlank(clientToken)) { +// return Optional.empty(); +// } else { +// try { +// AccessToken existToken = (AccessToken)objectMapper.readValue(clientToken, AccessToken.class); +// return authenticationPredicate.authenticated(existToken) ? Optional.of(existToken) : Optional.empty(); +// } catch (Exception var2) { +// log.error("Deserialize exist token error", var2); +// return Optional.empty(); +// } +// } +// } +// +// public static AccessToken create(long subjectId) { +// AccessToken accessToken = create(); +// accessToken.setSubjectId(subjectId); +// return accessToken; +// } +// +// public static AccessToken create(long subjectId, String subjectName) { +// AccessToken accessToken = create(subjectId); +// accessToken.setSubjectName(subjectName); +// return accessToken; +// } +// +// public static AccessToken create() { +// AccessToken accessToken = new AccessToken(); +// accessToken.setId(UUID.randomUUID().toString()); +// accessToken.setCreateTime(Instant.now().getEpochSecond()); +// accessToken.setLastTime(Instant.now().getEpochSecond()); +// return accessToken; +// } +// +// public AccessToken touch() { +// this.identified = this.isAuthenticated(); +// this.lastTime = Instant.now().getEpochSecond(); +// return this.store(); +// } +// +// @JsonIgnore +// public boolean isAuthenticated() { +// return this.identified && !this.isExpired(); +// } +// +// @JsonIgnore +// private boolean isExpired() { +// return this.lastTime + secureProperties.getExpireAfter() < Instant.now().getEpochSecond(); +// } +// +// public AccessToken withData(Map data) { +// this.subjectData = data; +// return this; +// } +// +// public AccessToken setData(String name, String value) { +// this.subjectData.put(name, value); +// return this; +// } +// +// public AccessToken removeData(String... keys) { +// if (ArrayUtil.isEmpty(keys)) { +// return this; +// } else { +// String[] var2 = keys; +// int var3 = keys.length; +// +// for(int var4 = 0; var4 < var3; ++var4) { +// String key = var2[var4]; +// this.subjectData.remove(key); +// } +// +// return this; +// } +// } +// +// public AccessToken revokeAuthenticate() { +// this.identified = false; +// return this.store(); +// } +// +// public AccessToken authenticate() { +// if (this.subjectId == null) { +// throw new RuntimeException("required subjectId is not provide"); +// } else { +// this.identified = true; +// return this; +// } +// } +// +// public AccessToken store() { +// try { +// StringRedisTemplate var10000 = redisTemplate; +// DefaultRedisScript var10001 = new DefaultRedisScript("redis.call('SET',KEYS[1],ARGV[1],'EX',ARGV[3]);redis.call('SET',KEYS[2],ARGV[2],'EX',ARGV[3]);"); +// String[] var10002 = new String[2]; +// String var10005 = secureProperties.getServer().getStoreKey(); +// var10002[0] = var10005 + ":" + this.getId(); +// var10005 = secureProperties.getServer().getSubjectRefTokenKey(); +// var10002[1] = var10005 + ":" + this.getSubjectId() + ":" + this.getId() + ":" + this.getCreateTime(); +// var10000.execute(var10001, Lists.newArrayList(var10002), new Object[]{objectMapper.writeValueAsString(this), this.getId(), String.valueOf(secureProperties.getServer().getTtl())}); +// } catch (Exception var2) { +// log.error("Token store error", var2); +// } +// +// return this; +// } +// +// public AccessToken bind() { +// WebContext.get().setAccessToken(this); +// return this; +// } +// +// public void write() { +// WebContext.get().getResponse().ifPresent((response) -> { +// response.setHeader(secureProperties.getTokenSymbol(), this.getId()); +// }); +// } +// +// public void clear() { +// try { +// StringRedisTemplate var10000 = redisTemplate; +// DefaultRedisScript var10001 = new DefaultRedisScript("redis.call('DEL',KEYS[1],KEYS[2]);"); +// String[] var10002 = new String[2]; +// String var10005 = secureProperties.getServer().getStoreKey(); +// var10002[0] = var10005 + ":" + this.getId(); +// var10005 = secureProperties.getServer().getSubjectRefTokenKey(); +// var10002[1] = var10005 + ":" + this.getSubjectId() + ":" + this.getId() + ":" + this.getCreateTime(); +// var10000.execute(var10001, Lists.newArrayList(var10002), new Object[0]); +// } catch (Exception var2) { +// log.error("Token clear error", var2); +// } +// +// } +// +// public String getId() { +// return this.id; +// } +// +// public Long getSubjectId() { +// return this.subjectId; +// } +// +// public String getSubjectName() { +// return this.subjectName; +// } +// +// public Map getSubjectData() { +// return this.subjectData; +// } +// +// public String getScope() { +// return this.scope; +// } +// +// public boolean isIdentified() { +// return this.identified; +// } +// +// public long getCreateTime() { +// return this.createTime; +// } +// +// public long getLastTime() { +// return this.lastTime; +// } +// +// public void setId(final String id) { +// this.id = id; +// } +// +// public void setSubjectId(final Long subjectId) { +// this.subjectId = subjectId; +// } +// +// public void setSubjectName(final String subjectName) { +// this.subjectName = subjectName; +// } +// +// public void setSubjectData(final Map subjectData) { +// this.subjectData = subjectData; +// } +// +// public void setScope(final String scope) { +// this.scope = scope; +// } +// +// public void setIdentified(final boolean identified) { +// this.identified = identified; +// } +// +// public void setCreateTime(final long createTime) { +// this.createTime = createTime; +// } +// +// public void setLastTime(final long lastTime) { +// this.lastTime = lastTime; +// } +//} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AuthenticationPredicate.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AuthenticationPredicate.java index 9d8d7a98..eac0e4b5 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AuthenticationPredicate.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/AuthenticationPredicate.java @@ -1,5 +1,5 @@ -package com.bonus.canteen.core.config; - -public interface AuthenticationPredicate { - boolean authenticated(AccessToken accessToken); -} +//package com.bonus.canteen.core.config; +// +//public interface AuthenticationPredicate { +// boolean authenticated(AccessToken accessToken); +//} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SecureProperties.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SecureProperties.java index 2e588f53..01673362 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SecureProperties.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SecureProperties.java @@ -1,368 +1,375 @@ -package com.bonus.canteen.core.config; - -import cn.hutool.core.codec.Base64Decoder; -import com.google.common.collect.Sets; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.Set; - -@RefreshScope -@Component -@ConfigurationProperties( - prefix = "secure" -) -public class SecureProperties { - public static final String PREFIX = "secure"; - private boolean enabled = true; - private boolean prohibitUnannotatedHandler = false; - private String tokenSymbol = "X-Token"; - private String permissionKey = "secure:pms"; - private long permissionTTL = 7200L; - private long expireAfter = 7200L; - private ServerStore server = new ServerStore(); - private Security security = new Security(); - private MdcLogParameter mdc = new MdcLogParameter(); - - public boolean isEnabled() { - return this.enabled; - } - - public boolean isProhibitUnannotatedHandler() { - return this.prohibitUnannotatedHandler; - } - - public String getTokenSymbol() { - return this.tokenSymbol; - } - - public String getPermissionKey() { - return this.permissionKey; - } - - public long getPermissionTTL() { - return this.permissionTTL; - } - - public long getExpireAfter() { - return this.expireAfter; - } - - public ServerStore getServer() { - return this.server; - } - - public Security getSecurity() { - return this.security; - } - - public MdcLogParameter getMdc() { - return this.mdc; - } - - public void setEnabled(final boolean enabled) { - this.enabled = enabled; - } - - public void setProhibitUnannotatedHandler(final boolean prohibitUnannotatedHandler) { - this.prohibitUnannotatedHandler = prohibitUnannotatedHandler; - } - - public void setTokenSymbol(final String tokenSymbol) { - this.tokenSymbol = tokenSymbol; - } - - public void setPermissionKey(final String permissionKey) { - this.permissionKey = permissionKey; - } - - public void setPermissionTTL(final long permissionTTL) { - this.permissionTTL = permissionTTL; - } - - public void setExpireAfter(final long expireAfter) { - this.expireAfter = expireAfter; - } - - public void setServer(final ServerStore server) { - this.server = server; - } - - public void setSecurity(final Security security) { - this.security = security; - } - - public void setMdc(final MdcLogParameter mdc) { - this.mdc = mdc; - } - - public static class ServerStore { - private String storeKey = "secure:token"; - private String subjectRefTokenKey = "secure:subject-token"; - private long ttl = 14400L; - - public String getStoreKey() { - return this.storeKey; - } - - public String getSubjectRefTokenKey() { - return this.subjectRefTokenKey; - } - - public long getTtl() { - return this.ttl; - } - - public void setStoreKey(final String storeKey) { - this.storeKey = storeKey; - } - - public void setSubjectRefTokenKey(final String subjectRefTokenKey) { - this.subjectRefTokenKey = subjectRefTokenKey; - } - - public void setTtl(final long ttl) { - this.ttl = ttl; - } - } - - public static class Security { - private String encryptUriPrefix = "/security"; - private String keyExchangePath = "/exchange/key"; - private String publicKeyExchangePath = "/exchange/public-key"; - private Set ignoredUri = Sets.newHashSet(); - private String requestBodySignParamName = "body"; - private String clientKeySignParamName = "clientKey"; - private Set addonSignHeaderPrefix = Sets.newHashSet(new String[]{"X-Security-Ext"}); - private Set tokenHeaderNames = Sets.newHashSet(new String[]{"X-Security-Token", "X-Security-Tenant-Id", "X-Security-Sn"}); - private String tokenSignHeaderName = "X-Security-Token-Sign"; - private String serverKeySignParamName = "serverKey"; - private String serverSm4Key = "McaCOPft5/J3bUG4pdVjhg=="; - private byte[] serverSm4KeyBytes; - private String serverSm2Key; - private byte[] serverSm2KeyBytes; - private String clientSm2Key; - private byte[] clientSm2KeyBytes; - private String timestampHeaderName; - private String nonceHeaderName; - private String signHeaderName; - private String serverEncryptedClientKeyHeaderName; - private long maxWindowSeconds; - private String playKey; - - public void setServerSm4Key(String serverSm4Key) { - this.serverSm4Key = serverSm4Key; - this.serverSm4KeyBytes = Base64Decoder.decode(serverSm4Key); - } - - public Security() { - this.serverSm4KeyBytes = Base64Decoder.decode(this.serverSm4Key); - this.serverSm2Key = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCtqk5Jj7pPWh91d9mPA4Kd7fOfzBULrnAERNDV+4XBCgCgYIKoEcz1UBgi2hRANCAARykhB6sXHWTbB60Pr+laPqEP5JBRpEcySONKKP5Q03o/g3OpnQXc7aVMdLUxL8wD1wQHEu4KHmHQr7jvVt0rkM"; - this.serverSm2KeyBytes = Base64Decoder.decode(this.serverSm2Key); - this.clientSm2Key = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEcpIQerFx1k2wetD6/pWj6hD+SQUaRHMkjjSij+UNN6P4NzqZ0F3O2lTHS1MS/MA9cEBxLuCh5h0K+471bdK5DA=="; - this.clientSm2KeyBytes = Base64Decoder.decode(this.serverSm2Key); - this.timestampHeaderName = "X-Security-Timestamp"; - this.nonceHeaderName = "X-Security-Nonce"; - this.signHeaderName = "X-Security-Sign"; - this.serverEncryptedClientKeyHeaderName = "X-Security-Server-Encrypted-Client-Key"; - this.maxWindowSeconds = 90L; - this.playKey = "__play:"; - } - - public String getEncryptUriPrefix() { - return this.encryptUriPrefix; - } - - public String getKeyExchangePath() { - return this.keyExchangePath; - } - - public String getPublicKeyExchangePath() { - return this.publicKeyExchangePath; - } - - public Set getIgnoredUri() { - return this.ignoredUri; - } - - public String getRequestBodySignParamName() { - return this.requestBodySignParamName; - } - - public String getClientKeySignParamName() { - return this.clientKeySignParamName; - } - - public Set getAddonSignHeaderPrefix() { - return this.addonSignHeaderPrefix; - } - - public Set getTokenHeaderNames() { - return this.tokenHeaderNames; - } - - public String getTokenSignHeaderName() { - return this.tokenSignHeaderName; - } - - public String getServerKeySignParamName() { - return this.serverKeySignParamName; - } - - public String getServerSm4Key() { - return this.serverSm4Key; - } - - public byte[] getServerSm4KeyBytes() { - return this.serverSm4KeyBytes; - } - - public String getServerSm2Key() { - return this.serverSm2Key; - } - - public byte[] getServerSm2KeyBytes() { - return this.serverSm2KeyBytes; - } - - public String getClientSm2Key() { - return this.clientSm2Key; - } - - public byte[] getClientSm2KeyBytes() { - return this.clientSm2KeyBytes; - } - - public String getTimestampHeaderName() { - return this.timestampHeaderName; - } - - public String getNonceHeaderName() { - return this.nonceHeaderName; - } - - public String getSignHeaderName() { - return this.signHeaderName; - } - - public String getServerEncryptedClientKeyHeaderName() { - return this.serverEncryptedClientKeyHeaderName; - } - - public long getMaxWindowSeconds() { - return this.maxWindowSeconds; - } - - public String getPlayKey() { - return this.playKey; - } - - public void setEncryptUriPrefix(final String encryptUriPrefix) { - this.encryptUriPrefix = encryptUriPrefix; - } - - public void setKeyExchangePath(final String keyExchangePath) { - this.keyExchangePath = keyExchangePath; - } - - public void setPublicKeyExchangePath(final String publicKeyExchangePath) { - this.publicKeyExchangePath = publicKeyExchangePath; - } - - public void setIgnoredUri(final Set ignoredUri) { - this.ignoredUri = ignoredUri; - } - - public void setRequestBodySignParamName(final String requestBodySignParamName) { - this.requestBodySignParamName = requestBodySignParamName; - } - - public void setClientKeySignParamName(final String clientKeySignParamName) { - this.clientKeySignParamName = clientKeySignParamName; - } - - public void setAddonSignHeaderPrefix(final Set addonSignHeaderPrefix) { - this.addonSignHeaderPrefix = addonSignHeaderPrefix; - } - - public void setTokenHeaderNames(final Set tokenHeaderNames) { - this.tokenHeaderNames = tokenHeaderNames; - } - - public void setTokenSignHeaderName(final String tokenSignHeaderName) { - this.tokenSignHeaderName = tokenSignHeaderName; - } - - public void setServerKeySignParamName(final String serverKeySignParamName) { - this.serverKeySignParamName = serverKeySignParamName; - } - - public void setServerSm4KeyBytes(final byte[] serverSm4KeyBytes) { - this.serverSm4KeyBytes = serverSm4KeyBytes; - } - - public void setServerSm2Key(final String serverSm2Key) { - this.serverSm2Key = serverSm2Key; - } - - public void setServerSm2KeyBytes(final byte[] serverSm2KeyBytes) { - this.serverSm2KeyBytes = serverSm2KeyBytes; - } - - public void setClientSm2Key(final String clientSm2Key) { - this.clientSm2Key = clientSm2Key; - } - - public void setClientSm2KeyBytes(final byte[] clientSm2KeyBytes) { - this.clientSm2KeyBytes = clientSm2KeyBytes; - } - - public void setTimestampHeaderName(final String timestampHeaderName) { - this.timestampHeaderName = timestampHeaderName; - } - - public void setNonceHeaderName(final String nonceHeaderName) { - this.nonceHeaderName = nonceHeaderName; - } - - public void setSignHeaderName(final String signHeaderName) { - this.signHeaderName = signHeaderName; - } - - public void setServerEncryptedClientKeyHeaderName(final String serverEncryptedClientKeyHeaderName) { - this.serverEncryptedClientKeyHeaderName = serverEncryptedClientKeyHeaderName; - } - - public void setMaxWindowSeconds(final long maxWindowSeconds) { - this.maxWindowSeconds = maxWindowSeconds; - } - - public void setPlayKey(final String playKey) { - this.playKey = playKey; - } - - } - - public static class MdcLogParameter { - private String subjectId = "x-id"; - private String subjectName = "x-name"; - - public String getSubjectId() { - return this.subjectId; - } - - public String getSubjectName() { - return this.subjectName; - } - - public void setSubjectId(final String subjectId) { - this.subjectId = subjectId; - } - - public void setSubjectName(final String subjectName) { - this.subjectName = subjectName; - } - } -} +//package com.bonus.canteen.core.config; +// +//import cn.hutool.core.codec.Base64Decoder; +//import com.google.common.collect.Sets; +//import org.springframework.boot.context.properties.ConfigurationProperties; +//import org.springframework.cloud.context.config.annotation.RefreshScope; +//import org.springframework.stereotype.Component; +// +//import java.util.Arrays; +//import java.util.Set; +// +//@RefreshScope +//@Component +//@ConfigurationProperties( +// prefix = "secure" +//) +//public class SecureProperties { +// public static final String PREFIX = "secure"; +// private boolean enabled = true; +// private boolean prohibitUnannotatedHandler = false; +// private String tokenSymbol = "X-Token"; +// private String permissionKey = "secure:pms"; +// private long permissionTTL = 7200L; +// private long expireAfter = 7200L; +// private ServerStore server = new ServerStore(); +// private Security security = new Security(); +// private MdcLogParameter mdc = new MdcLogParameter(); +// +// public boolean isEnabled() { +// return this.enabled; +// } +// +// public boolean isProhibitUnannotatedHandler() { +// return this.prohibitUnannotatedHandler; +// } +// +// public String getTokenSymbol() { +// return this.tokenSymbol; +// } +// +// public String getPermissionKey() { +// return this.permissionKey; +// } +// +// public long getPermissionTTL() { +// return this.permissionTTL; +// } +// +// public long getExpireAfter() { +// return this.expireAfter; +// } +// +// public ServerStore getServer() { +// return this.server; +// } +// +// public Security getSecurity() { +// return this.security; +// } +// +// public MdcLogParameter getMdc() { +// return this.mdc; +// } +// +// public void setEnabled(final boolean enabled) { +// this.enabled = enabled; +// } +// +// public void setProhibitUnannotatedHandler(final boolean prohibitUnannotatedHandler) { +// this.prohibitUnannotatedHandler = prohibitUnannotatedHandler; +// } +// +// public void setTokenSymbol(final String tokenSymbol) { +// this.tokenSymbol = tokenSymbol; +// } +// +// public void setPermissionKey(final String permissionKey) { +// this.permissionKey = permissionKey; +// } +// +// public void setPermissionTTL(final long permissionTTL) { +// this.permissionTTL = permissionTTL; +// } +// +// public void setExpireAfter(final long expireAfter) { +// this.expireAfter = expireAfter; +// } +// +// public void setServer(final ServerStore server) { +// this.server = server; +// } +// +// public void setSecurity(final Security security) { +// this.security = security; +// } +// +// public void setMdc(final MdcLogParameter mdc) { +// this.mdc = mdc; +// } +// +// public static class ServerStore { +// private String storeKey = "secure:token"; +// private String subjectRefTokenKey = "secure:subject-token"; +// private long ttl = 14400L; +// +// public String getStoreKey() { +// return this.storeKey; +// } +// +// public String getSubjectRefTokenKey() { +// return this.subjectRefTokenKey; +// } +// +// public long getTtl() { +// return this.ttl; +// } +// +// public void setStoreKey(final String storeKey) { +// this.storeKey = storeKey; +// } +// +// public void setSubjectRefTokenKey(final String subjectRefTokenKey) { +// this.subjectRefTokenKey = subjectRefTokenKey; +// } +// +// public void setTtl(final long ttl) { +// this.ttl = ttl; +// } +// } +// +// public static class Security { +// private String encryptUriPrefix = "/security"; +// private String keyExchangePath = "/exchange/key"; +// private String publicKeyExchangePath = "/exchange/public-key"; +// private Set ignoredUri = Sets.newHashSet(); +// private String requestBodySignParamName = "body"; +// private String clientKeySignParamName = "clientKey"; +// private Set addonSignHeaderPrefix = Sets.newHashSet(new String[]{"X-Security-Ext"}); +// private Set tokenHeaderNames = Sets.newHashSet(new String[]{"X-Security-Token", "X-Security-Tenant-Id", "X-Security-Sn"}); +// private String tokenSignHeaderName = "X-Security-Token-Sign"; +// private String serverKeySignParamName = "serverKey"; +// private String serverSm4Key = "McaCOPft5/J3bUG4pdVjhg=="; +// private byte[] serverSm4KeyBytes; +// private String serverSm2Key; +// private byte[] serverSm2KeyBytes; +// private String clientSm2Key; +// private byte[] clientSm2KeyBytes; +// private String timestampHeaderName; +// private String nonceHeaderName; +// private String signHeaderName; +// private String serverEncryptedClientKeyHeaderName; +// private long maxWindowSeconds; +// private String playKey; +// +// public void setServerSm4Key(String serverSm4Key) { +// this.serverSm4Key = serverSm4Key; +// this.serverSm4KeyBytes = Base64Decoder.decode(serverSm4Key); +// } +// +// public Security() { +// this.serverSm4KeyBytes = Base64Decoder.decode(this.serverSm4Key); +// this.serverSm2Key = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCtqk5Jj7pPWh91d9mPA4Kd7fOfzBULrnAERNDV+4XBCgCgYIKoEcz1UBgi2hRANCAARykhB6sXHWTbB60Pr+laPqEP5JBRpEcySONKKP5Q03o/g3OpnQXc7aVMdLUxL8wD1wQHEu4KHmHQr7jvVt0rkM"; +// this.serverSm2KeyBytes = Base64Decoder.decode(this.serverSm2Key); +// this.clientSm2Key = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEcpIQerFx1k2wetD6/pWj6hD+SQUaRHMkjjSij+UNN6P4NzqZ0F3O2lTHS1MS/MA9cEBxLuCh5h0K+471bdK5DA=="; +// this.clientSm2KeyBytes = Base64Decoder.decode(this.serverSm2Key); +// this.timestampHeaderName = "X-Security-Timestamp"; +// this.nonceHeaderName = "X-Security-Nonce"; +// this.signHeaderName = "X-Security-Sign"; +// this.serverEncryptedClientKeyHeaderName = "X-Security-Server-Encrypted-Client-Key"; +// this.maxWindowSeconds = 90L; +// this.playKey = "__play:"; +// } +// +// public static void main(String[] args) { +// String serverSm2Key = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCtqk5Jj7pPWh91d9mPA4Kd7fOfzBULrnAERNDV+4XBCgCgYIKoEcz1UBgi2hRANCAARykhB6sXHWTbB60Pr+laPqEP5JBRpEcySONKKP5Q03o/g3OpnQXc7aVMdLUxL8wD1wQHEu4KHmHQr7jvVt0rkM"; +// System.out.println(Base64Decoder.decode(serverSm2Key)); +// String clientSm2Key = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEcpIQerFx1k2wetD6/pWj6hD+SQUaRHMkjjSij+UNN6P4NzqZ0F3O2lTHS1MS/MA9cEBxLuCh5h0K+471bdK5DA=="; +// System.out.println(Base64Decoder.decode(clientSm2Key)); +// } +// +// public String getEncryptUriPrefix() { +// return this.encryptUriPrefix; +// } +// +// public String getKeyExchangePath() { +// return this.keyExchangePath; +// } +// +// public String getPublicKeyExchangePath() { +// return this.publicKeyExchangePath; +// } +// +// public Set getIgnoredUri() { +// return this.ignoredUri; +// } +// +// public String getRequestBodySignParamName() { +// return this.requestBodySignParamName; +// } +// +// public String getClientKeySignParamName() { +// return this.clientKeySignParamName; +// } +// +// public Set getAddonSignHeaderPrefix() { +// return this.addonSignHeaderPrefix; +// } +// +// public Set getTokenHeaderNames() { +// return this.tokenHeaderNames; +// } +// +// public String getTokenSignHeaderName() { +// return this.tokenSignHeaderName; +// } +// +// public String getServerKeySignParamName() { +// return this.serverKeySignParamName; +// } +// +// public String getServerSm4Key() { +// return this.serverSm4Key; +// } +// +// public byte[] getServerSm4KeyBytes() { +// return this.serverSm4KeyBytes; +// } +// +// public String getServerSm2Key() { +// return this.serverSm2Key; +// } +// +// public byte[] getServerSm2KeyBytes() { +// return this.serverSm2KeyBytes; +// } +// +// public String getClientSm2Key() { +// return this.clientSm2Key; +// } +// +// public byte[] getClientSm2KeyBytes() { +// return this.clientSm2KeyBytes; +// } +// +// public String getTimestampHeaderName() { +// return this.timestampHeaderName; +// } +// +// public String getNonceHeaderName() { +// return this.nonceHeaderName; +// } +// +// public String getSignHeaderName() { +// return this.signHeaderName; +// } +// +// public String getServerEncryptedClientKeyHeaderName() { +// return this.serverEncryptedClientKeyHeaderName; +// } +// +// public long getMaxWindowSeconds() { +// return this.maxWindowSeconds; +// } +// +// public String getPlayKey() { +// return this.playKey; +// } +// +// public void setEncryptUriPrefix(final String encryptUriPrefix) { +// this.encryptUriPrefix = encryptUriPrefix; +// } +// +// public void setKeyExchangePath(final String keyExchangePath) { +// this.keyExchangePath = keyExchangePath; +// } +// +// public void setPublicKeyExchangePath(final String publicKeyExchangePath) { +// this.publicKeyExchangePath = publicKeyExchangePath; +// } +// +// public void setIgnoredUri(final Set ignoredUri) { +// this.ignoredUri = ignoredUri; +// } +// +// public void setRequestBodySignParamName(final String requestBodySignParamName) { +// this.requestBodySignParamName = requestBodySignParamName; +// } +// +// public void setClientKeySignParamName(final String clientKeySignParamName) { +// this.clientKeySignParamName = clientKeySignParamName; +// } +// +// public void setAddonSignHeaderPrefix(final Set addonSignHeaderPrefix) { +// this.addonSignHeaderPrefix = addonSignHeaderPrefix; +// } +// +// public void setTokenHeaderNames(final Set tokenHeaderNames) { +// this.tokenHeaderNames = tokenHeaderNames; +// } +// +// public void setTokenSignHeaderName(final String tokenSignHeaderName) { +// this.tokenSignHeaderName = tokenSignHeaderName; +// } +// +// public void setServerKeySignParamName(final String serverKeySignParamName) { +// this.serverKeySignParamName = serverKeySignParamName; +// } +// +// public void setServerSm4KeyBytes(final byte[] serverSm4KeyBytes) { +// this.serverSm4KeyBytes = serverSm4KeyBytes; +// } +// +// public void setServerSm2Key(final String serverSm2Key) { +// this.serverSm2Key = serverSm2Key; +// } +// +// public void setServerSm2KeyBytes(final byte[] serverSm2KeyBytes) { +// this.serverSm2KeyBytes = serverSm2KeyBytes; +// } +// +// public void setClientSm2Key(final String clientSm2Key) { +// this.clientSm2Key = clientSm2Key; +// } +// +// public void setClientSm2KeyBytes(final byte[] clientSm2KeyBytes) { +// this.clientSm2KeyBytes = clientSm2KeyBytes; +// } +// +// public void setTimestampHeaderName(final String timestampHeaderName) { +// this.timestampHeaderName = timestampHeaderName; +// } +// +// public void setNonceHeaderName(final String nonceHeaderName) { +// this.nonceHeaderName = nonceHeaderName; +// } +// +// public void setSignHeaderName(final String signHeaderName) { +// this.signHeaderName = signHeaderName; +// } +// +// public void setServerEncryptedClientKeyHeaderName(final String serverEncryptedClientKeyHeaderName) { +// this.serverEncryptedClientKeyHeaderName = serverEncryptedClientKeyHeaderName; +// } +// +// public void setMaxWindowSeconds(final long maxWindowSeconds) { +// this.maxWindowSeconds = maxWindowSeconds; +// } +// +// public void setPlayKey(final String playKey) { +// this.playKey = playKey; +// } +// +// } +// +// public static class MdcLogParameter { +// private String subjectId = "x-id"; +// private String subjectName = "x-name"; +// +// public String getSubjectId() { +// return this.subjectId; +// } +// +// public String getSubjectName() { +// return this.subjectName; +// } +// +// public void setSubjectId(final String subjectId) { +// this.subjectId = subjectId; +// } +// +// public void setSubjectName(final String subjectName) { +// this.subjectName = subjectName; +// } +// } +//} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SmUtils.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SmUtils.java index bff6c6ad..61fe9594 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SmUtils.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/SmUtils.java @@ -10,6 +10,7 @@ import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.SM2; import cn.hutool.crypto.symmetric.SM4; +import com.bonus.common.houqin.framework.secure.SecureProperties; import com.google.common.base.Joiner; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/WebContext.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/WebContext.java index cf8707b5..f9bc840e 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/WebContext.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/WebContext.java @@ -1,101 +1,101 @@ -package com.bonus.canteen.core.config; - -import com.google.common.collect.Maps; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.Map; -import java.util.Optional; - -public class WebContext { - private static final ThreadLocal THREAD_CONTEXT = new InheritableThreadLocal() { - protected Context initialValue() { - return new Context(); - } - }; - - private WebContext() { - } - - public static void reset() { - THREAD_CONTEXT.remove(); - } - - public static Context get() { - return (Context)THREAD_CONTEXT.get(); - } - - public static void set(Context context) { - THREAD_CONTEXT.set(context); - } - - public static class Context { - private HttpServletRequest request; - private HttpServletResponse response; - private AccessToken accessToken; - private Map attributes = Maps.newHashMap(); - - public Context(HttpServletRequest request, HttpServletResponse response) { - this.request = request; - this.response = response; - } - - public void setAttribute(String key, Object data) { - this.attributes.put(key, data); - } - - public Object getAttribute(String key) { - return this.attributes.get(key); - } - - public void removeAttribute(String key) { - this.attributes.remove(key); - } - - public void clearAttribute() { - this.attributes.clear(); - } - - public Optional getAccessToken() { - return Optional.ofNullable(this.accessToken); - } - - public Optional getRequest() { - return Optional.ofNullable(this.request); - } - - public Optional getResponse() { - return Optional.ofNullable(this.response); - } - - public Map getAttributes() { - return this.attributes; - } - - public void setRequest(final HttpServletRequest request) { - this.request = request; - } - - public void setResponse(final HttpServletResponse response) { - this.response = response; - } - - public void setAccessToken(final AccessToken accessToken) { - this.accessToken = accessToken; - } - - public void setAttributes(final Map attributes) { - this.attributes = attributes; - } - - public Context() { - } - - public Context(final HttpServletRequest request, final HttpServletResponse response, final AccessToken accessToken, final Map attributes) { - this.request = request; - this.response = response; - this.accessToken = accessToken; - this.attributes = attributes; - } - } -} +//package com.bonus.canteen.core.config; +// +//import com.google.common.collect.Maps; +// +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.util.Map; +//import java.util.Optional; +// +//public class WebContext { +// private static final ThreadLocal THREAD_CONTEXT = new InheritableThreadLocal() { +// protected Context initialValue() { +// return new Context(); +// } +// }; +// +// private WebContext() { +// } +// +// public static void reset() { +// THREAD_CONTEXT.remove(); +// } +// +// public static Context get() { +// return (Context)THREAD_CONTEXT.get(); +// } +// +// public static void set(Context context) { +// THREAD_CONTEXT.set(context); +// } +// +// public static class Context { +// private HttpServletRequest request; +// private HttpServletResponse response; +// private AccessToken accessToken; +// private Map attributes = Maps.newHashMap(); +// +// public Context(HttpServletRequest request, HttpServletResponse response) { +// this.request = request; +// this.response = response; +// } +// +// public void setAttribute(String key, Object data) { +// this.attributes.put(key, data); +// } +// +// public Object getAttribute(String key) { +// return this.attributes.get(key); +// } +// +// public void removeAttribute(String key) { +// this.attributes.remove(key); +// } +// +// public void clearAttribute() { +// this.attributes.clear(); +// } +// +// public Optional getAccessToken() { +// return Optional.ofNullable(this.accessToken); +// } +// +// public Optional getRequest() { +// return Optional.ofNullable(this.request); +// } +// +// public Optional getResponse() { +// return Optional.ofNullable(this.response); +// } +// +// public Map getAttributes() { +// return this.attributes; +// } +// +// public void setRequest(final HttpServletRequest request) { +// this.request = request; +// } +// +// public void setResponse(final HttpServletResponse response) { +// this.response = response; +// } +// +// public void setAccessToken(final AccessToken accessToken) { +// this.accessToken = accessToken; +// } +// +// public void setAttributes(final Map attributes) { +// this.attributes = attributes; +// } +// +// public Context() { +// } +// +// public Context(final HttpServletRequest request, final HttpServletResponse response, final AccessToken accessToken, final Map attributes) { +// this.request = request; +// this.response = response; +// this.accessToken = accessToken; +// this.attributes = attributes; +// } +// } +//} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/json/JacksonConfiguration.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/json/JacksonConfiguration.java index 4ecbcf0a..7ef0d968 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/json/JacksonConfiguration.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/config/json/JacksonConfiguration.java @@ -1,6 +1,6 @@ package com.bonus.canteen.core.config.json; -import com.bonus.canteen.core.config.WebContext; +import com.bonus.common.houqin.framework.secure.WebContext; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.SerializerProvider; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/customer/service/AuthorizingService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/customer/service/AuthorizingService.java index e8b93432..a8105cd9 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/customer/service/AuthorizingService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/customer/service/AuthorizingService.java @@ -1,15 +1,15 @@ -package com.bonus.canteen.core.customer.service; - -import com.google.common.collect.Sets; - -import java.util.Set; - -public interface AuthorizingService { - default Set roles(long accountId) { - return Sets.newHashSet(); - } - - default Set permissions(long accountId) { - return Sets.newHashSet(); - } -} +//package com.bonus.canteen.core.customer.service; +// +//import com.google.common.collect.Sets; +// +//import java.util.Set; +// +//public interface AuthorizingService { +// default Set roles(long accountId) { +// return Sets.newHashSet(); +// } +// +// default Set permissions(long accountId) { +// return Sets.newHashSet(); +// } +//} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/merchant/vo/MercMerchantEndTimeVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/merchant/vo/MercMerchantEndTimeVO.java new file mode 100644 index 00000000..304785bb --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/merchant/vo/MercMerchantEndTimeVO.java @@ -0,0 +1,35 @@ +package com.bonus.canteen.core.merchant.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.time.LocalDateTime; + +@ApiModel("商家信息") +public class MercMerchantEndTimeVO { + @ApiModelProperty("授权截止日期") + private LocalDateTime endTime; + @ApiModelProperty("状态") + private Integer status; + + public LocalDateTime getEndTime() { + return this.endTime; + } + + public Integer getStatus() { + return this.status; + } + + public void setEndTime(final LocalDateTime endTime) { + this.endTime = endTime; + } + + public void setStatus(final Integer status) { + this.status = status; + } + + public String toString() { + String var10000 = String.valueOf(this.getEndTime()); + return "MercMerchantEndTimeVO(endTime=" + var10000 + ", status=" + this.getStatus() + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/model/AllocLogRecord.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/model/AllocLogRecord.java new file mode 100644 index 00000000..5b649a50 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/model/AllocLogRecord.java @@ -0,0 +1,203 @@ +package com.bonus.canteen.core.notice.hawkeye.model; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import com.bonus.canteen.core.common.encrypt.LeNiuDecryptDataProcess; +import com.bonus.canteen.core.common.encrypt.LeNiuDecryptField; +import com.bonus.canteen.core.common.encrypt.SM4EncDecHandler; +import com.bonus.canteen.core.notice.hawkeye.util.LocalDateTimeConverter; + +import java.time.LocalDateTime; + +@TableName( + value = "alloc_log_record", + autoResultMap = true +) +@ApiModel("系统日志统计表") +@LeNiuDecryptDataProcess +public class AllocLogRecord extends Model { + @TableId + @ApiModelProperty("主键id") + @ExcelIgnore + private Long id; + @ApiModelProperty("日志统计id") + @ExcelIgnore + private Long logRecordId; + @ApiModelProperty("登录人员名称") + @ExcelProperty( + value = {"登录人员名称"}, + index = 0 + ) + private String loginUserName; + @ApiModelProperty("登录人员手机号") + @ExcelProperty( + value = {"登录人员手机号"}, + index = 1 + ) + @TableField( + value = "login_user_phone", + typeHandler = SM4EncDecHandler.class + ) + @LeNiuDecryptField + private String loginUserPhone; + @ApiModelProperty("登录人员手机号后缀") + @TableField( + value = "login_user_phone_suffix", + typeHandler = SM4EncDecHandler.class + ) + @LeNiuDecryptField + @ExcelIgnore + private String loginUserPhoneSuffix; + @ApiModelProperty("登录ip地址") + @ExcelProperty( + value = {"登录ip地址"}, + index = 2 + ) + private String loginIp; + @ApiModelProperty("请求uri") + @ExcelProperty( + value = {"请求URI"}, + index = 3 + ) + private String requestUri; + @ApiModelProperty("访问功能") + @ExcelProperty( + value = {"操作类型"}, + index = 4 + ) + private String operateFunc; + @ApiModelProperty("操作类型") + @ExcelIgnore + private Integer operateType; + @ApiModelProperty("执行时间") + @ExcelIgnore + private Long executionTime; + @ApiModelProperty("创建人") + @ExcelIgnore + private String crby; + @ApiModelProperty("创建时间") + @ExcelProperty( + value = {"操作时间"}, + index = 5, + converter = LocalDateTimeConverter.class + ) + private LocalDateTime crtime; + + public AllocLogRecord(Long logRecordId, String loginUserName, String requestUri, String operateFunc, Integer operateType) { + this.logRecordId = logRecordId; + this.loginUserName = loginUserName; + this.requestUri = requestUri; + this.operateFunc = operateFunc; + this.operateType = operateType; + } + + public Long getId() { + return this.id; + } + + public Long getLogRecordId() { + return this.logRecordId; + } + + public String getLoginUserName() { + return this.loginUserName; + } + + public String getLoginUserPhone() { + return this.loginUserPhone; + } + + public String getLoginUserPhoneSuffix() { + return this.loginUserPhoneSuffix; + } + + public String getLoginIp() { + return this.loginIp; + } + + public String getRequestUri() { + return this.requestUri; + } + + public String getOperateFunc() { + return this.operateFunc; + } + + public Integer getOperateType() { + return this.operateType; + } + + public Long getExecutionTime() { + return this.executionTime; + } + + public String getCrby() { + return this.crby; + } + + public LocalDateTime getCrtime() { + return this.crtime; + } + + public void setId(final Long id) { + this.id = id; + } + + public void setLogRecordId(final Long logRecordId) { + this.logRecordId = logRecordId; + } + + public void setLoginUserName(final String loginUserName) { + this.loginUserName = loginUserName; + } + + public void setLoginUserPhone(final String loginUserPhone) { + this.loginUserPhone = loginUserPhone; + } + + public void setLoginUserPhoneSuffix(final String loginUserPhoneSuffix) { + this.loginUserPhoneSuffix = loginUserPhoneSuffix; + } + + public void setLoginIp(final String loginIp) { + this.loginIp = loginIp; + } + + public void setRequestUri(final String requestUri) { + this.requestUri = requestUri; + } + + public void setOperateFunc(final String operateFunc) { + this.operateFunc = operateFunc; + } + + public void setOperateType(final Integer operateType) { + this.operateType = operateType; + } + + public void setExecutionTime(final Long executionTime) { + this.executionTime = executionTime; + } + + public void setCrby(final String crby) { + this.crby = crby; + } + + public void setCrtime(final LocalDateTime crtime) { + this.crtime = crtime; + } + + public String toString() { + Long var10000 = this.getId(); + return "AllocLogRecord(id=" + var10000 + ", logRecordId=" + this.getLogRecordId() + ", loginUserName=" + this.getLoginUserName() + ", loginUserPhone=" + this.getLoginUserPhone() + ", loginUserPhoneSuffix=" + this.getLoginUserPhoneSuffix() + ", loginIp=" + this.getLoginIp() + ", requestUri=" + this.getRequestUri() + ", operateFunc=" + this.getOperateFunc() + ", operateType=" + this.getOperateType() + ", executionTime=" + this.getExecutionTime() + ", crby=" + this.getCrby() + ", crtime=" + String.valueOf(this.getCrtime()) + ")"; + } + + public AllocLogRecord() { + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/param/AllocLogRecordParam.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/param/AllocLogRecordParam.java new file mode 100644 index 00000000..334ad0ba --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/param/AllocLogRecordParam.java @@ -0,0 +1,53 @@ +package com.bonus.canteen.core.notice.hawkeye.param; + +import io.swagger.annotations.ApiModelProperty; +import com.bonus.canteen.core.common.utils.PageDTO; + +import java.time.LocalDateTime; + +public class AllocLogRecordParam extends PageDTO { + @ApiModelProperty("登录人员名称") + private String loginUserName; + @ApiModelProperty("登录人员手机号") + private String loginUserPhone; + @ApiModelProperty("时间") + private LocalDateTime crtimeStart; + private LocalDateTime crtimeEnd; + + public String getLoginUserName() { + return this.loginUserName; + } + + public String getLoginUserPhone() { + return this.loginUserPhone; + } + + public LocalDateTime getCrtimeStart() { + return this.crtimeStart; + } + + public LocalDateTime getCrtimeEnd() { + return this.crtimeEnd; + } + + public void setLoginUserName(final String loginUserName) { + this.loginUserName = loginUserName; + } + + public void setLoginUserPhone(final String loginUserPhone) { + this.loginUserPhone = loginUserPhone; + } + + public void setCrtimeStart(final LocalDateTime crtimeStart) { + this.crtimeStart = crtimeStart; + } + + public void setCrtimeEnd(final LocalDateTime crtimeEnd) { + this.crtimeEnd = crtimeEnd; + } + + public String toString() { + String var10000 = this.getLoginUserName(); + return "AllocLogRecordParam(loginUserName=" + var10000 + ", loginUserPhone=" + this.getLoginUserPhone() + ", crtimeStart=" + String.valueOf(this.getCrtimeStart()) + ", crtimeEnd=" + String.valueOf(this.getCrtimeEnd()) + ")"; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/AllocLogRecordService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/AllocLogRecordService.java new file mode 100644 index 00000000..c6a42c64 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/AllocLogRecordService.java @@ -0,0 +1,18 @@ +package com.bonus.canteen.core.notice.hawkeye.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bonus.canteen.core.notice.hawkeye.model.AllocLogRecord; +import com.bonus.canteen.core.notice.hawkeye.param.AllocLogRecordParam; + +public interface AllocLogRecordService extends IService { + Page pageLogRecord(AllocLogRecordParam param); + + void saveLogRecord(AllocLogRecord logRecord); + + void saveLogRecordForCustom(AllocLogRecord logRecord); + + void genLogRecordExcelFile(AllocLogRecordParam param); + + String getExcelFileUrl(); +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/impl/AllocLogRecordServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/impl/AllocLogRecordServiceImpl.java new file mode 100644 index 00000000..3d192553 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/service/impl/AllocLogRecordServiceImpl.java @@ -0,0 +1,236 @@ +package com.bonus.canteen.core.notice.hawkeye.service.impl; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.DesensitizedUtil.DesensitizedType; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.pig4cloud.pigx.common.core.exception.LeException; +import com.pig4cloud.pigx.common.core.util.LeBeanUtil; +import com.pig4cloud.pigx.common.oss.OssProperties; +import com.pig4cloud.pigx.common.oss.service.OssTemplate; +import jakarta.servlet.http.HttpServletRequest; +import net.xnzn.core.auth.api.MgrUserApi; +import net.xnzn.core.common.constant.FileConstants; +import net.xnzn.core.common.encrypt.SM4EncryptUtils; +import net.xnzn.core.common.enums.FileUploadSourceEnum; +import net.xnzn.core.common.redis.RedisUtil; +import net.xnzn.core.common.utils.AesEncryptUtil; +import net.xnzn.core.common.utils.SysUtil; +import net.xnzn.core.notice.hawkeye.mapper.AllocLogRecordMapper; +import net.xnzn.core.notice.hawkeye.model.AllocLogRecord; +import net.xnzn.core.notice.hawkeye.param.AllocLogRecordParam; +import net.xnzn.core.notice.hawkeye.service.AllocLogRecordService; +import net.xnzn.framework.config.i18n.I18n; +import net.xnzn.framework.data.dataset.Executors; +import net.xnzn.framework.data.tenant.TenantContextHolder; +import net.xnzn.framework.id.Id; +import net.xnzn.framework.secure.SecureManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Objects; + +@Service +public class AllocLogRecordServiceImpl extends ServiceImpl implements AllocLogRecordService { + private static final Logger log = LoggerFactory.getLogger(AllocLogRecordServiceImpl.class); + @Autowired + @Lazy + private MgrUserApi mgrUserApi; + @Autowired + private OssProperties ossProperties; + @Autowired + private OssTemplate ossTemplate; + @Autowired + private AesEncryptUtil aesEncryptUtil; + private static final String GEN_LOG_EXCEL_KEY = "yst:merchantId:userId:gen:allocLog:excel"; + private static final String DOWNLOAD_LOG_EXCEL_URL_KEY = "yst:merchantId:userId:download:allocLog:excel:url"; + private static final String USER_ID = "user_id"; + + public Page pageLogRecord(AllocLogRecordParam param) { + param.setLoginUserName(LeBeanUtil.fieldLikeHandle(param.getLoginUserName())); + Page page = new Page(param.getCurrent(), param.getSize()); + Page recordPage = ((AllocLogRecordMapper)this.baseMapper).pageLogRecord(page, param); + recordPage.getRecords().forEach((allocLogRecord) -> { + allocLogRecord.setLoginUserPhone(SM4EncryptUtils.desensitizedByConfig(allocLogRecord.getLoginUserPhone(), DesensitizedType.MOBILE_PHONE)); + }); + return recordPage; + } + + public void saveLogRecord(AllocLogRecord logRecord) { + if (!"admin".equals(logRecord.getLoginUserName())) { + if (ObjectUtil.isNotNull(logRecord.getLogRecordId())) { + logRecord.setLoginUserPhone(this.mgrUserApi.getPhoneByUserId(logRecord.getLogRecordId())); + if (ObjectUtil.isNotEmpty(logRecord.getLoginUserPhone())) { + logRecord.setLoginUserPhoneSuffix(logRecord.getLoginUserPhone().substring(logRecord.getLoginUserPhone().length() - 4)); + } + } + + logRecord.setLogRecordId(Id.next()); + ((AllocLogRecordMapper)this.baseMapper).insert(logRecord); + } + } + + public void saveLogRecordForCustom(AllocLogRecord logRecord) { + HttpServletRequest request = ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + logRecord.setLoginIp(JakartaServletUtil.getClientIP(request, new String[0])); + logRecord.setCrby(logRecord.getLoginUserName()); + logRecord.setCrtime(LocalDateTime.now()); + this.saveLogRecord(logRecord); + } + + public void genLogRecordExcelFile(AllocLogRecordParam param) { + Long userId = (Long)SecureManager.getSubjectId().get(); + Long merchantId = TenantContextHolder.getTenantId(); + String key = "yst:merchantId:userId:gen:allocLog:excel".replace("merchantId", merchantId.toString()).replace("user_id", userId.toString()); + String downLoadKey = "yst:merchantId:userId:download:allocLog:excel:url".replace("merchantId", merchantId.toString()).replace("user_id", userId.toString()); + if (ObjectUtil.isNotEmpty(RedisUtil.getString(key))) { + throw new LeException(I18n.getMessage("notice_alloc_log_record_gen_excel_file_wait_exception", new Object[0])); + } else if (ObjectUtil.isNotEmpty(RedisUtil.getString(downLoadKey))) { + throw new LeException(I18n.getMessage("notice_alloc_log_record_gen_excel_file_done_exception", new Object[0])); + } else { + RedisUtil.setString(key, "user_id"); + Executors.doInTenant(merchantId, (status) -> { + int maxSize = 10000; + ExcelWriter excelWriter = null; + + try { + param.setLoginUserName(LeBeanUtil.fieldLikeHandle(param.getLoginUserName())); + List records = ((AllocLogRecordMapper)this.baseMapper).listLogRecord(param); + if (!ObjectUtil.isEmpty(records)) { + List> lists = Lists.partition(records, maxSize); + String fileName = this.getFileNameByParam(param); + String var10000 = FileConstants.tempPath; + String filePath = var10000 + TenantContextHolder.getTenantId() + File.separator + "logExcel"; + File path = new File(filePath); + if (!path.exists()) { + path.mkdirs(); + } + + String fullFileName = filePath + File.separator + fileName; + log.info("本地excel文件路径:{}", fullFileName); + File excelFile = FileUtil.file(fullFileName); + OutputStream os = FileUtil.getOutputStream(excelFile); + + try { + excelWriter = EasyExcel.write(os, AllocLogRecord.class).build(); + int i = 0; + + while(true) { + if (i >= lists.size()) { + excelWriter.finish(); + break; + } + + WriteSheet writeSheet = EasyExcel.writerSheet(i, "日志明细" + (i + 1)).build(); + List data = (List)lists.get(i); + excelWriter.write(data, writeSheet); + ++i; + } + } catch (Throwable var29) { + if (os != null) { + try { + os.close(); + } catch (Throwable var27) { + var29.addSuppressed(var27); + } + } + + throw var29; + } + + if (os != null) { + os.close(); + } + + Long var34 = TenantContextHolder.getTenantId(); + String objectName = "" + var34 + "/" + FileUploadSourceEnum.CUST.key() + "/" + fileName; + String bucketName = this.ossProperties.getBucketName(); + InputStream inputStream = FileUtil.getInputStream(excelFile); + + try { + this.ossTemplate.putObject(bucketName, objectName, inputStream); + } catch (Throwable var28) { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Throwable var26) { + var28.addSuppressed(var26); + } + } + + throw var28; + } + + if (inputStream != null) { + inputStream.close(); + } + + FileUtil.del(excelFile); + RedisUtil.setObj(downLoadKey, SysUtil.getCutFileUrl("/" + bucketName + "/" + objectName)); + log.info("系统日志导出生成结束"); + return; + } + } catch (Exception var30) { + log.info("生成日志导出文件错误:{}", var30.getMessage(), var30); + return; + } finally { + RedisUtil.delete(key); + } + + }); + } + } + + private String getFileNameByParam(AllocLogRecordParam param) { + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + StringBuilder sb = new StringBuilder("日志明细"); + if (ObjectUtil.isNotEmpty(param.getLoginUserName())) { + sb.append("_").append(param.getLoginUserName()); + } + + if (ObjectUtil.isNotEmpty(param.getLoginUserPhone())) { + sb.append("_").append(param.getLoginUserPhone()); + } + + if (ObjectUtil.isNotEmpty(param.getCrtimeStart())) { + sb.append("_").append(param.getCrtimeStart().format(df)); + } + + if (ObjectUtil.isNotEmpty(param.getCrtimeEnd())) { + sb.append("_").append(param.getCrtimeEnd().format(df)); + } + + sb.append("_").append(LocalDateTime.now().format(df)); + sb.append(".xlsx"); + return sb.toString(); + } + + public String getExcelFileUrl() { + Long userId = (Long)SecureManager.getSubjectId().get(); + String key = "yst:merchantId:userId:download:allocLog:excel:url".replace("merchantId", TenantContextHolder.getTenantId().toString()).replace("user_id", userId.toString()); + Object fileUrl = RedisUtil.getObj(key); + if (ObjectUtil.isEmpty(fileUrl)) { + throw new LeException(I18n.getMessage("notice_alloc_log_record_get_excel_empty_url_exception", new Object[0])); + } else { + RedisUtil.delete(key); + return (String)fileUrl; + } + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/util/LocalDateTimeConverter.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/util/LocalDateTimeConverter.java new file mode 100644 index 00000000..cb1ab01d --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/notice/hawkeye/util/LocalDateTimeConverter.java @@ -0,0 +1,35 @@ +package com.bonus.canteen.core.notice.hawkeye.util; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Objects; + +public class LocalDateTimeConverter implements Converter { + public Class supportJavaTypeKey() { + return LocalDateTime.class; + } + + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + public LocalDateTime convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return null; + } + + public WriteCellData convertToExcelData(LocalDateTime localDateTime, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (Objects.isNull(localDateTime)) { + return new WriteCellData(""); + } else { + String dateStr = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + return new WriteCellData(dateStr); + } + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/secure/PmsCache.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/secure/PmsCache.java index 3300fdc7..75dc2068 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/secure/PmsCache.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/secure/PmsCache.java @@ -1,40 +1,40 @@ -package com.bonus.canteen.core.secure; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import java.time.Instant; -import java.util.Set; - -public class PmsCache { - private long expireTime; - private Set pms; - - @JsonIgnore - public boolean isExpired() { - return Instant.now().getEpochSecond() > this.expireTime; - } - - public long getExpireTime() { - return this.expireTime; - } - - public Set getPms() { - return this.pms; - } - - public void setExpireTime(final long expireTime) { - this.expireTime = expireTime; - } - - public void setPms(final Set pms) { - this.pms = pms; - } - - public PmsCache(final long expireTime, final Set pms) { - this.expireTime = expireTime; - this.pms = pms; - } - - public PmsCache() { - } -} +//package com.bonus.canteen.core.secure; +// +//import com.fasterxml.jackson.annotation.JsonIgnore; +// +//import java.time.Instant; +//import java.util.Set; +// +//public class PmsCache { +// private long expireTime; +// private Set pms; +// +// @JsonIgnore +// public boolean isExpired() { +// return Instant.now().getEpochSecond() > this.expireTime; +// } +// +// public long getExpireTime() { +// return this.expireTime; +// } +// +// public Set getPms() { +// return this.pms; +// } +// +// public void setExpireTime(final long expireTime) { +// this.expireTime = expireTime; +// } +// +// public void setPms(final Set pms) { +// this.pms = pms; +// } +// +// public PmsCache(final long expireTime, final Set pms) { +// this.expireTime = expireTime; +// this.pms = pms; +// } +// +// public PmsCache() { +// } +//} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/starter/threadpool/CleanTenantIdTaskDecorator.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/starter/threadpool/CleanTenantIdTaskDecorator.java index ebcd5062..be5d363c 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/starter/threadpool/CleanTenantIdTaskDecorator.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/starter/threadpool/CleanTenantIdTaskDecorator.java @@ -1,7 +1,7 @@ package com.bonus.canteen.core.starter.threadpool; import com.bonus.canteen.core.common.utils.TenantContextHolder; -import com.bonus.canteen.core.config.WebContext; +import com.bonus.common.houqin.framework.secure.WebContext; import com.bonus.canteen.core.dataset.rule.RoutingRule; import com.github.pagehelper.PageHelper; import org.slf4j.Logger; diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserInSystemMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserInSystemMapper.xml new file mode 100644 index 00000000..48349e90 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserInSystemMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserRoleMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserRoleMapper.xml new file mode 100644 index 00000000..c7f26e79 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/auth/MgrUserRoleMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + UPDATE mgr_user_role ur , mgr_role r + SET ur.if_default = #{ifDefault} + WHERE ur.user_id = #{userId} + AND ur.role_id = r.role_id + AND r.role_code = #{roleCode} + + + +