From 846b8cddfeba109329f834d040161b9aec57ba9d Mon Sep 17 00:00:00 2001
From: nidapeng <jp@doumee.com>
Date: 星期四, 25 四月 2024 18:37:19 +0800
Subject: [PATCH] 最新版本

---
 server/system_gateway/src/main/java/com/doumee/config/jwt/JwtProperties.java                   |   27 ++
 server/system_gateway/src/main/java/com/doumee/config/swagger/GlobalErrorFilterConfig.java     |   14 +
 server/system_gateway/src/main/resources/application-pro.yml                                   |    6 
 server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java                   |   26 ++
 server/system_service/src/main/java/com/doumee/core/utils/UserClient.java                      |   99 +++++++++
 server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java          |    3 
 server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java                   |   33 +++
 server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                    |  154 +++++++++++++++
 server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java |   68 ++++++
 server/system_gateway/src/main/resources/application-dev.yml                                   |   29 --
 server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java        |    2 
 server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerResourceConfig.java       |    1 
 server/system_gateway/src/main/resources/application.yml                                       |   10 +
 server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java                      |   93 +++++++++
 14 files changed, 534 insertions(+), 31 deletions(-)

diff --git a/server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java b/server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java
new file mode 100644
index 0000000..fb6a95f
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java
@@ -0,0 +1,93 @@
+package com.doumee.api;
+
+import com.doumee.config.jwt.JwtProperties;
+import com.doumee.config.jwt.JwtTokenUtil;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.dao.system.dto.LoginDTO;
+import com.doumee.service.system.SystemLoginService;
+import com.doumee.service.system.SystemUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ServerWebExchange;
+
+import javax.annotation.Resource;
+
+/**
+ * JWT鑾峰彇浠ょ墝鍜屽埛鏂颁护鐗屾帴鍙�
+ */
+@RestController
+@Api("閴存潈鐧诲綍鎺ュ彛")
+public class JwtAuthController {
+
+    @Resource
+    private JwtProperties jwtProperties;
+    @Resource
+    private SystemUserService systemUserService;
+    @Resource
+    private JwtTokenUtil jwtTokenUtil;
+
+    @Autowired
+    private SystemLoginService systemLoginService;
+
+    @PreventRepeat(limit = 10, lockTime = 10000)
+    @ApiOperation("鐧诲綍")
+    @PostMapping("/login")
+    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) {
+        try {
+            ServerHttpRequest request = serverWebExchange.getRequest();
+            LoginUserInfo user = systemLoginService.loginByPasswordNew(dto,request);
+            String token = jwtTokenUtil.generateToken(user);
+            return ApiResponse.success(token);
+        }catch (BusinessException e){
+            return ApiResponse.failed(e.getCode(),e.getMessage());
+        }catch (Exception e){
+            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
+        }
+    }
+
+
+    /**
+     * 鍒锋柊JWT浠ょ墝,鐢ㄦ棫鐨勪护鐗屾崲鏂扮殑浠ょ墝
+     */
+    @PostMapping("/refreshtoken")
+    public ApiResponse<String> refreshtoken(@RequestHeader("userToken") String oldToken){
+        try {
+            if(!jwtTokenUtil.isTokenExpired(oldToken)){
+                return ApiResponse.success(jwtTokenUtil.refreshToken(oldToken));
+            }
+            return ApiResponse.failed("token宸插け鏁�");
+        }catch (BusinessException e){
+            return ApiResponse.failed(e.getCode(),e.getMessage());
+        }catch (Exception e){
+            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
+        }
+
+    }
+
+    /**
+     * 鍒锋柊JWT浠ょ墝,鐢ㄦ棫鐨勪护鐗屾崲鏂扮殑浠ょ墝
+     */
+    @GetMapping("/getUserInfo")
+    public ApiResponse<LoginUserInfo> getUserInfo(@RequestHeader("userToken") String token){
+        try {
+            LoginUserInfo user =jwtTokenUtil.getUserInfoByToken(token);
+           if(user !=null){
+               return ApiResponse.success( user);
+           }
+        }catch (BusinessException e){
+            return ApiResponse.failed(e.getCode(),e.getMessage());
+        }catch (Exception e){
+            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
+        }
+        return ApiResponse.failed( "鐧诲綍宸插け鏁�");
+    }
+
+}
\ No newline at end of file
diff --git a/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java b/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java
index 22b9424..fa3de84 100644
--- a/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java
+++ b/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java
@@ -1,5 +1,6 @@
 package com.doumee.api.meeting;
 
