qrs 1 месяц назад
Родитель
Сommit
6b2dd792c2

+ 5 - 5
alien-gateway/pom.xml

@@ -164,11 +164,11 @@
         </dependency>
 
 
-<!--        <dependency>-->
-<!--            <groupId>shop.alien</groupId>-->
-<!--            <artifactId>alien-util</artifactId>-->
-<!--            <version>1.0.0</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>shop.alien</groupId>
+            <artifactId>alien-util</artifactId>
+            <version>1.0.0</version>
+        </dependency>
 
         <dependency>
             <groupId>shop.alien</groupId>

+ 59 - 3
alien-gateway/src/main/java/shop/alien/gateway/config/JwtTokenFilter.java

@@ -2,10 +2,13 @@ package shop.alien.gateway.config;
 
 import com.alibaba.cloud.commons.lang.StringUtils;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.ExpiredJwtException;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
 import org.springframework.cloud.gateway.filter.GlobalFilter;
@@ -17,7 +20,12 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.gateway.mapper.StoreUserMapper;
+import shop.alien.util.common.JwtUtil;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -38,6 +46,12 @@ public class JwtTokenFilter implements GlobalFilter, Ordered {
     @Value("${jwt.skip-auth-urls}")
     private String[] skipAuthUrls;
 
+    @Autowired
+    private BaseRedisService baseRedisService;
+
+    @Autowired
+    private StoreUserMapper storeUserMapper;
+
     /**
      * 过滤器
      *
@@ -48,14 +62,24 @@ public class JwtTokenFilter implements GlobalFilter, Ordered {
     @Override
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
         String url = exchange.getRequest().getURI().getPath();
+        log.info("====================>path: " + url);
+//        if (url.startsWith("second/") || url.startsWith("store/")) {
+//            url = url.substring(url.indexOf("/"), url.length() + 1);
+//        }
         //跳过不需要验证的路径
         if (null != skipAuthUrls && Arrays.asList(skipAuthUrls).contains(url)) {
             return chain.filter(exchange);
         }
-        Map<String, Object> map = new HashMap<>();
-        int errorType = 0;
+        if (url.startsWith("/store/webjars") || url.startsWith("/second/webjars")) {
+            return chain.filter(exchange);
+        }
+
         //获取token
         String token = exchange.getRequest().getHeaders().getFirst("Authorization");
+        log.info("====================>token值: " + token);
+
+        JSONObject map = new JSONObject();
+        int errorType = 0;
         ServerHttpResponse resp = exchange.getResponse();
         if (StringUtils.isBlank(token)) {
             //没有token
@@ -65,7 +89,39 @@ public class JwtTokenFilter implements GlobalFilter, Ordered {
             try {
                 JwtUtil.checkToken(token);
                 Claims claims = JwtUtil.parseJWT(token);
-                JSONObject js = JSONObject.parseObject(claims.get("sub").toString());
+                JSONObject tokenData = JSONObject.parseObject(claims.get("sub").toString());
+                String deviceType = tokenData.getString("userType");
+                String phone = tokenData.getString("phone");
+                String redisKey;
+                //区分
+                if ("web".equals(deviceType)) {
+                    //管理端单设备登录
+//                redisKey = deviceType + "_" + tokenInfo.getClaim("userName").asString();
+                    //不限制
+                    return chain.filter(exchange);
+                } else {
+                    redisKey = deviceType + "_" + phone;
+                }
+                String redisVal = baseRedisService.getString(redisKey);
+                if (StringUtils.isEmpty(redisVal) || !token.equals(redisVal)) {
+                    //判断程序是否为用户禁用
+                    StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getPhone, phone));
+                    if (storeUser.getStatus() == 1) {
+                        map.put("msg", "你的账号已被禁用");
+                        //别问, 问就是约定俗成
+                        map.put("code", 777);
+                    } else {
+                        map.put("msg", "用户在别处登录");
+                        //别问, 问就是约定俗成
+                        map.put("code", 666);
+                    }
+
+                    map.put("success", false);
+                    return exchange.getResponse()
+                            .writeWith(Mono.just(exchange.getResponse()
+                                    .bufferFactory()
+                                    .wrap(map.toJSONString().getBytes())));
+                }
                 return chain.filter(exchange);
             } catch (ExpiredJwtException e) {
                 if (e.getMessage().contains("Allowed clock skew")) {

+ 1 - 1
alien-gateway/src/main/java/shop/alien/gateway/service/LifeUserService.java

@@ -10,8 +10,8 @@ import org.springframework.stereotype.Service;
 import shop.alien.entity.store.LifeUser;
 import shop.alien.entity.store.vo.LifeUserVo;
 import shop.alien.gateway.config.BaseRedisService;
-import shop.alien.gateway.config.JwtUtil;
 import shop.alien.gateway.mapper.LifeUserMapper;
+import shop.alien.util.common.JwtUtil;
 
 import java.util.Date;
 import java.util.HashMap;

+ 1 - 1
alien-gateway/src/main/java/shop/alien/gateway/service/impl/StoreUserServiceImpl.java

@@ -12,10 +12,10 @@ import shop.alien.entity.store.StoreInfo;
 import shop.alien.entity.store.StoreUser;
 import shop.alien.entity.store.vo.StoreUserVo;
 import shop.alien.gateway.config.BaseRedisService;
-import shop.alien.gateway.config.JwtUtil;
 import shop.alien.gateway.mapper.StoreInfoMapper;
 import shop.alien.gateway.mapper.StoreUserMapper;
 import shop.alien.gateway.service.StoreUserService;
+import shop.alien.util.common.JwtUtil;
 
 import java.util.HashMap;
 import java.util.Map;

+ 10 - 4
alien-util/pom.xml

@@ -27,10 +27,10 @@
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-web</artifactId>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>org.projectlombok</groupId>
@@ -305,6 +305,12 @@
             <artifactId>spring-boot-starter-webflux</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 10 - 1
alien-gateway/src/main/java/shop/alien/gateway/config/JwtUtil.java → alien-util/src/main/java/shop/alien/util/common/JwtUtil.java

@@ -1,5 +1,6 @@
-package shop.alien.gateway.config;
+package shop.alien.util.common;
 
+import com.alibaba.fastjson.JSONObject;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.JwtBuilder;
 import io.jsonwebtoken.Jwts;
@@ -106,4 +107,12 @@ public class JwtUtil {
 //        }
         return true;
     }
+
+    /**
+     * 获取token信息
+     */
+    public static JSONObject getTokenInfo(String token) {
+        Claims claims = JwtUtil.parseJWT(token);
+        return JSONObject.parseObject(claims.get("sub").toString());
+    }
 }