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