+import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -10,6 +11,7 @@
  */
 @RestController
 @RequestMapping("/gateway")
+@Api("娴嬭瘯鎺ュ彛")
 public class CloudBookingsController  {
 
     @GetMapping("/test")
diff --git a/server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java b/server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java
new file mode 100644
index 0000000..785748a
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java
@@ -0,0 +1,33 @@
+package com.doumee.config;
+
+import com.doumee.core.exception.BusinessException;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.io.buffer.DataBufferFactory;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+
+public class GlobalErrorFilter implements GlobalFilter {
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        return chain.filter(exchange).onErrorResume(throwable -> {
+            ServerHttpResponse response = exchange.getResponse();
+            response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
+            response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
+
+            String errorMessage = "{\"message\": \"" + throwable.getMessage() + "\"}";
+            byte[] bytes = errorMessage.getBytes(StandardCharsets.UTF_8);
+            DataBufferFactory bufferFactory = response.bufferFactory();
+            response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
+            response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
+            return response.writeWith(Mono.just(bufferFactory.wrap(bytes)));
+        });
+    }
+}
\ No newline at end of file
diff --git a/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtProperties.java b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtProperties.java
new file mode 100644
index 0000000..790d57a
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtProperties.java
@@ -0,0 +1,27 @@
+package com.doumee.config.jwt;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@ConfigurationProperties(prefix = "auth.jwt")
+@Component
+public class JwtProperties {
+
+    //鏄惁寮�鍚疛WT锛屽嵆娉ㄥ叆鐩稿叧鐨勭被瀵硅薄
+    private Boolean enabled;
+    //JWT瀵嗛挜
+    private String secret;
+    //JWT鏈夋晥鏃堕棿
+    private Long expiration;
+    //鍓嶇鍚戝悗绔紶閫扟WT鏃朵娇鐢℉TTP鐨刪eader鍚嶇О锛屽墠鍚庣瑕佺粺涓�
+    private String header;
+    //鐢ㄦ埛鐧诲綍-鐢ㄦ埛鍚嶅弬鏁板悕绉�
+    private String userParamName = "username";
+    //鐢ㄦ埛鐧诲綍-瀵嗙爜鍙傛暟鍚嶇О
+    private String pwdParamName = "password";
+    //鏄惁浣跨敤榛樿鐨凧WTAuthController
+    private Boolean useDefaultController = false;
+
+}
\ No newline at end of file
diff --git a/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
new file mode 100644
index 0000000..460b974
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -0,0 +1,154 @@
+package com.doumee.config.jwt;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.core.model.LoginUserInfo;
+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.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class JwtTokenUtil {
+
+    @Autowired
+    private RedisTemplate<String,Object> redisTemplate;
+    @Resource
+    private JwtProperties jwtProperties;
+
+
+    /**
+     * 鐢熸垚token浠ょ墝
+     *
+     * @param payloads 浠ょ墝涓惡甯︾殑闄勫姞淇℃伅
+     * @return 浠oken鐗�
+     */
+    public String generateToken( LoginUserInfo payloads) {
+        if(payloads == null){
+            return  null;
+        }
+         payloads.setLoginDate(new Date());
+        Map<String,Object> map = new HashMap<>();
+        map.put("id",payloads.getId());
+//        Map<String,Object> map =   BeanUtil.beanToMap(payloads);
+        return generateTokenDo(payloads);
+    }
+
+    /**
+     * 浠庝护鐗屼腑鑾峰彇鐢ㄦ埛鍚�
+     *
+     * @param token 浠ょ墝
+     * @return 鐢ㄦ埛鍚�
+     */
+    public String getUsernameFromToken(String token) {
+        String username;
+        try {
+            LoginUserInfo claims = getClaimsFromToken(token);
+            username = claims.getUsername();
+        } catch (Exception e) {
+            username = null;
+        }
+        return username;
+    }
+    public LoginUserInfo getUserInfoByToken(String token) {
+        try {
+            LoginUserInfo claims = getClaimsFromToken(token);
+            return claims;
+        } catch (Exception e) {
+           e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 鍒ゆ柇浠ょ墝鏄惁杩囨湡
+     *
+     * @param token 浠ょ墝
+     * @return 鏄惁杩囨湡
+     */
+    public Boolean isTokenExpired(String token) {
+        try {
+            LoginUserInfo claims = getClaimsFromToken(token);
+            Date expiration = claims.getLoginDate();
+            return expiration.before(new Date());
+        } catch (Exception e) {
+            //楠岃瘉JWT绛惧悕澶辫触绛夊悓浜庝护鐗岃繃鏈�
+            return true;
+        }
+    }
+
+    /**
+     * 鍒锋柊浠ょ墝
+     *
+     * @param token 鍘熶护鐗�
+     * @return 鏂颁护鐗�
+     */
+    public String refreshToken(String token) {
+        String refreshedToken;
+        try {
+            LoginUserInfo claims = getClaimsFromToken(token);
+            claims.setLoginDate(new Date());
+            refreshedToken = generateTokenDo(claims);
+            if(refreshedToken!=null){
+                redisTemplate.delete(token);//鍒犻櫎鑰佺殑token
+            }
+        } catch (Exception e) {
+            refreshedToken = null;
+        }
+        return refreshedToken;
+    }
+
+    /**
+     * 楠岃瘉浠ょ墝
+     *
+     * @param token       浠ょ墝
+     * @param userId  鐢ㄦ埛Id鐢ㄦ埛鍚�
+     * @return 鏄惁鏈夋晥
+     */
+    public Boolean validateToken(String token, String userId) {
+
+        String username = getUsernameFromToken(token);
+        return (username.equals(userId) && !isTokenExpired(token));
+    }
+
+
+    /**
+     * 浠巆laims鐢熸垚浠ょ墝,濡傛灉鐪嬩笉鎳傚氨鐪嬭皝璋冪敤瀹�
+     *
+     * @return 浠ょ墝
+     */
+    private String generateTokenDo(LoginUserInfo userInfo) {
+        Map<String, Object> claims = new HashMap<>();
+        claims.put("id",userInfo.getId());
+        Date expirationDate = new Date(System.currentTimeMillis() + jwtProperties.getExpiration());
+        String token = Jwts.builder().setClaims(claims)
+                .setExpiration(expirationDate)
+                .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
+                .compact();
+        redisTemplate.opsForValue().set(token,JSONObject.toJSONString(userInfo),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
+        return token;
+    }
+
+    /**
+     * 浠庝护鐗屼腑鑾峰彇鏁版嵁澹版槑,楠岃瘉JWT绛惧悕
+     *
+     * @param token 浠ょ墝
+     * @return 鏁版嵁澹版槑
+     */
+    private LoginUserInfo getClaimsFromToken(String token) {
+        LoginUserInfo claims;
+        try {
+            String userInfo = (String) redisTemplate.opsForValue().get(token);
+            claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),LoginUserInfo.class);
+        } catch (Exception e) {
+            claims = null;
+        }
+        return claims;
+    }
+}
\ No newline at end of file
diff --git a/server/system_gateway/src/main/java/com/doumee/config/swagger/GlobalErrorFilterConfig.java b/server/system_gateway/src/main/java/com/doumee/config/swagger/GlobalErrorFilterConfig.java
new file mode 100644
index 0000000..8dc06e7
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/swagger/GlobalErrorFilterConfig.java
@@ -0,0 +1,14 @@
+package com.doumee.config.swagger;
+
+import com.doumee.config.GlobalErrorFilter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GlobalErrorFilterConfig {
+
+    @Bean
+    public GlobalErrorFilter globalErrorFilter() {
+        return new GlobalErrorFilter();
+    }
+}
\ No newline at end of file
diff --git a/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerResourceConfig.java b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerResourceConfig.java
index 43fd81a..e3fbc3a 100644
--- a/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerResourceConfig.java
+++ b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerResourceConfig.java
@@ -25,6 +25,7 @@
     @Override
     public List<SwaggerResource> get() {
         List<SwaggerResource> resources = new ArrayList<>();
+        resources.add(swaggerResource("gatewayService",  "v2/api-docs?group=default"));
         List<String> routes = new ArrayList<>();
         routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
         gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {
diff --git a/server/system_gateway/src/main/resources/application-dev.yml b/server/system_gateway/src/main/resources/application-dev.yml
index ca88fb1..edb6d82 100644
--- a/server/system_gateway/src/main/resources/application-dev.yml
+++ b/server/system_gateway/src/main/resources/application-dev.yml
@@ -11,19 +11,7 @@
     time-zone: GMT+8
     date-format: yyyy-MM-dd HH:mm:ss
 
-#rocketmq:
-#  namesrvAddr: rmq-cn-pe335rcnn06.cn-shanghai.rmq.aliyuncs.com:8080
-#  groupId: GID-wakatest
-#  topic: waka-test
-#  username: 4derRb4Sw5EkqUMI
-#  password: v50N97wf4av8Q8I4
 
-#knife4j:
-#  enable: true
-#  basic:
-#    enable: true
-#    username: admin
-#    password: 111111
 
 debug_model: true
 
@@ -38,23 +26,6 @@
   # 绂佺敤swagger鏃剁殑閲嶅畾鍚戝湴鍧�
   redirect-uri: /
 
-########################寰俊鏀粯鐩稿叧閰嶇疆########################
-wx:
-  pay:
-    appId: wxfab6da18632e28de
-    appSecret: 4ee3b22afa90287834319fc3c1635271
-    mchId: 1229817002
-    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
-    notifyUrl: https://dmtest.ahapp.net/smartmeeting_interface/web/api/wxPayNotify
-    keyPath: /usr/local/apiclient_cert.p12
-
-tencent:
-  map:
-    remoteHost: https://apis.map.qq.com
-    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
-
-
-########################瀹氭椂寮�鍚厤缃�########################
 timing: true
 
 des_pwd: 123456SDFKDJF
diff --git a/server/system_gateway/src/main/resources/application-pro.yml b/server/system_gateway/src/main/resources/application-pro.yml
index 3eefb0d..af1432e 100644
--- a/server/system_gateway/src/main/resources/application-pro.yml
+++ b/server/system_gateway/src/main/resources/application-pro.yml
@@ -6,6 +6,12 @@
     password: Znhys@168.com
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
+  redis:
+    #    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password:
+    timeout: 5000      # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
 
 
 #knife4j:
diff --git a/server/system_gateway/src/main/resources/application.yml b/server/system_gateway/src/main/resources/application.yml
index 77b45bc..9407396 100644
--- a/server/system_gateway/src/main/resources/application.yml
+++ b/server/system_gateway/src/main/resources/application.yml
@@ -67,6 +67,16 @@
   main:
     allow-circular-references: true
 
+auth:
+  jwt:
+    enabled: true   #鏄惁寮�鍚疛WT鐧诲綍璁よ瘉鍔熻兘
+    secret: fjkfaf;afa  # JWT绉侀挜锛岀敤浜庢牎楠孞WT浠ょ墝鐨勫悎娉曟��
+    expiration: 3600000 #JWT浠ょ墝鐨勬湁鏁堟湡锛岀敤浜庢牎楠孞WT浠ょ墝鐨勫悎娉曟��
+    header: JWTHeaderName #HTTP璇锋眰鐨凥eader鍚嶇О锛岃Header浣滀负鍙傛暟浼犻�扟WT浠ょ墝
+    userParamName: username  #鐢ㄦ埛鐧诲綍璁よ瘉鐢ㄦ埛鍚嶅弬鏁板悕绉�
+    pwdParamName: password  #鐢ㄦ埛鐧诲綍璁よ瘉瀵嗙爜鍙傛暟鍚嶇О
+    useDefaultController: true # 鏄惁浣跨敤榛樿鐨凧wtAuthController
+
 # WEB鏈嶅姟鍣ㄩ厤缃�
 server:
   compression:
diff --git a/server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java b/server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java
index 4e07d7d..650c035 100644
--- a/server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java
+++ b/server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java
@@ -34,11 +34,37 @@
     private Integer memberId;
     private Integer type;
     private String mobile;
+    private String sessionId;
+
+    private Date loginDate;
 
     private List<String> roles;
 
     private List<String> permissions;
 
+    //jwt鐧诲綍璁剧疆
+    public static LoginUserInfo from(SystemUser user, List<SystemRole> roles, List<SystemPermission> permissions,String sessionId) {
+        if (user == null) {
+            return null;
+        }
+        // 鎷疯礉鐢ㄦ埛淇℃伅
+        LoginUserInfo loginUserInfo = new LoginUserInfo();
+        BeanUtils.copyProperties(user, loginUserInfo);
+        // 璁剧疆瑙掕壊淇℃伅
+        List<String> rs = new ArrayList<>();
+        for (SystemRole role : roles) {
+            rs.add(role.getCode());
+        }
+        loginUserInfo.setSessionId(sessionId);
+        loginUserInfo.setRoles(rs);
+        // 璁剧疆鏉冮檺淇℃伅
+        List<String> pms = new ArrayList<>();
+        for (SystemPermission permission : permissions) {
+            pms.add(permission.getCode());
+        }
+        loginUserInfo.setPermissions(pms);
+        return loginUserInfo;
+    }
     public static LoginUserInfo from(SystemUser user, List<SystemRole> roles, List<SystemPermission> permissions) {
         if (user == null) {
             return null;
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/UserClient.java b/server/system_service/src/main/java/com/doumee/core/utils/UserClient.java
index 0e19c20..91d6726 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/UserClient.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/UserClient.java
@@ -1,6 +1,8 @@
 package com.doumee.core.utils;
 
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -19,6 +21,26 @@
      */
     public String getOS(HttpServletRequest request) {
         String browserDetails = request.getHeader("User-Agent");
+        String userAgent = browserDetails.toLowerCase();
+        String os;
+        if (userAgent.indexOf("windows") >= 0) {
+            os = "Windows";
+        } else if (userAgent.indexOf("mac") >= 0) {
+            os = "Mac";
+        } else if (userAgent.indexOf("x11") >= 0) {
+            os = "Unix";
+        } else if (userAgent.indexOf("android") >= 0) {
+            os = "Android";
+        } else if (userAgent.indexOf("iphone") >= 0) {
+            os = "IPhone";
+        } else {
+            os = "UnKnown, More-Info: " + userAgent;
+        }
+        return os;
+
+    }
+    public String getOS(ServerHttpRequest request) {
+        String browserDetails = request.getHeaders().getFirst("User-Agent");
         String userAgent = browserDetails.toLowerCase();
         String os;
         if (userAgent.indexOf("windows") >= 0) {
@@ -86,6 +108,48 @@
 
         return browser;
     }
+    public String getBrowser(ServerHttpRequest request) {
+        String browserDetails = request.getHeaders().getFirst("User-Agent");
+        String userAgent = browserDetails;
+        String user = userAgent.toLowerCase();
+
+        String browser = "";
+
+        if (user.contains("edge")) {
+            browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
+        } else if (user.contains("msie")) {
+            String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
+            browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
+        } else if (user.contains("safari") && user.contains("version")) {
+            browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0] + "-"
+                    + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
+        } else if (user.contains("opr") || user.contains("opera")) {
+            if (user.contains("opera")) {
+                browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0] + "-"
+                        + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
+            } else if (user.contains("opr")) {
+                browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
+                        .replace("OPR", "Opera");
+            }
+
+        } else if (user.contains("chrome")) {
+            browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
+        } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1)
+                || (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1)
+                || (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1)) {
+            browser = "Netscape-?";
+
+        } else if (user.contains("firefox")) {
+            browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
+        } else if (user.contains("rv")) {
+            String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
+            browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
+        } else {
+            browser = "UnKnown, More-Info: " + userAgent;
+        }
+
+        return browser;
+    }
 
     /**
      * 鑾峰彇IP
@@ -113,6 +177,36 @@
         }
         return "-1.-1.-1.-1";
     }
+    public String getIP(ServerHttpRequest request){
+        HttpHeaders headers = request.getHeaders();
+        String ip = headers.getFirst("x-forwarded-for");
+        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
+            // 澶氭鍙嶅悜浠g悊鍚庝細鏈夊涓猧p鍊硷紝绗竴涓猧p鎵嶆槸鐪熷疄ip
+            if (ip.indexOf(",") != -1) {
+                ip = ip.split(",")[0];
+            }
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("X-Real-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddress().getAddress().getHostAddress();
+        }
+
+        return ip.replaceAll(":", ".");
+    }
 
     /**
      * 鑾峰彇鐢ㄦ埛鎿嶄綔骞冲彴
@@ -123,4 +217,9 @@
     public String getPlatform (HttpServletRequest request) {
         return request.getHeader("eva-platform") == null ? "UNKNOWN" : request.getHeader("eva-platform");
     }
+    public String getPlatform (ServerHttpRequest request) {
+        HttpHeaders headers = request.getHeaders();
+        String name = headers.getFirst("eva-platform");
+        return name==null ? "UNKNOWN" : name;
+    }
 }
diff --git a/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java b/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java
index 07d70b8..a413735 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java
@@ -1,6 +1,8 @@
 package com.doumee.service.system;
 
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.dao.system.dto.LoginDTO;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -17,4 +19,5 @@
      * @date 2023/03/21 14:49
      */
     String loginByPassword (LoginDTO dto, HttpServletRequest request);
+    LoginUserInfo loginByPasswordNew (LoginDTO dto, ServerHttpRequest request);
 }
diff --git a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
index 86ba347..6b87b55 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -6,20 +6,26 @@
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.system.dto.LoginDTO;
 import com.doumee.dao.system.model.SystemLoginLog;
+import com.doumee.dao.system.model.SystemPermission;
+import com.doumee.dao.system.model.SystemRole;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.common.CaptchaService;
-import com.doumee.service.system.SystemLoginLogService;
-import com.doumee.service.system.SystemLoginService;
+import com.doumee.service.system.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.subject.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
+import java.util.List;
 
 @Slf4j
 @Service
@@ -29,6 +35,17 @@
     private String systemVersion;
     @Value("${debug_model}")
     private Boolean isDebug;
+    @Lazy
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @Lazy
+    @Autowired
+    private SystemRoleService systemRoleService;
+
+    @Lazy
+    @Autowired
+    private SystemPermissionService systemPermissionService;
 
     @Autowired
     private CaptchaService captchaService;
@@ -77,4 +94,51 @@
             throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
         }
     }
+
+    @Override
+    public LoginUserInfo loginByPasswordNew(LoginDTO dto, ServerHttpRequest request) {
+        SystemLoginLog loginLog = new SystemLoginLog();
+        loginLog.setLoginUsername(dto.getUsername());
+        loginLog.setLoginTime(new Date());
+        loginLog.setSystemVersion(systemVersion);
+        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
+        if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
+            loginLog.setIp(Utils.User_Client.getIP(request));
+            loginLog.setPlatform(Utils.User_Client.getPlatform(request));
+            loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
+            loginLog.setOsInfo(Utils.User_Client.getOS(request));
+        }
+        loginLog.setServerIp(Utils.Server.getIP());
+        if(isDebug == null  || !isDebug){
+            // 鏍¢獙楠岃瘉鐮�
+            try {
+                captchaService.check(dto.getUuid(), dto.getCode());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
+                loginLog.setSuccess(Boolean.FALSE);
+                systemLoginLogService.create(loginLog);
+                throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(),"瀵逛笉璧凤紝楠岃瘉鐮佷笉姝g‘锛�");
+            }
+        }
+
+        // 鏍规嵁鐢ㄦ埛鍚嶆煡璇㈢敤鎴峰璞�
+        SystemUser queryDto = new SystemUser();
+        queryDto.setUsername(dto.getUsername());
+        queryDto.setDeleted(Boolean.FALSE);
+        SystemUser user = systemUserService.findOne(queryDto);
+        if (user == null) {
+            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
+        }
+        String pwd = Utils.Secure.encryptPassword(new String(dto.getPassword()), user.getSalt());
+        // 姣旇緝瀵嗙爜
+        if( StringUtils.equals(pwd, user.getPassword())){
+            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
+        }
+        // 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
+        List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
+        List<SystemPermission> permissions = systemPermissionService.findByUserId(user.getId());
+        LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions,null);
+        return  userInfo;
+    }
 }

--
Gitblit v1.9.3