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