|
|
|
@ -23,12 +23,14 @@ import cc.hiver.core.vo.PermissionDTO; |
|
|
|
import cc.hiver.core.vo.RoleDTO; |
|
|
|
import cn.hutool.core.text.CharSequenceUtil; |
|
|
|
import cn.hutool.core.util.IdUtil; |
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper; |
|
|
|
import com.google.gson.Gson; |
|
|
|
import com.google.gson.GsonBuilder; |
|
|
|
import com.google.gson.reflect.TypeToken; |
|
|
|
import io.jsonwebtoken.Jwts; |
|
|
|
import io.jsonwebtoken.SignatureAlgorithm; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.data.redis.core.RedisTemplate; |
|
|
|
import org.springframework.security.authentication.AnonymousAuthenticationToken; |
|
|
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
|
|
|
import org.springframework.security.core.Authentication; |
|
|
|
@ -38,10 +40,7 @@ import org.springframework.security.core.context.SecurityContextHolder; |
|
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Date; |
|
|
|
import java.util.LinkedHashSet; |
|
|
|
import java.util.List; |
|
|
|
import java.util.*; |
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
@ -77,7 +76,10 @@ public class SecurityUtil { |
|
|
|
private MemberDao memberDao; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RedisTemplateHelper redisTemplate; |
|
|
|
private RedisTemplateHelper redisTemplateHelper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RedisTemplate<String, Object> redisTemplate; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private WorkerDao workerDao; |
|
|
|
@ -88,6 +90,9 @@ public class SecurityUtil { |
|
|
|
@Autowired |
|
|
|
private LogisticsUserService logisticsUserService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private ObjectMapper objectMapper; |
|
|
|
|
|
|
|
/** |
|
|
|
* -------------------ToB------------------------- |
|
|
|
*/ |
|
|
|
@ -95,7 +100,7 @@ public class SecurityUtil { |
|
|
|
public User findUserByUsername(String username) { |
|
|
|
final String key = "username::" + username; |
|
|
|
// 读取缓存
|
|
|
|
final String res = redisTemplate.get(key); |
|
|
|
final String res = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(res)) { |
|
|
|
final Gson oldUser = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create(); |
|
|
|
return userToDTO(oldUser.fromJson(res, User.class)); |
|
|
|
@ -103,30 +108,34 @@ public class SecurityUtil { |
|
|
|
final User user = userToDTO(userDao.findByUsername(username)); |
|
|
|
// 缓存
|
|
|
|
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create(); |
|
|
|
redisTemplate.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
return user; |
|
|
|
} |
|
|
|
|
|
|
|
public Worker findWorkerByUsername(String username) { |
|
|
|
final String key = "workername::" + username; |
|
|
|
// 读取缓存
|
|
|
|
final String res = redisTemplate.get(key); |
|
|
|
final String res = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(res)) { |
|
|
|
return new Gson().fromJson(res, Worker.class); |
|
|
|
} |
|
|
|
final Worker worker = workerDao.findByUsername(username); |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(key, new Gson().toJson(worker), 15L, TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, new Gson().toJson(worker), 15L, TimeUnit.DAYS); |
|
|
|
return worker; |
|
|
|
} |
|
|
|
|
|
|
|
public LogiticsCompany findCompanyByUsername(String username) { |
|
|
|
final String key = "companyName::" + username; |
|
|
|
// 读取缓存
|
|
|
|
final String res = redisTemplate.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(res)) { |
|
|
|
return new Gson().fromJson(res, LogiticsCompany.class); |
|
|
|
} |
|
|
|
// 直接使用 RedisTemplate 获取对象,不要手动反序列化
|
|
|
|
Object value = redisTemplate.opsForValue().get(key); |
|
|
|
if (value instanceof LinkedHashMap) { |
|
|
|
return objectMapper.convertValue(value, LogiticsCompany.class); |
|
|
|
} |
|
|
|
/*LogiticsCompany company = (LogiticsCompany) redisTemplate.opsForValue().get(key); |
|
|
|
if (company != null) { |
|
|
|
return company; |
|
|
|
}*/ |
|
|
|
LogiticsCompany logiticsCompany = logiticsCompanyDao.findByUsername(username); |
|
|
|
// 如果没有获取到,那么去搜索公司员工信息
|
|
|
|
if (logiticsCompany == null ) { |
|
|
|
@ -145,7 +154,8 @@ public class SecurityUtil { |
|
|
|
} |
|
|
|
} |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(key, new Gson().toJson(logiticsCompany), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
// redisTemplate.set(key, logiticsCompany, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
|
|
|
|
redisTemplate.opsForValue().set(key, logiticsCompany, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
return logiticsCompany; |
|
|
|
} |
|
|
|
|
|
|
|
@ -294,41 +304,41 @@ public class SecurityUtil { |
|
|
|
tokenUser = new TokenUser(user, tokenProperties.getStorePerms(), saved); |
|
|
|
// 单设备登录 之前的token失效
|
|
|
|
if (tokenProperties.getSdl()) { |
|
|
|
final String oldToken = redisTemplate.get(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType()); |
|
|
|
final String oldToken = redisTemplateHelper.get(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType()); |
|
|
|
if (CharSequenceUtil.isNotBlank(oldToken)) { |
|
|
|
redisTemplate.delete(SecurityConstant.TOKEN_PRE + oldToken); |
|
|
|
redisTemplateHelper.delete(SecurityConstant.TOKEN_PRE + oldToken); |
|
|
|
final String userTokenKey = SecurityConstant.TOKEN_PRE + oldToken; |
|
|
|
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + oldToken + "type:"; |
|
|
|
redisTemplate.delete(userTokenKey); |
|
|
|
redisTemplate.delete(userTypeKey); |
|
|
|
redisTemplateHelper.delete(userTokenKey); |
|
|
|
redisTemplateHelper.delete(userTypeKey); |
|
|
|
// 店铺及商圈
|
|
|
|
final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + oldToken + "shopId:"; |
|
|
|
final String regionKey = SecurityConstant.TOKEN_REGION + oldToken + "region:"; |
|
|
|
redisTemplate.delete(shopIdKey); |
|
|
|
redisTemplate.delete(regionKey); |
|
|
|
redisTemplateHelper.delete(shopIdKey); |
|
|
|
redisTemplateHelper.delete(regionKey); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
// 是否记住账号/保存登录
|
|
|
|
if (saved) { |
|
|
|
redisTemplate.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplate.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
// 保存当前登录用户的角色
|
|
|
|
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:"; |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(userTypeKey, user.getType(), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(userTypeKey, user.getType(), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
} else { |
|
|
|
redisTemplate.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); |
|
|
|
redisTemplate.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); |
|
|
|
redisTemplateHelper.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); |
|
|
|
redisTemplateHelper.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); |
|
|
|
// 保存当前登录用户的角色
|
|
|
|
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:"; |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(userTypeKey, user.getType(), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); |
|
|
|
redisTemplateHelper.set(userTypeKey, user.getType(), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); |
|
|
|
} |
|
|
|
// 更新当前登录人的角色
|
|
|
|
final String key = "username::" + user.getUsername(); |
|
|
|
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create(); |
|
|
|
redisTemplate.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
} else { |
|
|
|
// JWT 不缓存权限 避免JWT长度过长
|
|
|
|
tokenUser = new TokenUser(user, false, null); |
|
|
|
@ -378,8 +388,8 @@ public class SecurityUtil { |
|
|
|
public LogiticsCompany getCurrCompany() { |
|
|
|
final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
|
|
|
|
|
|
|
boolean authenticated = authentication.isAuthenticated(); |
|
|
|
String name = authentication.getName(); |
|
|
|
final boolean authenticated = authentication.isAuthenticated(); |
|
|
|
final String name = authentication.getName(); |
|
|
|
if (authentication == null || !authentication.isAuthenticated() || authentication.getName() == null |
|
|
|
|| authentication instanceof AnonymousAuthenticationToken) { |
|
|
|
throw new HiverException("未检测到登录用户"); |
|
|
|
@ -427,7 +437,7 @@ public class SecurityUtil { |
|
|
|
final User u = getCurrUserSimple(); |
|
|
|
// 读取缓存
|
|
|
|
final String key = "userRole::depIds:" + u.getId(); |
|
|
|
final String v = redisTemplate.get(key); |
|
|
|
final String v = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(v)) { |
|
|
|
deparmentIds = new Gson().fromJson(v, new TypeToken<List<String>>() { |
|
|
|
}.getType()); |
|
|
|
@ -487,7 +497,7 @@ public class SecurityUtil { |
|
|
|
deparmentIds.clear(); |
|
|
|
deparmentIds.addAll(set); |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(key, new Gson().toJson(deparmentIds), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, new Gson().toJson(deparmentIds), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
return deparmentIds; |
|
|
|
} |
|
|
|
|
|
|
|
@ -532,13 +542,13 @@ public class SecurityUtil { |
|
|
|
public Member findMemberByMobile(String mobile) { |
|
|
|
final String key = "member::" + mobile; |
|
|
|
// 读取缓存
|
|
|
|
final String res = redisTemplate.get(key); |
|
|
|
final String res = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(res)) { |
|
|
|
return new Gson().fromJson(res, Member.class); |
|
|
|
} |
|
|
|
final Member member = memberDao.findByMobile(mobile); |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(key, new Gson().toJson(member), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, new Gson().toJson(member), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
return member; |
|
|
|
} |
|
|
|
|
|
|
|
@ -567,13 +577,13 @@ public class SecurityUtil { |
|
|
|
final String key = SecurityConstant.MEMBER_TOKEN + tokenMember.getUsername() + ':' + platform; |
|
|
|
// 单平台登录 之前的token失效
|
|
|
|
if (appTokenProperties.getSpl()) { |
|
|
|
final String oldToken = redisTemplate.get(key); |
|
|
|
final String oldToken = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(oldToken)) { |
|
|
|
redisTemplate.delete(SecurityConstant.TOKEN_MEMBER_PRE + oldToken); |
|
|
|
redisTemplateHelper.delete(SecurityConstant.TOKEN_MEMBER_PRE + oldToken); |
|
|
|
} |
|
|
|
} |
|
|
|
redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplate.set(SecurityConstant.TOKEN_MEMBER_PRE + token, new Gson().toJson(tokenMember), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(SecurityConstant.TOKEN_MEMBER_PRE + token, new Gson().toJson(tokenMember), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
} else { |
|
|
|
// JWT
|
|
|
|
tokenMember = new TokenMember(member, platform); |
|
|
|
@ -651,13 +661,13 @@ public class SecurityUtil { |
|
|
|
final String key = SecurityConstant.WORKER_TOKEN + tokenWorker.getWorkerId() + ':' + tokenWorker.getWorkerName(); |
|
|
|
// 单平台登录 之前的token失效
|
|
|
|
if (appTokenProperties.getSpl()) { |
|
|
|
final String oldToken = redisTemplate.get(key); |
|
|
|
final String oldToken = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(oldToken)) { |
|
|
|
redisTemplate.delete(SecurityConstant.TOKEN_WORKER_PRE + oldToken); |
|
|
|
redisTemplateHelper.delete(SecurityConstant.TOKEN_WORKER_PRE + oldToken); |
|
|
|
} |
|
|
|
} |
|
|
|
redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplate.set(SecurityConstant.TOKEN_WORKER_PRE + token, new Gson().toJson(tokenWorker), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(SecurityConstant.TOKEN_WORKER_PRE + token, new Gson().toJson(tokenWorker), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
} else { |
|
|
|
// JWT
|
|
|
|
tokenWorker = new TokenWorker(worker, saved); |
|
|
|
@ -719,13 +729,13 @@ public class SecurityUtil { |
|
|
|
final String key = SecurityConstant.COMPANY_TOKEN + tokenCompany.getId() + ':' + tokenCompany.getCompanyName(); |
|
|
|
// 单平台登录 之前的token失效
|
|
|
|
if (appTokenProperties.getSpl()) { |
|
|
|
final String oldToken = redisTemplate.get(key); |
|
|
|
final String oldToken = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(oldToken)) { |
|
|
|
redisTemplate.delete(SecurityConstant.TOKEN_COMPANY_PRE + oldToken); |
|
|
|
redisTemplateHelper.delete(SecurityConstant.TOKEN_COMPANY_PRE + oldToken); |
|
|
|
} |
|
|
|
} |
|
|
|
redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplate.set(SecurityConstant.TOKEN_COMPANY_PRE + token, new Gson().toJson(tokenCompany), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(SecurityConstant.TOKEN_COMPANY_PRE + token, new Gson().toJson(tokenCompany), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); |
|
|
|
} else { |
|
|
|
// JWT
|
|
|
|
tokenCompany = new TokenCompany(logiticsCompany, saved); |
|
|
|
@ -756,13 +766,13 @@ public class SecurityUtil { |
|
|
|
public User findByUserNameAndType(String username, String type) { |
|
|
|
final String key = "username::" + username + "type:" + type; |
|
|
|
// 读取缓存
|
|
|
|
final String res = redisTemplate.get(key); |
|
|
|
final String res = redisTemplateHelper.get(key); |
|
|
|
if (CharSequenceUtil.isNotBlank(res)) { |
|
|
|
return userToDTO(new Gson().fromJson(res, User.class)); |
|
|
|
} |
|
|
|
final User user = userToDTO(userDao.findByUserNameAndType(username, type)); |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(key, new Gson().toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(key, new Gson().toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
return user; |
|
|
|
} |
|
|
|
|
|
|
|
@ -770,8 +780,8 @@ public class SecurityUtil { |
|
|
|
final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + token + "shopId:"; |
|
|
|
final String regionKey = SecurityConstant.TOKEN_REGION + token + "region:"; |
|
|
|
// 缓存
|
|
|
|
redisTemplate.set(shopIdKey, shopId, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplate.set(regionKey, region, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(shopIdKey, shopId, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
redisTemplateHelper.set(regionKey, region, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); |
|
|
|
} |
|
|
|
|
|
|
|
public String getShopId() { |
|
|
|
@ -779,9 +789,9 @@ public class SecurityUtil { |
|
|
|
// 获取请求token
|
|
|
|
// 从缓存中获取当前用户的shopId
|
|
|
|
final String tokenKey = SecurityConstant.USER_TOKEN + u.getUsername() + "type:" + u.getType(); |
|
|
|
final String token = redisTemplate.get(tokenKey); |
|
|
|
final String token = redisTemplateHelper.get(tokenKey); |
|
|
|
final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + token + "shopId:"; |
|
|
|
final String shopId = redisTemplate.get(shopIdKey); |
|
|
|
final String shopId = redisTemplateHelper.get(shopIdKey); |
|
|
|
return shopId; |
|
|
|
} |
|
|
|
|
|
|
|
@ -790,16 +800,16 @@ public class SecurityUtil { |
|
|
|
// 获取请求token
|
|
|
|
// 从缓存中获取当前用户的shopId
|
|
|
|
final String tokenKey = SecurityConstant.USER_TOKEN + u.getUsername() + "type:" + u.getType(); |
|
|
|
final String token = redisTemplate.get(tokenKey); |
|
|
|
final String token = redisTemplateHelper.get(tokenKey); |
|
|
|
final String regionKey = SecurityConstant.TOKEN_REGION + token + "region:"; |
|
|
|
final String region = redisTemplate.get(regionKey); |
|
|
|
final String region = redisTemplateHelper.get(regionKey); |
|
|
|
return region; |
|
|
|
} |
|
|
|
|
|
|
|
public String getLoginUserType(String token) { |
|
|
|
// 保存当前登录用户的角色
|
|
|
|
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:"; |
|
|
|
final String userType = redisTemplate.get(userTypeKey); |
|
|
|
final String userType = redisTemplateHelper.get(userTypeKey); |
|
|
|
return userType; |
|
|
|
} |
|
|
|
} |
|
|
|
|