|
|
@@ -113,16 +113,35 @@ public class JwtTokenFilter implements GlobalFilter, Ordered {
|
|
|
JSONObject tokenData = JSONObject.parseObject(claims.get("sub").toString());
|
|
|
String deviceType = tokenData.getString("userType");
|
|
|
String phone = tokenData.getString("phone");
|
|
|
+ String openid = tokenData.getString("openid");
|
|
|
String redisKey;
|
|
|
+ String redisVal = null;
|
|
|
//区分
|
|
|
if ("web".equals(deviceType)) {
|
|
|
//管理端单设备登录
|
|
|
//不限制
|
|
|
return allowChain(exchange, chain);
|
|
|
+ } else if ("user".equals(deviceType) || "miniprogram_user".equals(deviceType)) {
|
|
|
+ // 用户/小程序:兼容 openid(点餐小程序存 miniprogram_user_token:{openid})与手机号(miniprogram_user_{phone} / user_{phone})
|
|
|
+ List<String> candidateKeys = new ArrayList<>();
|
|
|
+ if (StringUtils.isNotBlank(openid)) {
|
|
|
+ candidateKeys.add("miniprogram_user_token:" + openid);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(phone)) {
|
|
|
+ candidateKeys.add("miniprogram_user_" + phone);
|
|
|
+ candidateKeys.add("user_" + phone);
|
|
|
+ }
|
|
|
+ for (String key : candidateKeys) {
|
|
|
+ String val = baseRedisService.getString(key);
|
|
|
+ if (StringUtils.isNotBlank(val) && token.equals(val)) {
|
|
|
+ redisVal = val;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
} else {
|
|
|
redisKey = deviceType + "_" + phone;
|
|
|
+ redisVal = baseRedisService.getString(redisKey);
|
|
|
}
|
|
|
- String redisVal = baseRedisService.getString(redisKey);
|
|
|
if (StringUtils.isEmpty(redisVal) || !token.equals(redisVal)) {
|
|
|
if ("store".equals(deviceType) || "storePlatform".equals(deviceType)) {
|
|
|
//判断程序是否为用户禁用
|
|
|
@@ -132,37 +151,43 @@ public class JwtTokenFilter implements GlobalFilter, Ordered {
|
|
|
//别问, 问就是约定俗成
|
|
|
map.put("code", 777);
|
|
|
}
|
|
|
- if (!redisVal.equals(token)) {
|
|
|
+ if (!token.equals(redisVal)) {
|
|
|
map.put("msg", "账号在别处登录");
|
|
|
//别问, 问就是约定俗成
|
|
|
map.put("code", 666);
|
|
|
}
|
|
|
} else if ("user".equals(deviceType) || "miniprogram_user".equals(deviceType)) {
|
|
|
- //判断程序是否为用户禁用
|
|
|
- LifeUser lifeUser = lifeUserMapper.selectOne(new LambdaQueryWrapper<LifeUser>().eq(LifeUser::getUserPhone, phone));
|
|
|
- //注销标记, 0:未注销, 1:已注销
|
|
|
- if (null != lifeUser.getLogoutFlag() && lifeUser.getLogoutFlag() == 1) {
|
|
|
- map.put("msg", "你的账号已注销");
|
|
|
- //别问, 问就是约定俗成
|
|
|
- map.put("code", 777);
|
|
|
+ //判断程序是否为用户禁用/注销(支持按 userId 查,兼容无手机号的小程序用户)
|
|
|
+ LifeUser lifeUser = null;
|
|
|
+ if (StringUtils.isNotBlank(phone)) {
|
|
|
+ lifeUser = lifeUserMapper.selectOne(new LambdaQueryWrapper<LifeUser>().eq(LifeUser::getUserPhone, phone));
|
|
|
+ }
|
|
|
+ if (lifeUser == null && tokenData.containsKey("userId") && StringUtils.isNotBlank(tokenData.getString("userId"))) {
|
|
|
+ try {
|
|
|
+ lifeUser = lifeUserMapper.selectById(Integer.parseInt(tokenData.getString("userId")));
|
|
|
+ } catch (NumberFormatException ignored) { }
|
|
|
+ }
|
|
|
+ if (lifeUser != null) {
|
|
|
+ //注销标记, 0:未注销, 1:已注销
|
|
|
+ if (null != lifeUser.getLogoutFlag() && lifeUser.getLogoutFlag() == 1) {
|
|
|
+ map.put("msg", "你的账号已注销");
|
|
|
+ map.put("code", 777);
|
|
|
+ }
|
|
|
}
|
|
|
- if (!redisVal.equals(token)) {
|
|
|
+ if (!token.equals(redisVal)) {
|
|
|
map.put("msg", "账号在别处登录");
|
|
|
- //别问, 问就是约定俗成
|
|
|
map.put("code", 666);
|
|
|
}
|
|
|
} else if ("lawyer".equals(deviceType)) {
|
|
|
//判断程序是否为用户禁用
|
|
|
LawyerUser lawyerUser = lawyerUserMapper.selectOne(new LambdaQueryWrapper<LawyerUser>().eq(LawyerUser::getPhone, phone));
|
|
|
//注销标记, 0:未注销, 1:已注销
|
|
|
- if (null != lawyerUser.getLogoutFlag() && lawyerUser.getLogoutFlag() == 1) {
|
|
|
+ if (lawyerUser != null && null != lawyerUser.getLogoutFlag() && lawyerUser.getLogoutFlag() == 1) {
|
|
|
map.put("msg", "你的账号已注销");
|
|
|
- //别问, 问就是约定俗成
|
|
|
map.put("code", 777);
|
|
|
}
|
|
|
- if (!redisVal.equals(token)) {
|
|
|
+ if (!token.equals(redisVal)) {
|
|
|
map.put("msg", "账号在别处登录");
|
|
|
- //别问, 问就是约定俗成
|
|
|
map.put("code", 666);
|
|
|
}
|
|
|
}
|