Эх сурвалжийг харах

gateway 添加 OPENID 检索 TOKEN

lutong 1 сар өмнө
parent
commit
97f8ada0d1

+ 40 - 15
alien-gateway/src/main/java/shop/alien/gateway/config/JwtTokenFilter.java

@@ -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);
                         }
                     }