diff --git a/pom.xml b/pom.xml
index 6cdbeb88..6d7b000f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,8 @@
sop-test
sop-sdk
sop-website
-
+ sop-openapi
+
1.8
diff --git a/sop-gateway/pom.xml b/sop-gateway/pom.xml
index 385e8a82..dc4ad9b2 100644
--- a/sop-gateway/pom.xml
+++ b/sop-gateway/pom.xml
@@ -67,6 +67,16 @@
1.18.4
provided
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ org.apache.commons
+ commons-lang3
+
diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/config/MyConfig.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/config/MyConfig.java
index 9d32bba9..d9d0475a 100644
--- a/sop-gateway/src/main/java/com/gitee/sop/gateway/config/MyConfig.java
+++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/config/MyConfig.java
@@ -1,23 +1,48 @@
package com.gitee.sop.gateway.config;
+import com.alibaba.fastjson.JSONObject;
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
+@Slf4j
@Component
public class MyConfig {
+ @Autowired
+ private StringRedisTemplate redisTemplate;
+ private static String APP_AUTH_TOKEN_PREFIX = "com.gitee.sop.oauth2_access_token:";
+
+ public static String getAccessTokenKey(String accessToken) {
+ return APP_AUTH_TOKEN_PREFIX + accessToken;
+ }
+
+
@PostConstruct
public void after() {
ApiConfig.getInstance().setTokenValidator(apiParam -> {
// 获取客户端传递过来的token
- String token = apiParam.fetchAccessToken();
- return !StringUtils.isBlank(token);
- // TODO: 校验token有效性,可以从redis中读取
+ try {
+ String token = apiParam.fetchAccessToken();
+ if (StringUtils.isBlank(token)) {
+ return Boolean.FALSE;
+ }
+ String json = redisTemplate.opsForValue().get(getAccessTokenKey(token));
+ if(StringUtils.isEmpty(json)) {
+ return Boolean.FALSE;
+ }
- // 返回true表示这个token真实、有效
+ JSONObject userInfo = JSONObject.parseObject(json);
+ return userInfo != null;
+ } catch (Exception e) {
+ log.error("redisError", e);
+ return Boolean.FALSE;
+ }
});
}
}
\ No newline at end of file
diff --git a/sop-gateway/src/main/resources/application-dev.properties b/sop-gateway/src/main/resources/application-dev.properties
index 0ba27c4c..e0420b8f 100644
--- a/sop-gateway/src/main/resources/application-dev.properties
+++ b/sop-gateway/src/main/resources/application-dev.properties
@@ -13,4 +13,14 @@ register.url=127.0.0.1:8848
# 如果需要传输大文本可以把值设置高一点
spring.codec.max-in-memory-size=262144
-logging.level.com.gitee=debug
\ No newline at end of file
+logging.level.com.gitee=debug
+
+spring.redis.host=localhost
+spring.redis.port=6379
+spring.redis.jedis.pool.min-idle=1
+spring.redis.jedis.pool.max-idle=5
+spring.redis.jedis.pool.max-wait=-1
+spring.redis.jedis.pool.max-active=8
+spring.redis.timeout=60000
+spring.redis.database=0
+spring.redis.password=
\ No newline at end of file
diff --git a/sop-openapi/pom.xml b/sop-openapi/pom.xml
new file mode 100644
index 00000000..c231dc6c
--- /dev/null
+++ b/sop-openapi/pom.xml
@@ -0,0 +1,132 @@
+
+
+
+ 4.0.0
+
+ com.gitee.sop
+ sop-parent
+ 4.1.0-SNAPSHOT
+ ../pom.xml
+
+ com.gitee.sop.openapi
+ sop-openapi
+ sop-openapi
+
+
+ 1.1.0
+
+
+
+
+ com.gitee.sop
+ sop-service-common
+ 4.1.0-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+
+
+ io.springfox
+ springfox-swagger2
+ 2.9.2
+
+
+ com.github.xiaoymin
+ swagger-bootstrap-ui
+ 1.9.5
+
+
+ io.springfox
+ springfox-swagger-ui
+ 2.9.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+
+ net.oschina.durcframework
+ fastmybatis-spring-boot-starter
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+ ${apollo.version}
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.12.4
+
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+
+
diff --git a/sop-openapi/src/main/java/com/gitee/sop/openapi/SopOpenapiApplication.java b/sop-openapi/src/main/java/com/gitee/sop/openapi/SopOpenapiApplication.java
new file mode 100644
index 00000000..29675788
--- /dev/null
+++ b/sop-openapi/src/main/java/com/gitee/sop/openapi/SopOpenapiApplication.java
@@ -0,0 +1,14 @@
+package com.gitee.sop.openapi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@EnableDiscoveryClient
+@SpringBootApplication
+public class SopOpenapiApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SopOpenapiApplication.class, args);
+ }
+}
diff --git a/sop-openapi/src/main/java/com/gitee/sop/openapi/config/ApolloApplicationConfig.java b/sop-openapi/src/main/java/com/gitee/sop/openapi/config/ApolloApplicationConfig.java
new file mode 100644
index 00000000..4b3adc8c
--- /dev/null
+++ b/sop-openapi/src/main/java/com/gitee/sop/openapi/config/ApolloApplicationConfig.java
@@ -0,0 +1,41 @@
+package com.gitee.sop.openapi.config;
+
+import com.ctrip.framework.apollo.Config;
+import com.ctrip.framework.apollo.ConfigService;
+import com.ctrip.framework.apollo.model.ConfigChange;
+import com.ctrip.framework.apollo.model.ConfigChangeEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+/***
+ *
+ * @author wangping created on 2020/11/5 16:06
+ */
+@Slf4j
+@Component
+public class ApolloApplicationConfig implements BeanPostProcessor {
+
+
+ @PostConstruct
+ public void init() {
+ loadApplication();
+ }
+
+ private void loadApplication() {
+ Config config = ConfigService.getAppConfig();
+ config.addChangeListener(this::getChangedEvent);
+ }
+
+
+ private void getChangedEvent(ConfigChangeEvent changeEvent) {
+ for (String key : changeEvent.changedKeys()) {
+ ConfigChange change = changeEvent.getChange(key);
+ log.info("Found change - key: {}, oldValue: {}, newValue: {}, changeType:{}",
+ change.getPropertyName(), change.getOldValue(),
+ change.getNewValue(), change.getChangeType());
+ }
+ }
+}
diff --git a/sop-openapi/src/main/java/com/gitee/sop/openapi/config/OpenapiConfig.java b/sop-openapi/src/main/java/com/gitee/sop/openapi/config/OpenapiConfig.java
new file mode 100644
index 00000000..a0a597fa
--- /dev/null
+++ b/sop-openapi/src/main/java/com/gitee/sop/openapi/config/OpenapiConfig.java
@@ -0,0 +1,33 @@
+package com.gitee.sop.openapi.config;
+
+import com.gitee.sop.servercommon.bean.ServiceConfig;
+import com.gitee.sop.servercommon.swagger.SwaggerSupport;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+public class OpenapiConfig {
+
+ static {
+ ServiceConfig.getInstance().getI18nModules().add("i18n/isp/auth_error");
+ }
+
+
+ /**
+ * 开启文档,本地微服务文档地址:http://localhost:2222/doc.html
+ * http://ip:port/v2/api-docs
+ */
+ @Configuration
+ @EnableSwagger2
+ public static class Swagger2 extends SwaggerSupport {
+ @Override
+ protected String getDocTitle() {
+ return "开放平台API";
+ }
+
+ @Override
+ protected boolean swaggerAccessProtected() {
+ return false;
+ }
+ }
+}
diff --git a/sop-openapi/src/main/java/com/gitee/sop/openapi/config/RedisConfig.java b/sop-openapi/src/main/java/com/gitee/sop/openapi/config/RedisConfig.java
new file mode 100644
index 00000000..84b6b23b
--- /dev/null
+++ b/sop-openapi/src/main/java/com/gitee/sop/openapi/config/RedisConfig.java
@@ -0,0 +1,43 @@
+package com.gitee.sop.openapi.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig {
+
+
+ @Bean
+ public RedisTemplate redisTemplate(@Autowired RedisConnectionFactory redisConnectionFactory) {
+
+ RedisTemplate redisTemplate = new RedisTemplate();
+ redisTemplate.setConnectionFactory(redisConnectionFactory);
+
+ Jackson2JsonRedisSerializer