记得上下班打卡 | git大法好,push需谨慎

Commit b27fd656 authored by 张国柄's avatar 张国柄

fix:token验证迁移至微服务(配置启用)

parent 89c2e2b4
...@@ -5,13 +5,13 @@ import org.apache.commons.lang3.StringUtils; ...@@ -5,13 +5,13 @@ import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class CurrentUtil { public class CurrentUtil {
public static final String uID = "sub"; public static final String uID = "sub";
public static final String uTag = "u-tag"; public static final String uTag = "u-tag";
public static final String uToken = "u-token"; public static final String uToken = "authorization";
public static final String CLI_SOURCE = "source"; public static final String CLI_SOURCE = "source";
public static final String CLI_VERSION = "version"; public static final String CLI_VERSION = "version";
public static final String CLI_UNKNOWN = "unknown"; public static final String CLI_UNKNOWN = "unknown";
...@@ -21,19 +21,15 @@ public class CurrentUtil { ...@@ -21,19 +21,15 @@ public class CurrentUtil {
private static final String LOCALHOST_IP1 = "127.0.0.1"; private static final String LOCALHOST_IP1 = "127.0.0.1";
public static String getToken() { public static String getToken() {
String authToken = ServletUtils.getRequest().getHeader(uToken); return StringUtils.defaultIfEmpty((String) ServletUtils.getRequest().getAttribute(uToken), "");
return StringUtils.isEmpty(authToken) ? "" : authToken;
} }
public static Map getTokenClaims() { public static Map getTokenClaims() {
String utag = ServletUtils.getRequest().getHeader(uTag); return JsonUtils.fromJson((String) ServletUtils.getRequest().getAttribute(CurrentUtil.uTag), Map.class);
return JsonUtils.fromJson(utag, Map.class);
} }
public static String getCurrentUid() { public static String getCurrentUid() {
String uid = ServletUtils.getRequest().getHeader(uID); return (String) ServletUtils.getRequest().getAttribute(uID);
// TODO: 2021/5/14 dev联调API未启用token默认使用1
return StringUtils.isEmpty(uid) ? "1" : uid;
} }
public static String getCliSource() { public static String getCliSource() {
......
...@@ -11,6 +11,10 @@ ...@@ -11,6 +11,10 @@
<artifactId>liquidnet-common-cache-redis</artifactId> <artifactId>liquidnet-common-cache-redis</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
......
package com.liquidnet.common.exception;
import com.liquidnet.common.exception.entity.Error;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.List;
@RestControllerAdvice
public class ValidControllerAdviceHandler {
@ExceptionHandler(BindException.class)
@ResponseBody
public ResponseEntity<Error> handleBindException(Exception e) {
//打印校验住的所有的错误信息
StringBuilder sb = new StringBuilder("参数错误:[");
List<ObjectError> list = ((BindException) e).getAllErrors();
for (ObjectError item : list) {
sb.append(item.getDefaultMessage()).append(',');
}
sb.deleteCharAt(sb.length() - 1);
sb.append(']');
String msg = sb.toString();
return new ResponseEntity<Error>(new Error("400", msg), HttpStatus.OK);
}
}
package com.liquidnet.service.base; package com.liquidnet.service.base;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.liquidnet.commons.lang.util.JsonUtils; import com.liquidnet.commons.lang.util.JsonUtils;
import java.io.Serializable; import java.io.Serializable;
...@@ -14,6 +15,7 @@ public class ResponseDto<T> implements Serializable, Cloneable { ...@@ -14,6 +15,7 @@ public class ResponseDto<T> implements Serializable, Cloneable {
private static final long serialVersionUID = 8377276776600901982L; private static final long serialVersionUID = 8377276776600901982L;
private String code; private String code;
private String message; private String message;
@JsonInclude(JsonInclude.Include.NON_NULL)
private T data; private T data;
public boolean isSuccess() { public boolean isSuccess() {
......
...@@ -10,14 +10,19 @@ ...@@ -10,14 +10,19 @@
<artifactId>liquidnet-common-web</artifactId> <artifactId>liquidnet-common-web</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.liquidnet</groupId> <groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-service-base</artifactId> <artifactId>liquidnet-common-service-base</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>com.liquidnet</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>liquidnet-common-cache-redis</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> </dependency>
</dependencies> </dependencies>
......
...@@ -22,9 +22,14 @@ public class CorsConfig { ...@@ -22,9 +22,14 @@ public class CorsConfig {
// 可以自行筛选 // 可以自行筛选
corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedOrigin("http://devpartner.zhengzai.tv");
corsConfiguration.addAllowedOrigin("https://devpartner.zhengzai.tv");
corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*"); corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
return corsConfiguration; return corsConfiguration;
} }
......
package com.liquidnet.common.web.filter;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.core.JwtValidator;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.DigestUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
@Slf4j
@Data
@Component
@ConfigurationProperties(prefix = "global-auth")
public class GlobalAuthorityInterceptor extends HandlerInterceptorAdapter {
private List<String> includeUrlPattern;
private List<String> excludeUrlPattern;
private static final String CONTENT_TYPE = "application/json;charset=utf-8";
private static final String TOKEN_ILLEGAL = "40001";
private static final String TOKEN_KICK = "40002";
private static final String TOKEN_INVALID = "40003";
private static final String KYLIN_STATION_JWT_VALID = "/kylin/station/**";
private final static AntPathMatcher antPathMatcher = new AntPathMatcher();
@Autowired
JwtValidator jwtValidator;
@Autowired
RedisUtil redisUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String authorization = request.getHeader(CurrentUtil.uToken), uri = request.getRequestURI(),
responseCode = null, token = null, currentUid = null;
if (StringUtils.isNotBlank(authorization) && StringUtils.length(authorization) > 7) {
token = authorization.substring(7);
try {
// 解析没有异常则表示token验证通过,如有必要可根据自身需求增加验证逻辑
Claims claims = jwtValidator.parse(token);
currentUid = (String) claims.get(CurrentUtil.uID);
request.setAttribute(CurrentUtil.uToken, token);
request.setAttribute(CurrentUtil.uID, currentUid);
request.setAttribute(CurrentUtil.uTag, JsonUtils.toJson(claims));
} catch (ExpiredJwtException expiredJwtEx) {
responseCode = TOKEN_INVALID;
} catch (Exception ex) {
responseCode = TOKEN_ILLEGAL;
}
} else {
responseCode = TOKEN_ILLEGAL;
}
for (String urlPattern : excludeUrlPattern) {
if (antPathMatcher.match(urlPattern, uri)) {
return true;
}
}
if (StringUtils.isNotEmpty(responseCode)) {
this.responseHandler(response, responseCode);
return false;
}
if (StringUtils.isEmpty(currentUid)) {
this.responseHandler(response, TOKEN_ILLEGAL);
return false;
}
if (this.authorityHandler(response, uri, token, currentUid)) {
return true;
}
this.responseHandler(response, responseCode);
return false;
}
private void responseHandler(HttpServletResponse response, String responseCode) throws IOException {
ResponseDto<Object> responseDto = ResponseDto.failure(ErrorMapping.get(responseCode));
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType(CONTENT_TYPE);
response.getWriter().write(JsonUtils.toJson(responseDto));
}
private boolean authorityHandler(HttpServletResponse response, String uri, String token, String currentUid) throws IOException {
if (antPathMatcher.match(KYLIN_STATION_JWT_VALID, uri)) {// 专业版APP
// adam:identity:sso:${uid}:MD5(${token})=${1-在线|0-离线}
// String ssoUidM5TokenKey = jwtValidator.getSsoRedisKey()
// .concat(uid).concat(":").concat(DigestUtils.md5DigestAsHex(uToken.getBytes(StandardCharsets.UTF_8)));
// Integer online = (Integer) redisUtil.get(ssoUidM5TokenKey);
// if (null == online || online != 1) {
// this.respHandler(ctx, TOKEN_INVALID);
// } else {
return true;
// }
} else {
// adam:identity:sso:${uid}=MD5(${token})
String ssoKey = jwtValidator.getSsoRedisKey().concat(currentUid), md5Token;
if (StringUtils.isEmpty(md5Token = (String) redisUtil.get(ssoKey))) {
// 已离线
this.responseHandler(response, TOKEN_INVALID);
return false;
} else {
// 与在线TOKEN比对
if (md5Token.equals(DigestUtils.md5DigestAsHex(token.getBytes(StandardCharsets.UTF_8)))) {
// 一致则放行
return true;
} else {
// 不一致则被踢下线
this.responseHandler(response, TOKEN_KICK);
return false;
}
}
}
}
}
...@@ -55,10 +55,6 @@ ...@@ -55,10 +55,6 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId> <artifactId>spring-boot-starter-security</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
......
package com.liquidnet.service.adam.config;
import com.liquidnet.common.web.config.CorsConfig;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AdamCorsConfig extends CorsConfig {
}
package com.liquidnet.service.adam.config;
import com.liquidnet.common.web.config.WebMvcConfig;
import com.liquidnet.common.web.filter.GlobalAuthorityInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@Configuration
public class AdamWebMvcConfig extends WebMvcConfig {
@Autowired
GlobalAuthorityInterceptor globalAuthorityInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(globalAuthorityInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
40001=非法TOKEN
40002=被踢下线喽
40003=TOKEN失效
# ------------------------ 4开头错误码作系统保留
10001=验证码发送失败 10001=验证码发送失败
10002=验证码无效 10002=验证码无效
10003= 10003=
...@@ -56,3 +61,7 @@ ...@@ -56,3 +61,7 @@
10502=会员订单回调处理失败,该订单已处理 10502=会员订单回调处理失败,该订单已处理
10503=会员订单回调处理失败,订单金额有误 10503=会员订单回调处理失败,订单金额有误
10504=会员卡信息不存在,请核实 10504=会员卡信息不存在,请核实
...@@ -22,11 +22,6 @@ ...@@ -22,11 +22,6 @@
<artifactId>liquidnet-common-base</artifactId> <artifactId>liquidnet-common-base</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-web</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>com.liquidnet</groupId> <groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-service-base</artifactId> <artifactId>liquidnet-common-service-base</artifactId>
......
...@@ -42,11 +42,6 @@ ...@@ -42,11 +42,6 @@
<artifactId>liquidnet-common-web</artifactId> <artifactId>liquidnet-common-web</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-cache-redis</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>com.liquidnet</groupId> <groupId>com.liquidnet</groupId>
......
...@@ -6,7 +6,7 @@ import org.springframework.web.cors.CorsConfiguration; ...@@ -6,7 +6,7 @@ import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter; import org.springframework.web.filter.CorsFilter;
@Configuration //@Configuration
public class CorsConfig { public class CorsConfig {
private CorsConfiguration buildConfig() { private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration(); CorsConfiguration corsConfiguration = new CorsConfiguration();
......
...@@ -26,9 +26,9 @@ import java.util.List; ...@@ -26,9 +26,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
@Slf4j @Slf4j
@Data //@Data
@Component //@Component
@ConfigurationProperties(prefix = "global-auth") //@ConfigurationProperties(prefix = "global-auth")
public class GlobalAuthFilter extends ZuulFilter { public class GlobalAuthFilter extends ZuulFilter {
private List<String> includeUrl; private List<String> includeUrl;
private List<String> includeUrlPattern; private List<String> includeUrlPattern;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment