From 667a7c5a6414352385c867898821499327599d9c Mon Sep 17 00:00:00 2001
From: yinzuomei <57602893@qq.com>
Date: Thu, 19 Mar 2020 23:16:50 +0800
Subject: [PATCH] =?UTF-8?q?@LoginUser=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/epmet/feign/EpmetUserFeignClient.java | 2 +-
.../commons/tools/annotation/LoginUser.java | 35 ++++
epmet-gateway/pom.xml | 11 ++
.../java/com/epmet/GatewayApplication.java | 14 +-
.../main/java/com/epmet/config/WebConfig.java | 49 ++++++
.../com/epmet/exception/ModuleErrorCode.java | 26 +++
.../java/com/epmet/filter/AuthFilter.java | 6 +-
.../filter/CpAuthGatewayFilterFactory.java | 159 ++++++++++++++++++
.../java/com/epmet/filter/CpProperty.java | 27 +++
.../com/epmet/jwt/JwtTokenProperties.java | 41 +++++
.../java/com/epmet/jwt/JwtTokenUtils.java | 132 +++++++++++++++
...oginUserHandlerMethodArgumentResolver.java | 66 ++++++++
.../src/main/resources/bootstrap.yml | 23 +++
epmet-module/oper-crm/oper-crm-server/pom.xml | 6 +
.../epmet/controller/CustomerController.java | 10 +-
15 files changed, 601 insertions(+), 6 deletions(-)
create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/LoginUser.java
create mode 100644 epmet-gateway/src/main/java/com/epmet/config/WebConfig.java
create mode 100644 epmet-gateway/src/main/java/com/epmet/exception/ModuleErrorCode.java
create mode 100644 epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java
create mode 100644 epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java
create mode 100644 epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenProperties.java
create mode 100644 epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java
create mode 100644 epmet-gateway/src/main/java/com/epmet/resolver/LoginUserHandlerMethodArgumentResolver.java
diff --git a/epmet-auth/src/main/java/com/epmet/feign/EpmetUserFeignClient.java b/epmet-auth/src/main/java/com/epmet/feign/EpmetUserFeignClient.java
index 0610da1880..198df8a4dd 100644
--- a/epmet-auth/src/main/java/com/epmet/feign/EpmetUserFeignClient.java
+++ b/epmet-auth/src/main/java/com/epmet/feign/EpmetUserFeignClient.java
@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.PostMapping;
* @Author yinzuomei
* @Date 2020/3/16 14:48
*/
-@FeignClient(name = ServiceConstant.EPMET_USER_SERVER, fallback = EpmetUserFeignClientFallback.class)
+@FeignClient(name = ServiceConstant.EPMET_USER_SERVER, fallback = EpmetUserFeignClientFallback.class,url = "http://localhost:8087")
public interface EpmetUserFeignClient {
/**
diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/LoginUser.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/LoginUser.java
new file mode 100644
index 0000000000..1472d52d49
--- /dev/null
+++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/LoginUser.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright 2018 人人开源 http://www.renren.io
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.epmet.commons.tools.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 登录用户信息
+ *
+ * @author chenshun
+ * @email sunlightcs@gmail.com
+ * @date 2017-03-23 20:39
+ */
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LoginUser {
+
+}
diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml
index 9f743f6aee..5ae326d135 100644
--- a/epmet-gateway/pom.xml
+++ b/epmet-gateway/pom.xml
@@ -47,6 +47,17 @@
io.springfox
springfox-swagger-ui
+
+ io.jsonwebtoken
+ jjwt
+ 0.7.0
+
+
+ com.epmet
+ epmet-common-clienttoken
+ 2.0.0
+ compile
+
diff --git a/epmet-gateway/src/main/java/com/epmet/GatewayApplication.java b/epmet-gateway/src/main/java/com/epmet/GatewayApplication.java
index d9c3402533..9be3f5e3c0 100644
--- a/epmet-gateway/src/main/java/com/epmet/GatewayApplication.java
+++ b/epmet-gateway/src/main/java/com/epmet/GatewayApplication.java
@@ -8,10 +8,15 @@
package com.epmet;
+import com.epmet.resolver.LoginUserHandlerMethodArgumentResolver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+import java.util.List;
/**
* 网关服务
@@ -22,10 +27,15 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
-public class GatewayApplication {
+public class GatewayApplication extends WebMvcConfigurationSupport {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
-
+ //添加自定义的拦截器
+ @Override
+ public void addArgumentResolvers(List argumentResolvers){
+ super.addArgumentResolvers(argumentResolvers);
+ argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver());
+ }
}
diff --git a/epmet-gateway/src/main/java/com/epmet/config/WebConfig.java b/epmet-gateway/src/main/java/com/epmet/config/WebConfig.java
new file mode 100644
index 0000000000..9808b30063
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/config/WebConfig.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.config;
+
+import com.epmet.resolver.LoginUserHandlerMethodArgumentResolver;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.epmet.commons.tools.security.resolver.UserDetailHandlerMethodArgumentResolver;
+import com.epmet.commons.tools.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.ByteArrayHttpMessageConverter;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.ResourceHttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+import java.util.TimeZone;
+
+/**
+ * MVC配置
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+// @Autowired
+// private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;
+
+ @Override
+ public void addArgumentResolvers(List argumentResolvers) {
+ argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver());
+ }
+}
diff --git a/epmet-gateway/src/main/java/com/epmet/exception/ModuleErrorCode.java b/epmet-gateway/src/main/java/com/epmet/exception/ModuleErrorCode.java
new file mode 100644
index 0000000000..36deccb213
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/exception/ModuleErrorCode.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.exception;
+
+
+import com.epmet.commons.tools.exception.ErrorCode;
+
+/**
+ * 模块错误编码,由9位数字组成,前6位为模块编码,后3位为业务编码
+ *
+ * 如:100001001(100001代表模块,001代表业务代码)
+ *
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public interface ModuleErrorCode extends ErrorCode {
+ int TOKEN_NOT_EMPTY = 100005001;
+ int TOKEN_INVALID = 100005002;
+}
diff --git a/epmet-gateway/src/main/java/com/epmet/filter/AuthFilter.java b/epmet-gateway/src/main/java/com/epmet/filter/AuthFilter.java
index 3c2dd5a28c..4c83d810da 100644
--- a/epmet-gateway/src/main/java/com/epmet/filter/AuthFilter.java
+++ b/epmet-gateway/src/main/java/com/epmet/filter/AuthFilter.java
@@ -14,6 +14,8 @@ import com.epmet.commons.tools.constant.Constant;
import com.epmet.commons.tools.security.user.UserDetail;
import com.epmet.commons.tools.utils.Result;
import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
@@ -41,9 +43,10 @@ import java.util.List;
@Configuration
@ConfigurationProperties(prefix = "renren")
public class AuthFilter implements GlobalFilter {
+ private Logger logger = LoggerFactory.getLogger(getClass());
private final AntPathMatcher antPathMatcher = new AntPathMatcher();
@Autowired
- private ResourceFeignClient resourceFeignClient;
+ public ResourceFeignClient resourceFeignClient;
/**
* 不拦截的urls
*/
@@ -56,6 +59,7 @@ public class AuthFilter implements GlobalFilter {
//请求放行,无需验证权限
if(pathMatcher(requestUri)){
+ logger.info("AuthFilter当前requestUri=["+requestUri+"]AuthFilter已放行");
return chain.filter(exchange);
}
diff --git a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java
new file mode 100644
index 0000000000..bd04c0d8be
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java
@@ -0,0 +1,159 @@
+
+package com.epmet.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.epmet.common.token.dto.TokenDto;
+import com.epmet.common.token.util.CpUserDetailRedis;
+import com.epmet.commons.tools.constant.Constant;
+import com.epmet.commons.tools.exception.ErrorCode;
+import com.epmet.commons.tools.exception.RenException;
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.jwt.JwtTokenUtils;
+import io.jsonwebtoken.Claims;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * app接口权限过滤器
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Component("CpAuth")
+public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory {
+ private Logger logger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private CpProperty cpProperty;
+ private final AntPathMatcher antPathMatcher = new AntPathMatcher();
+ @Autowired
+ private JwtTokenUtils jwtTokenUtils;
+ @Autowired
+ private CpUserDetailRedis cpUserDetailRedis;
+
+
+ @Override
+ public List shortcutFieldOrder() {
+ return Arrays.asList("enabled");
+ }
+
+ public CpAuthGatewayFilterFactory() {
+ super(CpAuthConfig.class);
+ }
+
+ @Override
+ public GatewayFilter apply(CpAuthConfig config) {
+ return (exchange, chain) -> {
+ if (!config.isEnabled()) {
+ logger.info("===========");
+ return chain.filter(exchange);
+ }
+
+ ServerHttpRequest request = exchange.getRequest();
+ String requestUri = request.getPath().pathWithinApplication().value();
+
+ //请求放行,无需验证权限
+ if (!pathMatcher(requestUri)) {
+ return chain.filter(exchange);
+ }
+ logger.info("CpAuthGatewayFilterFactory当前requestUri=[" + requestUri + "]CpAuthGatewayFilterFactory拦截成功");
+ HttpHeaders headers = request.getHeaders();
+ String token = headers.getFirst(Constant.AUTHORIZATION_HEADER);
+// String token = request.getQueryParams().getFirst(Constant.TOKEN_HEADER);
+ if (StringUtils.isBlank(token)) {
+ token = request.getQueryParams().getFirst(Constant.AUTHORIZATION_HEADER);
+ if (StringUtils.isBlank(token)) {
+ return chain.filter(exchange);
+ }
+ }
+ TokenDto user = this.getLoginUserInfo(token);
+ //当前登录用户userId,添加到header中
+ if (user != null) {
+ String redisKey = user.getApp() + "-" + user.getClient() + "-" + user.getUserId();
+ logger.info("redisKey=" + redisKey);
+ ServerHttpRequest build = exchange.getRequest().mutate().header(Constant.APP_USER_KEY, redisKey).build();
+ return chain.filter(exchange.mutate().request(build).build());
+ }
+ return chain.filter(exchange);
+ };
+ }
+
+ public TokenDto getLoginUserInfo(String token) {
+ //是否过期
+ Claims claims = jwtTokenUtils.getClaimByToken(token);
+ if (claims == null || jwtTokenUtils.isTokenExpired(claims.getExpiration())) {
+ throw new RenException(ErrorCode.UNAUTHORIZED);
+ }
+ //获取用户ID
+ String app = (String) claims.get("app");
+ String client = (String) claims.get("client");
+ String userId = (String) claims.get("userId");
+ //查询Redis,如果没数据,则保持用户信息到Redis
+ TokenDto tokenDto = cpUserDetailRedis.get(app, client, userId);
+ if (null == tokenDto) {
+ throw new RenException(ErrorCode.REGION_SUB_DELETE_ERROR, Constant.TOKEN_HEADER);
+ }
+ //过期时间
+ long expire = (claims.getExpiration().getTime() - System.currentTimeMillis()) / 1000;
+ cpUserDetailRedis.set(tokenDto, expire);
+ return tokenDto;
+ }
+
+ private Mono response(ServerWebExchange exchange, Object object) {
+ String json = JSON.toJSONString(object);
+ DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8));
+ exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8);
+ exchange.getResponse().setStatusCode(HttpStatus.OK);
+ return exchange.getResponse().writeWith(Flux.just(buffer));
+ }
+
+ private boolean pathMatcher(String requestUri) {
+ for (String url : cpProperty.getSwaggerUrls()) {
+ if (antPathMatcher.match(url, requestUri)) {
+ return false;
+ }
+ }
+ for (String url : cpProperty.getUrls()) {
+ if (antPathMatcher.match(url, requestUri)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static class CpAuthConfig {
+
+ /**
+ * 控制是否开启认证
+ */
+ private boolean enabled;
+
+ public CpAuthConfig() {
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+ }
+}
diff --git a/epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java b/epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java
new file mode 100644
index 0000000000..9d6b103f20
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java
@@ -0,0 +1,27 @@
+package com.epmet.filter;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author rongchao
+ * @Date 19-5-17
+ */
+@Data
+@Component
+@EnableConfigurationProperties
+@ConfigurationProperties(prefix = "epmet")
+public class CpProperty {
+
+ private List urls;
+
+ /**
+ * 不处理token,直接通过
+ */
+ private List swaggerUrls;
+
+}
diff --git a/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenProperties.java b/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenProperties.java
new file mode 100644
index 0000000000..ddff4febcc
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenProperties.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.jwt;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Jwt
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Configuration
+@ConfigurationProperties(prefix = "jwt.token")
+public class JwtTokenProperties {
+ private String secret;
+ private int expire;
+
+ public String getSecret() {
+ return secret;
+ }
+
+ public void setSecret(String secret) {
+ this.secret = secret;
+ }
+
+ public int getExpire() {
+ return expire;
+ }
+
+ public void setExpire(int expire) {
+ this.expire = expire;
+ }
+}
diff --git a/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java b/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java
new file mode 100644
index 0000000000..33baf31c52
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.jwt;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import org.apache.commons.codec.binary.Base64;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Jwt工具类
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Component
+public class JwtTokenUtils {
+ private static final Logger logger = LoggerFactory.getLogger(JwtTokenUtils.class);
+
+ @Autowired
+ private JwtTokenProperties jwtProperties;
+
+ /**
+ * 生成jwt token 弃用
+ */
+ @Deprecated
+ public String generateToken(String userId) {
+ return Jwts.builder()
+ .setHeaderParam("typ", "JWT")
+ .setSubject(userId)
+ .setIssuedAt(new Date())
+ .setExpiration(DateTime.now().plusSeconds(jwtProperties.getExpire()).toDate())
+ .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
+ .compact();
+ }
+
+ public Claims getClaimByToken(String token) {
+ try {
+ return Jwts.parser()
+ .setSigningKey(jwtProperties.getSecret())
+ .parseClaimsJws(token)
+ .getBody();
+ } catch (Exception e) {
+ logger.debug("validate is token error, token = " + token, e);
+ return null;
+ }
+ }
+
+ /**
+ * @return java.util.Date
+ * @param token
+ * @Author yinzuomei
+ * @Description 获取token的有效期截止时间
+ * @Date 2020/3/18 22:17
+ **/
+ public Date getExpiration(String token){
+ try {
+ return Jwts.parser()
+ .setSigningKey(jwtProperties.getSecret())
+ .parseClaimsJws(token)
+ .getBody().getExpiration();
+ } catch (Exception e) {
+ logger.debug("validate is token error, token = " + token, e);
+ return null;
+ }
+ }
+
+ /**
+ * @param map
+ * @return java.lang.String
+ * @Author yinzuomei
+ * @Description 根据app+client+userId生成token
+ * @Date 2020/3/18 22:29
+ **/
+ public String createToken(Map map) {
+ return Jwts.builder()
+ .setHeaderParam("typ", "JWT")
+ .setClaims(map)
+ .setIssuedAt(new Date())
+ .setExpiration(DateTime.now().plusSeconds(jwtProperties.getExpire()).toDate())
+ .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
+ .compact();
+ }
+
+ /**
+ * token是否过期
+ *
+ * @return true:过期
+ */
+ public boolean isTokenExpired(Date expiration) {
+ return expiration.before(new Date());
+ }
+
+ public static void main(String[] args) {
+ Map map=new HashMap<>();
+ map.put("app","gov");
+ map.put("client","wxmp");
+ map.put("userId","100526ABC");
+ String tokenStr=Jwts.builder()
+ .setHeaderParam("typ", "JWT")
+ .setClaims(map)
+ .setIssuedAt(new Date())
+ .setExpiration(DateTime.now().plusSeconds(604800).toDate())
+ .signWith(SignatureAlgorithm.HS512, "7016867071f0ebf1c46f123eaaf4b9d6[elink.epmet]")
+ .compact();
+ System.out.println(tokenStr);
+ Claims claims= Jwts.parser()
+ .setSigningKey("7016867071f0ebf1c46f123eaaf4b9d6[elink.epmet]")
+ .parseClaimsJws(tokenStr)
+ .getBody();
+ System.out.println("app="+ claims.get("app"));
+ System.out.println("client="+ claims.get("client"));
+ System.out.println("userId="+ claims.get("userId"));
+ }
+
+}
diff --git a/epmet-gateway/src/main/java/com/epmet/resolver/LoginUserHandlerMethodArgumentResolver.java b/epmet-gateway/src/main/java/com/epmet/resolver/LoginUserHandlerMethodArgumentResolver.java
new file mode 100644
index 0000000000..332e01d5d2
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/resolver/LoginUserHandlerMethodArgumentResolver.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.resolver;
+
+import com.alibaba.fastjson.JSON;
+import com.epmet.common.token.dto.TokenDto;
+import com.epmet.common.token.util.CpUserDetailRedis;
+import com.epmet.commons.tools.annotation.LoginUser;
+import com.epmet.commons.tools.constant.Constant;
+import com.epmet.commons.tools.exception.RenException;
+import com.epmet.exception.ModuleErrorCode;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.MethodParameter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.support.WebDataBinderFactory;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.method.support.ModelAndViewContainer;
+
+/**
+ * 有@LoginUser注解的方法参数,注入当前登录用户
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+//@Component
+public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
+ private Logger logger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private CpUserDetailRedis cpUserDetailRedis;
+
+ public LoginUserHandlerMethodArgumentResolver(){
+
+ }
+
+ @Override
+ public boolean supportsParameter(MethodParameter parameter) {
+ logger.info("enter supportsParameter ");
+ return parameter.getParameterType().isAssignableFrom(TokenDto.class) && parameter.hasParameterAnnotation(LoginUser.class);
+ }
+
+ @Override
+ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
+ NativeWebRequest request, WebDataBinderFactory factory) throws Exception {
+ //app-client-userId
+ String redisKey = request.getHeader(Constant.APP_USER_KEY);
+ if (StringUtils.isEmpty(redisKey)) {
+ throw new RenException(ModuleErrorCode.TOKEN_INVALID);
+ }
+ String[] keyArray=redisKey.split("-");
+ String app=keyArray[0];
+ String client=keyArray[1];
+ String userId=keyArray[2];
+ TokenDto tokenDto = cpUserDetailRedis.get(app,client,userId);
+ logger.info("resolveArgument TokenDto:"+ JSON.toJSONString(tokenDto));
+ return tokenDto;
+ }
+}
diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml
index efb7537572..45fbec75b5 100644
--- a/epmet-gateway/src/main/resources/bootstrap.yml
+++ b/epmet-gateway/src/main/resources/bootstrap.yml
@@ -114,6 +114,7 @@ spring:
- Path=${server.servlet.context-path}/oper/crm/**
filters:
- StripPrefix=1
+ - CpAuth=true
#居民端陌生人导览
- id: resi-guide-server
uri: @gateway.routes.resi-guide-server.uri@
@@ -170,6 +171,9 @@ renren:
- /oper/customize/**
- /oper/crm/**
- /resi/guide/**
+ - /epmetuser/**
+ - /gov/org/**
+ - /oper/access/**
management:
endpoints:
web:
@@ -217,3 +221,22 @@ hystrix:
ribbon:
ReadTimeout: 300000
ConnectTimeout: 300000
+
+epmet:
+ # 党群e事通
+ urls:
+ - /oper/customize/**
+ - /oper/crm/**
+ - /resi/guide/**
+ - /epmetuser/**
+ - /gov/org/**
+ - /oper/access/**
+ # 不处理token,直接通过
+ swaggerUrls:
+
+jwt:
+ token:
+ #秘钥
+ secret: 7016867071f0ebf1c46f123eaaf4b9d6[elink.epmet]
+ #token有效时长,默认7天,单位秒
+ expire: 604800
diff --git a/epmet-module/oper-crm/oper-crm-server/pom.xml b/epmet-module/oper-crm/oper-crm-server/pom.xml
index 9695bb43b3..39feec80f4 100644
--- a/epmet-module/oper-crm/oper-crm-server/pom.xml
+++ b/epmet-module/oper-crm/oper-crm-server/pom.xml
@@ -58,6 +58,12 @@
feign-httpclient
10.3.0
+
+ com.epmet
+ epmet-common-clienttoken
+ 2.0.0
+ compile
+
diff --git a/epmet-module/oper-crm/oper-crm-server/src/main/java/com/epmet/controller/CustomerController.java b/epmet-module/oper-crm/oper-crm-server/src/main/java/com/epmet/controller/CustomerController.java
index 4ec04148d3..20b331a398 100644
--- a/epmet-module/oper-crm/oper-crm-server/src/main/java/com/epmet/controller/CustomerController.java
+++ b/epmet-module/oper-crm/oper-crm-server/src/main/java/com/epmet/controller/CustomerController.java
@@ -17,6 +17,9 @@
package com.epmet.controller;
+import com.alibaba.fastjson.JSON;
+import com.epmet.common.token.annotation.LoginUser;
+import com.epmet.common.token.dto.TokenDto;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.utils.ExcelUtils;
import com.epmet.commons.tools.utils.Result;
@@ -29,6 +32,8 @@ import com.epmet.dto.CustomerDTO;
import com.epmet.dto.result.ValidCustomerResultDTO;
import com.epmet.excel.CustomerExcel;
import com.epmet.service.CustomerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -91,7 +96,7 @@ public class CustomerController {
List list = customerService.list(params);
ExcelUtils.exportExcelToTarget(response, null, list, CustomerExcel.class);
}
-
+ private Logger logger = LoggerFactory.getLogger(getClass());
/**
* @param
* @return com.epmet.commons.tools.utils.Result
@@ -100,7 +105,8 @@ public class CustomerController {
* @Date 2020/3/11 21:58
**/
@GetMapping("getvalidcustomerlist")
- public Result> getValidCustomerList() {
+ public Result> getValidCustomerList(@LoginUser TokenDto tokenDTO) {
+ logger.info("不成功便成仁===================================="+ JSON.toJSONString(tokenDTO));
return customerService.getValidCustomerList();
}
}