nidapeng
2024-04-25 846b8cddfeba109329f834d040161b9aec57ba9d
最新版本
已添加5个文件
已修改9个文件
565 ■■■■■ 文件已修改
server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/jwt/JwtProperties.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/swagger/GlobalErrorFilterConfig.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerResourceConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/application-dev.yml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/application-pro.yml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/application.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/UserClient.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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( "登录已失效");
    }
}
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")
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)));
        });
    }
}
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 {
    //是否开启JWT,即注入相关的类对象
    private Boolean enabled;
    //JWT密钥
    private String secret;
    //JWT有效时间
    private Long expiration;
    //前端向后端传递JWT时使用HTTP的header名称,前后端要统一
    private String header;
    //用户登录-用户名参数名称
    private String userParamName = "username";
    //用户登录-密码参数名称
    private String pwdParamName = "password";
    //是否使用默认的JWTAuthController
    private Boolean useDefaultController = false;
}
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 ä»¤token牌
     */
    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));
    }
    /**
     * ä»Žclaims生成令牌,如果看不懂就看谁调用它
     *
     * @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;
    }
}
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();
    }
}
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 -> {
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
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:
server/system_gateway/src/main/resources/application.yml
@@ -67,6 +67,16 @@
  main:
    allow-circular-references: true
auth:
  jwt:
    enabled: true   #是否开启JWT登录认证功能
    secret: fjkfaf;afa  # JWT私钥,用于校验JWT令牌的合法性
    expiration: 3600000 #JWT令牌的有效期,用于校验JWT令牌的合法性
    header: JWTHeaderName #HTTP请求的Header名称,该Header作为参数传递JWT令牌
    userParamName: username  #用户登录认证用户名参数名称
    pwdParamName: password  #用户登录认证密码参数名称
    useDefaultController: true # æ˜¯å¦ä½¿ç”¨é»˜è®¤çš„JwtAuthController
# WEB服务器配置
server:
  compression:
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;
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)) {
            // å¤šæ¬¡åå‘代理后会有多个ip值,第一个ip才是真实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;
    }
}
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);
}
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(),"对不起,验证码不正确!");
            }
        }
        // æ ¹æ®ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·å¯¹è±¡
        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;
    }
}