From bc1f10381a730b541c8ce347f587f9e8d677d559 Mon Sep 17 00:00:00 2001 From: zyh Date: Sun, 24 Aug 2025 16:52:20 +0800 Subject: [PATCH] Enhance authentication logging and update MyBatis configuration --- docs/开发文档.md | 5 +- .../controller/auth/AuthController.java | 5 ++ .../exception/GlobalExceptionHandler.java | 56 +++++++++++++++++- .../mapper/account/UserAccountMapper.java | 2 +- .../server/model/dto/auth/LoginRequest.java | 8 +-- .../server/security/JwtService.java | 11 +++- .../server/service/auth/AuthService.java | 45 ++++++++------ src/main/resources/application.yml | 5 +- .../mapper/account/UserAccountMapper.xml | 8 ++- target/classes/application.yml | 5 +- .../controller/auth/AuthController$1.class | Bin 1439 -> 1439 bytes .../controller/auth/AuthController.class | Bin 4019 -> 4903 bytes .../exception/GlobalExceptionHandler$1.class | Bin 1312 -> 1312 bytes .../exception/GlobalExceptionHandler.class | Bin 2038 -> 7530 bytes .../mapper/account/UserAccountMapper.class | Bin 455 -> 590 bytes .../server/model/dto/auth/LoginRequest.class | Bin 1211 -> 984 bytes .../server/security/JwtService.class | Bin 4599 -> 5134 bytes .../server/security/SecurityConfig.class | Bin 4317 -> 4495 bytes .../server/service/auth/AuthService.class | Bin 7118 -> 9150 bytes .../mapper/account/UserAccountMapper.xml | 8 ++- 20 files changed, 122 insertions(+), 36 deletions(-) diff --git a/docs/开发文档.md b/docs/开发文档.md index c2a8c8e..702104f 100644 --- a/docs/开发文档.md +++ b/docs/开发文档.md @@ -41,7 +41,7 @@ - 建议:后续改为 Flyway 迁移(`V001__init.sql` 起步),避免手工执行 SQL ## 安全与认证 -- 登录:`POST /api/auth/login`(`userType=admin|agent` + `username` + `password`) +- 登录:`POST /api/auth/login`(`username` + `password`,角色自动识别) - 自我信息:`GET /api/auth/me`(Authorization: Bearer ) - JWT:HS256;配置在 `security.jwt.*`(`application.yml`) - 密码:默认 `BCrypt`;兼容 `PLAIN:` 前缀以便初始化迁移 @@ -103,7 +103,7 @@ - [ ] 乐观锁/并发扣点优化、观测/告警 ## 接口清单(节选) -- `POST /api/auth/login`:登录获取 JWT +- `POST /api/auth/login`:登录获取 JWT(仅需 `username`、`password`) - `GET /api/auth/me`:当前用户信息 - `GET /api/link/{codeNo}`:查询链接元数据(待实现) - `POST /api/link/{codeNo}/select-region`:选择区服(待实现) @@ -119,4 +119,3 @@ - 默认管理员以 `PLAIN:` 存储密码,仅用于初始化。上线前必须改为 BCrypt: - 方案:使用项目内 `BCryptPasswordEncoder` 生成哈希,更新 `user_account.password_hash` - 统一返回体与 RBAC 规则将在后续迭代落地 - diff --git a/src/main/java/com/gameplatform/server/controller/auth/AuthController.java b/src/main/java/com/gameplatform/server/controller/auth/AuthController.java index 77bdbb0..952eb2e 100644 --- a/src/main/java/com/gameplatform/server/controller/auth/AuthController.java +++ b/src/main/java/com/gameplatform/server/controller/auth/AuthController.java @@ -4,6 +4,8 @@ import com.gameplatform.server.model.dto.auth.LoginRequest; import com.gameplatform.server.model.dto.auth.LoginResponse; import com.gameplatform.server.security.JwtService; import io.jsonwebtoken.Claims; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import jakarta.validation.Valid; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -13,6 +15,7 @@ import reactor.core.publisher.Mono; @RestController @RequestMapping("/api/auth") public class AuthController { + private static final Logger log = LoggerFactory.getLogger(AuthController.class); private final com.gameplatform.server.service.auth.AuthService authService; private final JwtService jwtService; @@ -25,6 +28,7 @@ public class AuthController { @PostMapping("/login") @ResponseStatus(HttpStatus.OK) public Mono login(@Valid @RequestBody LoginRequest req) { + log.info("/api/auth/login called username={}", req.getUsername()); return authService.login(req); } @@ -32,6 +36,7 @@ public class AuthController { public Mono me(@RequestHeader(HttpHeaders.AUTHORIZATION) String authorization) { String token = authorization != null && authorization.startsWith("Bearer ") ? authorization.substring(7) : authorization; return Mono.fromCallable(() -> jwtService.parse(token)) + .doOnError(e -> log.warn("/api/auth/me parse token error: {}", e.toString())) .map(this::claimsToMe); } diff --git a/src/main/java/com/gameplatform/server/exception/GlobalExceptionHandler.java b/src/main/java/com/gameplatform/server/exception/GlobalExceptionHandler.java index b74f1c1..aa0db4a 100644 --- a/src/main/java/com/gameplatform/server/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/gameplatform/server/exception/GlobalExceptionHandler.java @@ -1,6 +1,13 @@ package com.gameplatform.server.exception; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.support.WebExchangeBindException; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebInputException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -10,22 +17,61 @@ import java.util.LinkedHashMap; @RestControllerAdvice public class GlobalExceptionHandler { + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public Object handleBadRequest(IllegalArgumentException e) { + log.info("400 BadRequest: {}", e.getMessage()); return body(HttpStatus.BAD_REQUEST.value(), e.getMessage()); } @ExceptionHandler(IllegalStateException.class) @ResponseStatus(HttpStatus.FORBIDDEN) public Object handleForbidden(IllegalStateException e) { + log.info("403 Forbidden: {}", e.getMessage()); return body(HttpStatus.FORBIDDEN.value(), e.getMessage()); } + @ExceptionHandler(WebExchangeBindException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public Object handleBindException(WebExchangeBindException e) { + log.info("400 ValidationError: {}", e.getMessage()); + var details = new java.util.LinkedHashMap(); + e.getFieldErrors().forEach(fe -> details.put(fe.getField(), fe.getDefaultMessage())); + e.getGlobalErrors().forEach(ge -> details.put(ge.getObjectName(), ge.getDefaultMessage())); + return body(HttpStatus.BAD_REQUEST.value(), "参数校验失败", details); + } + + @ExceptionHandler(ConstraintViolationException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public Object handleConstraintViolation(ConstraintViolationException e) { + log.info("400 ConstraintViolation: {}", e.getMessage()); + var details = new java.util.LinkedHashMap(); + for (ConstraintViolation v : e.getConstraintViolations()) { + details.put(String.valueOf(v.getPropertyPath()), v.getMessage()); + } + return body(HttpStatus.BAD_REQUEST.value(), "参数校验失败", details); + } + + @ExceptionHandler(ServerWebInputException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public Object handleInput(ServerWebInputException e) { + log.info("400 InputError: {}", e.getMessage()); + return body(HttpStatus.BAD_REQUEST.value(), "请求解析失败: " + e.getReason()); + } + + @ExceptionHandler(ResponseStatusException.class) + public Object handleRse(ResponseStatusException e) { + var status = e.getStatusCode(); + log.info("{} ResponseStatusException: {}", status, e.getReason()); + return body(status.value(), e.getReason()); + } + @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public Object handleOther(Exception e) { + log.error("500 InternalServerError", e); return body(HttpStatus.INTERNAL_SERVER_ERROR.value(), "服务器内部错误"); } @@ -36,5 +82,13 @@ public class GlobalExceptionHandler { put("timestamp", Instant.now().toString()); }}; } -} + private Object body(int code, String message, Object details) { + return new LinkedHashMap<>() {{ + put("code", code); + put("message", message); + put("details", details); + put("timestamp", Instant.now().toString()); + }}; + } +} diff --git a/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java b/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java index 3884cbb..4fd66ed 100644 --- a/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java +++ b/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java @@ -6,5 +6,5 @@ import org.apache.ibatis.annotations.Param; public interface UserAccountMapper { UserAccount findByUsernameAndType(@Param("username") String username, @Param("userType") String userType); + UserAccount findByUsername(@Param("username") String username); } - diff --git a/src/main/java/com/gameplatform/server/model/dto/auth/LoginRequest.java b/src/main/java/com/gameplatform/server/model/dto/auth/LoginRequest.java index 9dc7997..08ba76c 100644 --- a/src/main/java/com/gameplatform/server/model/dto/auth/LoginRequest.java +++ b/src/main/java/com/gameplatform/server/model/dto/auth/LoginRequest.java @@ -3,19 +3,13 @@ package com.gameplatform.server.model.dto.auth; import jakarta.validation.constraints.NotBlank; public class LoginRequest { - // userType: admin | agent @NotBlank - private String userType; - @NotBlank - private String username; // admin: username, agent: loginAccount + private String username; // 统一登录名(admin/agent 共用) @NotBlank private String password; - public String getUserType() { return userType; } - public void setUserType(String userType) { this.userType = userType; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } - diff --git a/src/main/java/com/gameplatform/server/security/JwtService.java b/src/main/java/com/gameplatform/server/security/JwtService.java index 221b0ec..1c90e75 100644 --- a/src/main/java/com/gameplatform/server/security/JwtService.java +++ b/src/main/java/com/gameplatform/server/security/JwtService.java @@ -4,6 +4,8 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -15,7 +17,7 @@ import java.util.Map; @Component public class JwtService { - + private static final Logger log = LoggerFactory.getLogger(JwtService.class); private final SecretKey key; private final long accessTokenMinutes; @@ -39,11 +41,14 @@ public class JwtService { if (extra != null) { extra.forEach(builder::claim); } - return builder.signWith(key, SignatureAlgorithm.HS256).compact(); + String token = builder.signWith(key, SignatureAlgorithm.HS256).compact(); + if (log.isDebugEnabled()) { + log.debug("JWT generated subject={}, userType={}, userId={}, username={} expInMin={}", subject, userType, userId, username, accessTokenMinutes); + } + return token; } public io.jsonwebtoken.Claims parse(String token) { return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody(); } } - diff --git a/src/main/java/com/gameplatform/server/service/auth/AuthService.java b/src/main/java/com/gameplatform/server/service/auth/AuthService.java index ad6fb2e..4161414 100644 --- a/src/main/java/com/gameplatform/server/service/auth/AuthService.java +++ b/src/main/java/com/gameplatform/server/service/auth/AuthService.java @@ -5,6 +5,8 @@ import com.gameplatform.server.model.dto.auth.LoginRequest; import com.gameplatform.server.model.dto.auth.LoginResponse; import com.gameplatform.server.model.entity.account.UserAccount; import com.gameplatform.server.security.JwtService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; @@ -14,6 +16,7 @@ import java.util.Map; @Service public class AuthService { + private static final Logger log = LoggerFactory.getLogger(AuthService.class); private final UserAccountMapper userAccountMapper; private final PasswordEncoder passwordEncoder; private final JwtService jwtService; @@ -27,22 +30,25 @@ public class AuthService { } public Mono login(LoginRequest req) { - String userType = normalizeType(req.getUserType()); - return Mono.fromCallable(() -> userAccountMapper.findByUsernameAndType(req.getUsername(), userType)) + log.info("login attempt username={}", req.getUsername()); + long start = System.currentTimeMillis(); + return Mono.fromCallable(() -> userAccountMapper.findByUsername(req.getUsername())) .subscribeOn(Schedulers.boundedElastic()) - .flatMap(acc -> validatePasswordAndBuild(acc, userType, req.getPassword())); + .doOnNext(acc -> { + if (acc == null) { + log.warn("login account not found username={}", req.getUsername()); + } else { + log.debug("login account loaded id={}, status={}, role={} userType={}", acc.getId(), acc.getStatus(), acc.getRole(), acc.getUserType()); + } + }) + .flatMap(acc -> validatePasswordAndBuild(acc, req.getPassword())) + .doOnSuccess(r -> log.info("login success username={}, tookMs={}", req.getUsername(), (System.currentTimeMillis()-start))) + .doOnError(e -> log.warn("login failed username={}, err={}, tookMs={}", req.getUsername(), e.toString(), (System.currentTimeMillis()-start))); } - private String normalizeType(String t) { - if (t == null) return ""; - t = t.trim().toLowerCase(); - if ("admin".equals(t)) return "ADMIN"; - if ("agent".equals(t)) return "AGENT"; - throw new IllegalArgumentException("unsupported userType: " + t); - } - - private Mono validatePasswordAndBuild(UserAccount acc, String userType, String rawPwd) { + private Mono validatePasswordAndBuild(UserAccount acc, String rawPwd) { if (acc == null || acc.getPasswordHash() == null) { + log.debug("validatePasswordAndBuild: account missing or no password hash"); return Mono.error(new IllegalArgumentException("用户名或密码错误")); } boolean ok; @@ -54,19 +60,24 @@ public class AuthService { } else { ok = false; } - if (!ok) return Mono.error(new IllegalArgumentException("用户名或密码错误")); + if (!ok) { + log.debug("validatePasswordAndBuild: password not match for user id={}", acc.getId()); + return Mono.error(new IllegalArgumentException("用户名或密码错误")); + } if (!"ENABLED".equalsIgnoreCase(acc.getStatus())) { + log.debug("validatePasswordAndBuild: account disabled id={}", acc.getId()); return Mono.error(new IllegalStateException("账户已禁用")); } + String userType = acc.getUserType() == null ? "agent" : acc.getUserType().toLowerCase(); String token = jwtService.generateToken( - userType.toLowerCase() + ":" + acc.getId(), - userType.toLowerCase(), acc.getId(), acc.getUsername(), - userType.equals("ADMIN") ? Map.of("role", acc.getRole()) : Map.of("displayName", acc.getDisplayName()) + userType + ":" + acc.getId(), + userType, acc.getId(), acc.getUsername(), + "admin".equals(userType) ? Map.of("role", acc.getRole()) : Map.of("displayName", acc.getDisplayName()) ); LoginResponse resp = new LoginResponse(); resp.setAccessToken(token); - resp.setUserType(userType.toLowerCase()); + resp.setUserType(userType); resp.setUserId(acc.getId()); resp.setUsername(acc.getUsername()); resp.setExpiresIn(60L * 30); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 128e22e..594fce6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,7 +13,7 @@ spring: connection-timeout: 30000 mybatis: - mapper-locations: classpath:mapper/*.xml + mapper-locations: classpath:mapper/**/*.xml type-aliases-package: com.gameplatform.server.model configuration: map-underscore-to-camel-case: true @@ -31,6 +31,9 @@ logging: level: root: info com.gameplatform.server: debug + org.mybatis: debug + org.apache.ibatis: debug + com.zaxxer.hikari: info security: jwt: diff --git a/src/main/resources/mapper/account/UserAccountMapper.xml b/src/main/resources/mapper/account/UserAccountMapper.xml index 18bbde8..3736788 100644 --- a/src/main/resources/mapper/account/UserAccountMapper.xml +++ b/src/main/resources/mapper/account/UserAccountMapper.xml @@ -21,5 +21,11 @@ AND user_type = #{userType} LIMIT 1 - + + diff --git a/target/classes/application.yml b/target/classes/application.yml index 128e22e..594fce6 100644 --- a/target/classes/application.yml +++ b/target/classes/application.yml @@ -13,7 +13,7 @@ spring: connection-timeout: 30000 mybatis: - mapper-locations: classpath:mapper/*.xml + mapper-locations: classpath:mapper/**/*.xml type-aliases-package: com.gameplatform.server.model configuration: map-underscore-to-camel-case: true @@ -31,6 +31,9 @@ logging: level: root: info com.gameplatform.server: debug + org.mybatis: debug + org.apache.ibatis: debug + com.zaxxer.hikari: info security: jwt: diff --git a/target/classes/com/gameplatform/server/controller/auth/AuthController$1.class b/target/classes/com/gameplatform/server/controller/auth/AuthController$1.class index b0336a4c3246a67f412af17181f89ab273610d76..542d1f999872e4a8f013f4f7d0465b8ff7ba0332 100644 GIT binary patch delta 37 scmbQwJ)e66KdYn;10RDfg93vdgAs#1gA0QJLnebELnVXJWDVAG0C-##5H6z2lJ~Gafgreis4^^CS9XBBJNA z+ar{hNQYv2GHHy3av8%)>nUUT-hCQ^Xi(9}(S$h+iwcFHeW*GxvLk0?vJ9TMkzGHN z%`m&8b7)-OsYjA}IvyF$T8VVL--Bkfs0eY)!+ZwswNMz8M0%Ua&~9H;{H+xQqNC$R zEZg6?K|?FrR4m|VM+ZYsq0nQmWqPoSL0x6&mSKf7bmImUH*!SKWBsN76ju02iV#!20ktM~oVKZmN>_6QsDYBp|PXW z)|FtyixUK-5@&fzXI0}9vFlTgLwMOM{=cyQ(z;u|65f*>FXDg~2Pkby!)bh@qR4Ru zXQu`|ex{r!vg}Kqxiy*AA=8}5O{(~gp;@@>H3z@2p#ytJxdG&J>Q0V%)(SRD-ogz;NGCgM@4U<-3iCWCDL^TPMWV#+kC)fR_U zF?s=CwsN3a)@;rIr!W(8Q0NdJX8r!R48#*8VYwAo!cRd;Z@2|2*_)6Yu=!SO5o->&`5lr z>nz5mP%B`u3Rpgp=`i_X5{@{eim&dQ1udvm7||EE!-HP?_MuI5P>DgoKzNYC<4!3u+P&5*=VPDggrS+qfhe z^~R~b%4M#o%9T~5&_c^gi}F5IxypY?et`P*ks>KPRbPK=zo*}~dv4Qwi}&pL;uD~o zJ5}#R+#^A~OM|A7q@tr*?J)bCQaY`0ca}>t<(aHU6U{DbG;3LBmYl6MO=LB1(rUaw zF1$grkxiy6a5kD_vrAr6pr~jz1EFT~SKwgyZB08J=5cVmCdWIPcX`j`LVfCeGac&I zopfnJe5g2(tKQ3)kwDh`8_GmHKH_7SZp}7&OeI{N?{WVOnjsxeeXpoLQ94spi#dG3 zF7X+Oc1wHDFlv^{UiR6f%$E$XU;4GEq__iO2gT}?%-iHEF~!$>BUJ6_Zb;oyDHfj6 zSV*K6$oz^f#N7p2<_H${a=R;!beZI!)LxMs@kvHy$G4W3Px3pTiB?iLY>TrT5gd66 zI2E7EHaU$|+IvLjP`>bh4^~Uv_CKk;mBV?AF)oP9rx=5{W8a>Dt-ipBT;SH#sI62i z=htu0GF2RvUQqlok^H#C4kvte35iZhK4HoD41Zv9dA5@&i7et}k$RdLPW#bW&U1;M Rq-S?`inrg-VQz7o%u67IjpP6T diff --git a/target/classes/com/gameplatform/server/exception/GlobalExceptionHandler$1.class b/target/classes/com/gameplatform/server/exception/GlobalExceptionHandler$1.class index 813e5410ea82e6465f62fef5623c5f405bc3dcfb..315d986db05f7517853faa2680a7b99b06110c4f 100644 GIT binary patch delta 29 kcmZ3$wSa5G8Wur+24RK(21SNI1|5bV21|zE$$MFn0cd>&s{jB1 delta 29 kcmZ3$wSa5G8WurC24Myz21N#C1|0?!21^Fj$$MFn0bI`o#Q*>R diff --git a/target/classes/com/gameplatform/server/exception/GlobalExceptionHandler.class b/target/classes/com/gameplatform/server/exception/GlobalExceptionHandler.class index 8e7751d4b9006d68389c93e3826728a3e1374f1c..216ec5d8b83864f21940a109fb07b8a4ecf45578 100644 GIT binary patch literal 7530 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 w$Bp7TX2@kNW|3zZql+D^{Dy$1%`HHIRF3v diff --git a/target/classes/com/gameplatform/server/mapper/account/UserAccountMapper.class b/target/classes/com/gameplatform/server/mapper/account/UserAccountMapper.class index b5b52af014d11cc1bdf5d2b409018709693d1535..c186692833b51d4343ee0e6e92533eaae74d5aaf 100644 GIT binary patch delta 100 zcmX@ke2#_d)W2Q(7#J9A83Z?S`7;XhrDf)&I8}xgrxxWU=B6?-_-Rb+@t+*YsL#kW wxs%aEpM{Zumw}IgiGdxcik delta 40 vcmX@da-5m#)W2Q(7#J9A8TdDH`7=)5&8W}FIQccB2^Rw+120g5iGdFQ1{n#N diff --git a/target/classes/com/gameplatform/server/model/dto/auth/LoginRequest.class b/target/classes/com/gameplatform/server/model/dto/auth/LoginRequest.class index 7d38703c7456abd3530b4c2280ce5eaeb30377f2..bf762f2b8705f9ad826289663c83ead64f32bfcf 100644 GIT binary patch delta 464 zcmdnZd4rwn)W2Q(7#J9A85AdSRWj!#=1y!=p1AKhh&6cyqY{`t%V;!Nn#m!MiGhiM zn}G*N3IMgRF)%U+0%;*2=3rnHW&rb;82AaOU>GdrObiIk+*mbBF-QYdfiznIX(k}erlq}= zfqf%fcRk1-AX`Cpi$Rn??FRV~iFnaS<=V ZMGyz^;cyTrc;OD>2Rld}NHQ@f002!@A?W}B literal 1211 zcmbV~OK%e~5XZ-PH{CXmKA=E>@={VHd_Y`iiv&oVLaEx4yOWs2?e02wy+M2{kU&Tr z_yBw;#NXRAX~GsH4m;i%&*L{U{`u?s4F0{JrN_peG&Hgo6d>s zT1JIk6)O9TQMS=+FHngVid6P!kvv9^yE@=~5y+u0>^p4&9!WEjh6lPQecrR0i`Wi$ zOZQcHDBs62LdH@Iuj7wH$*A6%7Cf>>h5a2@V%ejL%b$3L$nT6bkLrnWD5B_tHa$ig zhjD0CAloWZ9bY~VLv4jsI*b@Kk@{2^EBHwGs+X8~7gyE@721gJYx@G7p6)Q(oXz9d zW^(0Tq8~<;mI~#59CUy$P|xw}uJGH!D5sB&IXh4Qc+&ch=>TT2FYVjOgjO4_k@KaD zX9TC{qSIRAPoHKR>wGQkK=%%W!3?c5pgPa)raDbC)=>FiGF(?;s+Es)Y`XH5a&6Zx zF7%PZqb+PGgEy6h#M^*efmR?!t2o#2m59OQw2a&CKRmGNzj_pr8BZ2+9T_=JhBLqY zjo9a;#1%+)4I^EJ^v3@ibPXD#>vRKhHuwt_KjAV%)8OUQ;7z&-FBkk2r|Y}0{qQRl z=Sx?T==C!XIxFq4+=Lk2LR=n8z`^KtD$mk9Pc@ZiE1hR)o~L#RkK4zDr;_m8N#&`| d^VCy$?xyop=Xq8x;c?ra@YEBYdypBr{~Hkv&(Z(@ diff --git a/target/classes/com/gameplatform/server/security/JwtService.class b/target/classes/com/gameplatform/server/security/JwtService.class index 8c612a29deded9401cdda34f9155b111674296d2..e741cfca1c3adc10db5f6c1058c5cf245dc567e7 100644 GIT binary patch delta 1359 zcmZXSX>e0j6vuxzX>ybFk=BA`DlMj#wrOb%qs%xg6=!fO6Q>_qW$HMCY5T~egrt+C z1*|m{_pOT04fh2RtXnBc3xX>yRTOs-_kH)HU);`n#SY?!d(XM&o^$@^|G)S5s-bXT z;;)^1fF^z$37qfE`zdFQ!CKZS+{tuYQ4&pO;*o4}<^1kQG#!tdnMH;4bD?Iy;3D#h z;v*9j!9?~{v!geDS}N9&G`pl%xb9pZ7b}{VEpH3O&6Jsm<;<>7wzs3(?94Uw4>W{& zvt~Ziwywwg_mpYwnsQUI)pk5&uI*_~os~$5AK(%$)m&z9Iadf~cdRcKNybufnKLDm z>%LgB*KAp-m>ynM7ya+GL*goftGPzu>9U7agjLvDJguhioB$16XE4O|R?fR1xPcor zmcdQjtO!|6y3DH3+B)cs`ZjQ@!EJ1`BDy|!2X|`jGPs+26lG4{pk7jVANOk>FxbR{ z)`VV=e@Ic9NJqM}>C_stBbQ!frXov|vBc_ZfUP{N88&!?M-?-VRQB{(XD*$QxADi# z+~jL0s>6qIlRnw(qPqV-nqVHvvub@KYRBjS-zMetIOwDOfw1!X7I!8SsYLE%Yir?v zdf%!wYSo8Ui!o0fv<8jF;3ok-S*Kho((e1wY9| z*8bq^z?^70y{flI^NY1Fcw)7iW9)w=pRI&r2|2ckIbsWtC*U#MJZ@DKEy+J2u~LaZ zncU5i>~g|X(8z2?Bw8;~IG$~cinYD%JSjbF&+h1wiXxt3hvbb(bOx@!rIlM#uJK9j zQq4F!<;L%lQltoW$(resE>DML+nr^P?N7STh;XZoN8^|5Var{d$uIP6qi>uG z6dP#}w`9<_8&|t~Zfko%LuR?yn6>$g)m#`@NAu5?r8vq=_U?+XdaUMYl+ zlfG3H3x!ImiBQ8y)N+cDKZ81=LVSgM%$x|37phyB$4FjE&zl@)N{?ZlKcvSnE#kQ( zXPC2jK?vC1a*5dr4)Y>=1=ho6Y5x*lf$0+1mxW+XpkI+ZAFoQLAp%V1Pe`_{=~1}; zWQ8VQqdDOZ&J(XW)Z-^&4(k9j(Ei}fpBF?OFZg9!F z+@hE}&h55)uPys#TO*gFl-C(!zViu6Cu{RltV7Pc%9+BWex>Xm D&qOp7 delta 821 zcmYL`$xqW!5XV2Sw*7VaK}(5{f^C@Ia*#ucp#EV5b&spU zdxWC~$4pu{u7A49a!x9;>Y}CVV$u4B+O?ab>uc*vD>tmE+ZfZG?jhBlSmo(f38z`8 zoQ~A1UXa$Tk~)!Aq=xjjw7K?SMUn1uXX=POGqA$vWW>WWo*TR{@$phurH`h+^6;8B z25(Kqc$diWWh(ViNBm*?XGNZ#=g-rP{=ifl0rCmS!~qJJA$}4H2dBhq-RG}Za#~_p z5`k>&1cjYLF}ciP3TGr5mMBCxORIPbo#VXJu#i>JCK*23Xcu0GF3-rWyg;YCx@|&4 zC~#3M+a@`e#JXZ!{tvGR?B=Sa22@0JxP%X9x|{`+ zO820Bv60;_aah)5|$q}cX zS=_`arAwsMEevi8!4%2kv^zrU5bQ<$rpBPqV18=$$qs3Tv_TpmrIDg=SIove$?v64 zkc`Z7@s^a(09(TS3-i uz@g+~tuT>F?dO4bEBT@LM`8g6qsL diff --git a/target/classes/com/gameplatform/server/security/SecurityConfig.class b/target/classes/com/gameplatform/server/security/SecurityConfig.class index 3b8504ed11f247a5db233bde888cfffa24f3d3cb..c97bdc4e7adf2477af4719e98ec94d9d66323081 100644 GIT binary patch delta 517 zcmYk2OG{f(5Xb+gN$!ou<4wef*hNH2r4J=Ux>0dsK%oRv5JXA>y~g-R<15iL@fDwa z_=-BM^^q?jt}I1xCAe$%UHAq15lZJKx6sAR?>}c|&dfQ#nv0L*-JfsQ0J>4SkUw;1 zP#{V{EkwT^4bO+_KF38K7v4&wFsWloVHz_6FX>+Ip`TSzk*0tgXwonz5yrg28<<|0+>(>XTP+I$ zk#hBFwMQ(`LG^33B2lnXtN&6(Rpantos)f3RCP_8)@54?QN+B6c{F^K_=Ig8I|{ql zyS!2DLep_%FY+*CzevFSzs#gZ$z`;N6KXY{InMHxJk AumAu6 delta 399 zcmXYtNiV}e7>9qO%fF`M-y$O7(1^sLiG+p&NiUk&?Xn zkX}SY;^5-M2XJt8@DapY`5)dq&&)G(n90_D*2uTt$7cXu+}z6#&D zVh{To4ipY?l>b&9Q6^yXB@>apSU6bFXd+2zy-r-vo$eM_^sYAxbKdHB5*e5=#E&k* zFb0^CZG;)*3Gp<+f*qI;#wcbCi(%HVc`O;Wf;Gc7u#IEB*$NHyP&k2rhb@az{xpSC XW`cRfOrb&{$CBm^VxHp?*Qojf8dOy? diff --git a/target/classes/com/gameplatform/server/service/auth/AuthService.class b/target/classes/com/gameplatform/server/service/auth/AuthService.class index 4e2944a8ea1c6ebd6ac27acee965ee0c3d134856..225381c15a2695981483ff5dcbe054de5f8e9500 100644 GIT binary patch literal 9150 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 ULI_9d>l8ZCTwLdgd{GGh2Yg_Iy8r+H diff --git a/target/classes/mapper/account/UserAccountMapper.xml b/target/classes/mapper/account/UserAccountMapper.xml index 18bbde8..3736788 100644 --- a/target/classes/mapper/account/UserAccountMapper.xml +++ b/target/classes/mapper/account/UserAccountMapper.xml @@ -21,5 +21,11 @@ AND user_type = #{userType} LIMIT 1 - + +