From f99c724ecf8cd933d750fa93da8bbfd9d863e097 Mon Sep 17 00:00:00 2001 From: guoc <770292311@qq.com> Date: Thu, 26 Nov 2020 17:19:17 +0800 Subject: [PATCH 1/5] feat(init): springboot-demos-init --- .../conditonalDemo/ConditionOnServerType.java | 25 ++ .../conditonalDemo/OnServerTypeCOndition.java | 12 + .../gsean/bean/conditonalDemo/ServerType.java | 12 + .../conditonalDemo/conditionBeanConfig.java | 12 + .../bean/enableBeanDemo/EnableServer.java | 16 ++ .../enableBeanDemo/ServerImportSelector.java | 12 + .../com/gsean/bean/enableBeanDemo/Type.java | 12 + .../bean/enableBeanDemo/enableBeanDemo.java | 12 + .../src/main/resources/application.properties | 0 .../com/gsean/bean/BeanApplicationTest2.java | 59 +++++ jwt-demos/jwt-sample/pom.xml | 15 ++ .../jwt/sample/JwtSampleApplication.java | 12 + .../jwt/sample/JwtSampleApplicationTest.java | 13 ++ jwt-demos/jwt-spring-boot-starter/pom.xml | 15 ++ .../java/com/gsean/jwt/JwtAutoConfig.java | 12 + .../com/gsean/jwt/JwtInvalidException.java | 12 + .../java/com/gsean/jwt/JwtTokenService.java | 12 + .../com/gsean/jwt/JwtTokenServiceImpl.java | 12 + .../src/main/java/com/gsean/jwt/JwtUtil.java | 12 + .../main/java/com/gsean/jwt/PayloadDto.java | 12 + .../main/resources/META-INF/spring.factories | 2 + .../src/main/resources/jwt.jks | Bin 0 -> 2243 bytes jwt-demos/pom.xml | 15 ++ redis-demos/redis-spring-boot-starter/pom.xml | 15 ++ .../starter/redis/GseanRedisAutoConfig.java | 52 +++++ .../starter/redis/util/GseanRedisUtil.java | 216 ++++++++++++++++++ .../main/resources/META-INF/spring.factories | 2 + security-demo/pom.xml | 15 ++ .../security-inmemory-sample/pom.xml | 15 ++ .../InmemorySecuritySampleApplication.java | 12 + .../config/AuthorizationServerConfig.java | 14 ++ .../sample/config/ResourceServerConfig.java | 33 +++ .../sample/config/WebSecurityConfig.java | 12 + .../src/main/resources/application.yml | 0 .../security-inmemory-separate-sample/pom.xml | 15 ++ .../security-authentication-server/pom.xml | 15 ++ .../auth2/AuthenticationApplication.java | 12 + .../config/AuthorizationServerConfig.java | 57 +++++ .../gsean/auth2/config/WebSecurityConfig.java | 75 ++++++ .../security-resource-server/pom.xml | 15 ++ .../com/gsean/auth2/ResourceApplication.java | 12 + .../auth2/config/ResourceServerConfig.java | 31 +++ .../pom.xml | 33 +++ .../jwt-auth-server/pom.xml | 15 ++ ...SecurityTokenJwtAuthServerApplication.java | 35 +++ .../jwt/config/AuthorizationServerConfig.java | 67 ++++++ .../token/jwt/config/JwtTokenEnhancer.java | 12 + .../jwt/config/ResourceServerConfig.java | 37 +++ .../token/jwt/config/TokenStoreConfig.java | 65 ++++++ .../token/jwt/config/WebSecurityConfig.java | 75 ++++++ .../src/main/resources/application.yml | 9 + .../src/main/resources/jwt.jks | Bin 0 -> 2243 bytes .../jwt-resource-server/pom.xml | 15 ++ ...rityTokenJwtResourceServerApplication.java | 34 +++ .../jwt/config/ResourceServerConfig.java | 37 +++ .../token/jwt/config/TokenStoreConfig.java | 63 +++++ .../src/main/resources/jwt.jks | Bin 0 -> 2243 bytes ...TokenJwtResourceServerApplicationTest.java | 13 ++ .../security-token-jwt-sample/pom.xml | 15 ++ .../mysql-auth-server/pom.xml | 43 ++++ .../mysql/MysqlAuthserverApplication.java | 31 +++ .../config/AuthorizationServerConfig.java | 67 ++++++ .../config/DatabaseTokenStoreConfig.java | 36 +++ .../mysql/config/ResourceServerConfig.java | 37 +++ .../token/mysql/config/WebSecurityConfig.java | 75 ++++++ .../src/main/resources/application.yml | 9 + .../liquibase/changelog/release.init.xml | 15 ++ .../src/main/resources/liquibase/master.xml | 8 + .../main/resources/liquibase/sql/security.sql | 54 +++++ .../mysql-resource-server/pom.xml | 38 +++ .../mysql/MysqlResourceServerApplication.java | 31 +++ .../config/DatabaseTokenStoreConfig.java | 31 +++ .../mysql/config/ResourceServerConfig.java | 52 +++++ .../src/main/resources/application.yml | 7 + .../security-token-mysql-sample/pom.xml | 20 ++ .../security-token-mysql-sample/readme.md | 104 +++++++++ .../security-token-redis-sample/pom.xml | 15 ++ .../redis-auth-server/pom.xml | 15 ++ ...curityTokenRedisAuthServerApplication.java | 35 +++ .../config/AuthorizationServerConfig.java | 76 ++++++ .../redis/config/ResourceServerConfig.java | 37 +++ .../token/redis/config/TokenStoreConfig.java | 35 +++ .../token/redis/config/WebSecurityConfig.java | 75 ++++++ .../src/main/resources/application.yml | 7 + .../redis-resource-server/pom.xml | 15 ++ ...tyTokenRedisResourceServerApplication.java | 35 +++ .../redis/config/ResourceServerConfig.java | 37 +++ .../token/redis/config/TokenStoreConfig.java | 63 +++++ webflux-demo/pom.xml | 15 ++ webflux-demo/webflux-sample/pom.xml | 15 ++ .../sample/WebfluxSampleApplication.java | 12 + .../sample/WebfluxSampleApplicationTest2.java | 13 ++ 92 files changed, 2617 insertions(+) create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java create mode 100644 internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java create mode 100644 internel-demo/bean-demo/src/main/resources/application.properties create mode 100644 internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java create mode 100644 jwt-demos/jwt-sample/pom.xml create mode 100644 jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java create mode 100644 jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java create mode 100644 jwt-demos/jwt-spring-boot-starter/pom.xml create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories create mode 100644 jwt-demos/jwt-spring-boot-starter/src/main/resources/jwt.jks create mode 100644 jwt-demos/pom.xml create mode 100644 redis-demos/redis-spring-boot-starter/pom.xml create mode 100644 redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java create mode 100644 redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java create mode 100644 redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories create mode 100644 security-demo/pom.xml create mode 100644 security-demo/security-inmemory-sample/pom.xml create mode 100644 security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java create mode 100644 security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java create mode 100644 security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java create mode 100644 security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java create mode 100644 security-demo/security-inmemory-sample/src/main/resources/application.yml create mode 100644 security-demo/security-inmemory-separate-sample/pom.xml create mode 100644 security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml create mode 100644 security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java create mode 100644 security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java create mode 100644 security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java create mode 100644 security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml create mode 100644 security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java create mode 100644 security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/jwt.jks create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/resources/jwt.jks create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/MysqlAuthserverApplication.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/AuthorizationServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/WebSecurityConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/application.yml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/changelog/release.init.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/master.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/sql/security.sql create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/MysqlResourceServerApplication.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/resources/application.yml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-mysql-sample/readme.md create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisAuthServerApplication.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/WebSecurityConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/resources/application.yml create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java create mode 100644 webflux-demo/pom.xml create mode 100644 webflux-demo/webflux-sample/pom.xml create mode 100644 webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java create mode 100644 webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java new file mode 100644 index 0000000..2c91c2b --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java @@ -0,0 +1,25 @@ +package com.gsean.bean.enableBeanDemo; + +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:EnableServer + * Description:TODO + * Date:2020/11/20 23:06 + * Author:GSean + * Version: 1.0 + */ +@Documented +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Import(ServerImportSelector.class) +public @interface EnableServer { + /** + * 启动服务类型,默认启动http服务器 + * @return + */ + Type type() ; +} diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java new file mode 100644 index 0000000..96bf6f4 --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java @@ -0,0 +1,12 @@ +package com.gsean.bean.conditonalDemo; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:OnServerTypeCOndition + * Description:TODO + * Date:2020/11/21 11:14 + * Author:GSean + * Version: 1.0 + */ +public class OnServerTypeCOndition { +} diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java new file mode 100644 index 0000000..b64a6d4 --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java @@ -0,0 +1,12 @@ +package com.gsean.bean.conditonalDemo; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:ServerType + * Description:TODO + * Date:2020/11/21 11:14 + * Author:GSean + * Version: 1.0 + */ +public enum ServerType { +} diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java new file mode 100644 index 0000000..1fb5eaa --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java @@ -0,0 +1,12 @@ +package com.gsean.bean.conditonalDemo; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:conditionBeanConfig + * Description:TODO + * Date:2020/11/21 10:28 + * Author:GSean + * Version: 1.0 + */ +public class conditionBeanConfig { +} diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java new file mode 100644 index 0000000..9e4586b --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java @@ -0,0 +1,16 @@ +package com.gsean.bean.annotation; + +import java.lang.annotation.Documented; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:EnableServer + * Description:TODO + * Date:2020/11/20 23:06 + * Author:GSean + * Version: 1.0 + */ +@Documented + +public @interface EnableServer { +} diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java new file mode 100644 index 0000000..faf67fd --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java @@ -0,0 +1,12 @@ +package com.gsean.bean.enableBeanDemo; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:ServerImportSelector + * Description:TODO + * Date:2020/11/20 23:21 + * Author:GSean + * Version: 1.0 + */ +public class ServerImportSelector { +} diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java new file mode 100644 index 0000000..5ede075 --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java @@ -0,0 +1,12 @@ +package com.gsean.bean.enableBeanDemo; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:Type + * Description:TODO + * Date:2020/11/20 23:36 + * Author:GSean + * Version: 1.0 + */ +public enum Type { +} diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java new file mode 100644 index 0000000..bfc571f --- /dev/null +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java @@ -0,0 +1,12 @@ +package com.gsean.bean.enableBeanDemo; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:enableBeanDemo + * Description:TODO + * Date:2020/11/20 23:14 + * Author:GSean + * Version: 1.0 + */ +public class enableBeanDemo { +} diff --git a/internel-demo/bean-demo/src/main/resources/application.properties b/internel-demo/bean-demo/src/main/resources/application.properties new file mode 100644 index 0000000..e69de29 diff --git a/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java b/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java new file mode 100644 index 0000000..b2b9312 --- /dev/null +++ b/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java @@ -0,0 +1,59 @@ +package com.gsean.bean; + +import com.gsean.bean.conditonalDemo.conditionBeanConfig; +import com.gsean.bean.config.BeanConfig; +import com.gsean.bean.enableBeanDemo.enableBeanDemo; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + + +/** + * ProjectName:gsean-springboot-demos + * ClassName:BeanApplicationTest + * Description:TODO + * Date:2020/11/18 09:32 + * Author:GSean + * Version: 1.0 + */ +public class BeanApplicationTest { + private AnnotationConfigApplicationContext context; + @Before + public void buildContext(){ + context = new AnnotationConfigApplicationContext(); + context.register(BeanApplication.class); + context.refresh(); + } + + /** + * bean参数加载容器中的bean + */ + @Test + public void testBeanLoad(){ + BeanConfig.User tom = context.getBean( BeanConfig.User.class); + System.out.println(tom.getName()); + BeanConfig.Group group = context.getBean("group",BeanConfig.Group.class); + System.out.println(group); + BeanConfig.Group groups = context.getBean("groups",BeanConfig.Group.class); + System.out.println(groups); + } + + /** + * 测试import中的selector倒入bean + */ + @Test + public void testImportSelector(){ + enableBeanDemo.Server serverBean = context.getBean(enableBeanDemo.Server.class); + serverBean.getCurentServer(); + } + + /** + * 测试spring内置条件注解 + */ + @Test + public void testInnerConditional(){ + conditionBeanConfig.ConI conI = context.getBean(conditionBeanConfig.ConI.class); + conI.getCon(); + } + +} \ No newline at end of file diff --git a/jwt-demos/jwt-sample/pom.xml b/jwt-demos/jwt-sample/pom.xml new file mode 100644 index 0000000..64f1b1a --- /dev/null +++ b/jwt-demos/jwt-sample/pom.xml @@ -0,0 +1,15 @@ + + + + jwt-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + jwt-sample + + + \ No newline at end of file diff --git a/jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java b/jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java new file mode 100644 index 0000000..9a8c839 --- /dev/null +++ b/jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java @@ -0,0 +1,12 @@ +package com.gsean.jwt.sample; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtSampleApplication + * Description:TODO + * Date:2020/11/24 11:54 + * Author:GSean + * Version: 1.0 + */ +public class JwtSampleApplication { +} diff --git a/jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java b/jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java new file mode 100644 index 0000000..206a415 --- /dev/null +++ b/jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java @@ -0,0 +1,13 @@ +import static org.junit.Assert.*; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtSampleApplicationTest + * Description:TODO + * Date:2020/11/24 11:56 + * Author:GSean + * Version: 1.0 + */ +public class JwtSampleApplicationTest { + +} \ No newline at end of file diff --git a/jwt-demos/jwt-spring-boot-starter/pom.xml b/jwt-demos/jwt-spring-boot-starter/pom.xml new file mode 100644 index 0000000..852efaf --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/pom.xml @@ -0,0 +1,15 @@ + + + + jwt-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + jwt-spring-boot-starter + + + \ No newline at end of file diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java new file mode 100644 index 0000000..c890a90 --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java @@ -0,0 +1,12 @@ +package com.gsean.jwt.config; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtAutoConfig + * Description:TODO + * Date:2020/11/24 11:17 + * Author:GSean + * Version: 1.0 + */ +public class JwtAutoConfig { +} diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java new file mode 100644 index 0000000..afc04e8 --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java @@ -0,0 +1,12 @@ +package com.gsean.jwt; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtInvalidException + * Description:TODO + * Date:2020/11/24 11:32 + * Author:GSean + * Version: 1.0 + */ +public class JwtInvalidException { +} diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java new file mode 100644 index 0000000..08638bb --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java @@ -0,0 +1,12 @@ +package com.gsean.jwt; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtTokenService + * Description:TODO + * Date:2020/11/24 11:19 + * Author:GSean + * Version: 1.0 + */ +public interface JwtTokenService { +} diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java new file mode 100644 index 0000000..4d7a933 --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java @@ -0,0 +1,12 @@ +package com.gsean.jwt; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtTokenServiceImpl + * Description:TODO + * Date:2020/11/24 11:18 + * Author:GSean + * Version: 1.0 + */ +public class JwtTokenServiceImpl { +} diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java new file mode 100644 index 0000000..3cd70f4 --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java @@ -0,0 +1,12 @@ +package com.gsean.jwt; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtUtil + * Description:TODO + * Date:2020/11/24 11:44 + * Author:GSean + * Version: 1.0 + */ +public class JwtUtil { +} diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java new file mode 100644 index 0000000..9d94e32 --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java @@ -0,0 +1,12 @@ +package com.gsean.jwt; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:PayloadDto + * Description:TODO + * Date:2020/11/24 11:24 + * Author:GSean + * Version: 1.0 + */ +public class PayloadDto { +} diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories b/jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..744385b --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.gsean.starter.redis.GseanRedisAutoConfig \ No newline at end of file diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/resources/jwt.jks b/jwt-demos/jwt-spring-boot-starter/src/main/resources/jwt.jks new file mode 100644 index 0000000000000000000000000000000000000000..92687cc1aa3bbdab6fcf8f7b9824c7d5de04cc3b GIT binary patch literal 2243 zcmcgt`8(7L7oXJ(*_SNYMV9a#k`#$VWof*Ov6P*$WH3@DOAJQ5G1;?^Qkp^=Q5a(^ zSu)nK71^?M(YV!B*O>e2KKDLPf5H31d7kt6ob$tZKIc52!`t9(fIuL~UV#4&XvnoI zdwKM(tGNsa1cv}57!MHU6VTxU!@$}QF)$bof{|dKXg<=S9QIIL%C)Ua8*2eis?nZe z2Gh0isiusI42vi_-;JipjpiF6nRl(Jb}-|6UmDsI{)|MVBqLoVAKuBDblvPWV-Hd zykZS=lJA@0vlGZ;quEy2Ddl(KqluozIi5RjeTDq7Hg5gI;GO;wpWkp+=|Aw<%swT* zC5`16BTk@{tVIXH+yPftGlTwuBWY>&|F7B+cG|63#Vr4F$p(k}{- z(kxW0l2bl$3LW$oT_Aw8k@q=TNjIB}Y9EP!B266`Gou`~;8>&#w>dh^(*6#c0qerpDD>hw$eSg0j@}mw7s0TYRn{pX1mG@j&X+XR2DTo_L#!3t#jq6 zh?0RhUS8Da={|ZRNwpL|+b@@@bA^iKe^2yz&&p02mBC3ea+9CCoJPe~rS~=}t;J%h zItoerjQ&Q~PHrxrV3jmaVN(Gw-Xp*@x6Roolh;1Zd2FOua?e ze^7yzpBS&3MRq!=DT6HmBYBBual6OD9OGFLml(A2A3UcstJ?Y6*`0CpHm_GNcT7yj zo5T`U>`K>iF$R2)jPfVW^I-u2w>W`Oa&RFlr{a*?T63vgAk){8q8F@)0p~ zO;6)wTtM$YW#VG^g*meqy}Ngo)p{STOCC)pHZRE17_oJ~afY)NyueL)_9>E%X8H$$ z*ykgE*VU#wMlBUDS>aZ0jW3>Mpb75dfSDKB%DVT-kteGMcaL~o?Hly-Uw<*)RSxmI zc%UflR8R?70MvSeRj;4ZF>o2LMO1$ns*ZwQoZnpOYe=}55-mnBu3*Oa*d>>}xm&Z4 z6$;OtZH3=tuc@^>ExKXiADKwy^MsYz>LvAfyZ!^a0l6jfi z@;w)VZ{XD~WAd$!wcFCwnNxCWYrXgpwtjq&h^Pf7>G5RnG`80fC_L00~M2 zNDvcEye$Lh zEL~G=?JYf;K!7wUt>*C+--U8jIRyz48}lINoUm4R(*^zD36=?aequv2vs{E1xWKV}jMzr~D zEAg(W2YkDg{~h+vaNP2~F>vBl}^s( z7`7iKS+gpAi)@^*T*mkG4YZ;@=GK6$`>!JIUDck5U{IdMbid)T11d!^{G!G-l8Xku zLQfw2=>Cf(p({PpktrcRiOG=Fa}pa;6xt>qD)HTnXmFEQO<4??f5tqSrr>F719J6; zM-Y)~UcULrL-c!f`u6vej=&wXtTo79&D3ftr9jQwf={kp>P1>Kf3pnEGMidAtEZ{A zZ~5tS`L#d;3X7Nz4}Bt-Yt^WHE1c+XbXBtb@kL@niS8knhlEuZHN&Wf&H7{s#%H B*rNad literal 0 HcmV?d00001 diff --git a/jwt-demos/pom.xml b/jwt-demos/pom.xml new file mode 100644 index 0000000..7f226c9 --- /dev/null +++ b/jwt-demos/pom.xml @@ -0,0 +1,15 @@ + + + + gsean-springboot-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + jwt-demos + + + \ No newline at end of file diff --git a/redis-demos/redis-spring-boot-starter/pom.xml b/redis-demos/redis-spring-boot-starter/pom.xml new file mode 100644 index 0000000..3e0eb13 --- /dev/null +++ b/redis-demos/redis-spring-boot-starter/pom.xml @@ -0,0 +1,15 @@ + + + + redis-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + redis-spring-boot-starter + + + \ No newline at end of file diff --git a/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java new file mode 100644 index 0000000..48d9c65 --- /dev/null +++ b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java @@ -0,0 +1,52 @@ +package com.gsean.redis.config; + +import com.gsean.redis.util.RedisUtil; +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.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.io.Serializable; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:RedisConfig + * Description:TODO + * Date:2020/11/15 23:01 + * Author:GSean + * Version: 1.0 + */ +@Configuration +public class RedisConfig { + + @Autowired(required = false) + private LettuceConnectionFactory connectionFactory; + + @Bean + public RedisTemplate redisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(connectionFactory); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); + /** + * 1.普通缓存 + */ + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer); + /** + * 2.hash缓存 + */ + redisTemplate.setHashKeySerializer(stringRedisSerializer); + redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer); + return redisTemplate; + } + + @Bean + public RedisUtil redisUtil(){ + return new RedisUtil(redisTemplate()); + } + +} diff --git a/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java new file mode 100644 index 0000000..052db79 --- /dev/null +++ b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java @@ -0,0 +1,216 @@ +package com.gsean.redis.util; + +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.util.StringUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:RedisUtil + * Description:TODO + * Date:2020/11/15 23:09 + * Author:GSean + * Version: 1.0 + */ +public class RedisUtil { + private RedisTemplate redisTemplate; + + public RedisUtil(RedisTemplate redisTemplate) { + this.redisTemplate=redisTemplate; + } + + public boolean expire(String key, long time){ + Boolean setSuccess=false; + try { + if(time>0){ + setSuccess=redisTemplate.expire(key,time, TimeUnit.SECONDS); + } + } catch (Exception e) { + e.printStackTrace(); + } + return setSuccess; + } + + /** + * @MethodName: getExpire + * @Description: TODO 获取过期时间 + * @Param key + * @Return: long + * @Date: 2020/7/3 11:34 + * @Auther: GSean + * + */ + public long getExpire(String key){ + return redisTemplate.getExpire(key,TimeUnit.SECONDS); + } + + /** + * @MethodName: hasKey + * @Description: TODO 判断key是否存在 + * @Param key + * @Return: boolean + * @Date: 2020/7/3 11:38 + * @Auther: GSean + * + */ + public boolean hasKey(String key){ + Boolean hasStatus=false; + try { + hasStatus=redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + } + return hasStatus; + } + + /** + * @MethodName: delKeys + * @Description: TODO 批量删除key + * @Param keys + * @Return: void + * @Date: 2020/7/3 11:40 + * @Auther: GSean + * + */ + public void delKeys(String... keys){ + try { + List keysList = Arrays.asList(keys); + if(keysList!=null){ + redisTemplate.delete(keysList); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * @MethodName: set + * @Description: TODO 普通缓存存入 + * @Param key +  * @Param value +  * @Param time + * @Return: boolean + * @Date: 2020/7/3 11:57 + * @Auther: GSean + * + */ + public boolean set(String key,Object value,long time){ + Boolean success=false; + try { + if(time>0){ + redisTemplate.opsForValue().set(key,value,time,TimeUnit.SECONDS); + }else{ + redisTemplate.opsForValue().set(key, value); + } + success=true; + } catch (Exception e) { + e.printStackTrace(); + } + return success; + } + + + /** + * @MethodName: get + * @Description: TODO 普通缓存获取key的value + * @Param key + * @Return: java.lang.Object + * @Date: 2020/7/3 13:27 + * @Auther: GSean + * + */ + public Object get(String key){ + return StringUtils.isEmpty(key)?null:redisTemplate.opsForValue().get(key); + } + + /** + * @MethodName: hset + * @Description: TODO 向hash表中存入行数据 + * @Param key +  * @Param item +  * @Param value +  * @Param time + * @Return: boolean + * @Date: 2020/7/3 13:33 + * @Auther: GSean + * + */ + public boolean hset(String key,String item,Object value,long time){ + Boolean status=false; + try { + redisTemplate.opsForHash().put(key,item,value); + status=true; + if(time>0){ + expire(key,time); + } + } catch (Exception e) { + e.printStackTrace(); + } + return status; + } + + /** + * @MethodName: hmset + * @Description: TODO 向hash表中存入整张表数据 + * @Param key +  * @Param map +  * @Param time + * @Return: boolean + * @Date: 2020/7/3 13:44 + * @Auther: GSean + * + */ + public boolean hmset(String key, Map map, long time){ + Boolean status=false; + try { + redisTemplate.opsForHash().putAll(key,map); + status=true; + if(time>0){ + expire(key,time); + } + } catch (Exception e) { + e.printStackTrace(); + } + return status; + } + + /** + * @MethodName: hget + * @Description: TODO 获取hash表中的一行数据 + * @Param key +  * @Param itemKey + * @Return: java.lang.Object + * @Date: 2020/7/3 13:46 + * @Auther: GSean + * + */ + public Object hget(String key,String itemKey){ + return redisTemplate.opsForHash().get(key,itemKey); + } + + /** + * @MethodName: hmget + * @Description: TODO 获取hash表的所有键值对 + * @Param key + * @Return: java.util.Map + * @Date: 2020/7/3 13:47 + * @Auther: GSean + * + */ + public Map hmget(String key){ + return redisTemplate.opsForHash().entries(key); + } + + /** + * 返回某个hash表的所有值 + * @param key + * @return + */ + public List hmvget(String key){ + return redisTemplate.opsForHash().values(key); + } +} diff --git a/redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories b/redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..369d1a8 --- /dev/null +++ b/redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.open.capacity.redis.RedisAutoConfig \ No newline at end of file diff --git a/security-demo/pom.xml b/security-demo/pom.xml new file mode 100644 index 0000000..2a6debe --- /dev/null +++ b/security-demo/pom.xml @@ -0,0 +1,15 @@ + + + + gsean-springboot-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-demo + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-sample/pom.xml b/security-demo/security-inmemory-sample/pom.xml new file mode 100644 index 0000000..1e78266 --- /dev/null +++ b/security-demo/security-inmemory-sample/pom.xml @@ -0,0 +1,15 @@ + + + + security-demo + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-inmemory-sample + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java new file mode 100644 index 0000000..aa2bb80 --- /dev/null +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java @@ -0,0 +1,12 @@ +package com.gsean.security.inmemory.sample; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:InmemorySecuritySampleApplication + * Description:TODO + * Date:2020/11/23 14:16 + * Author:GSean + * Version: 1.0 + */ +public class InmemorySecuritySampleApplication { +} diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java new file mode 100644 index 0000000..11b395d --- /dev/null +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java @@ -0,0 +1,14 @@ +package com.gsean.security.inmemory.sample.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; + +//@Configuration +//@EnableAuthorizationServer +public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + +} diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java new file mode 100644 index 0000000..760b74f --- /dev/null +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java @@ -0,0 +1,33 @@ +//package com.gsean.security.inmemory.sample.config; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +//import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +//import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +// +////@Configuration +////@EnableAuthorizationServer +//public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { +// +// @Autowired +// private BCryptPasswordEncoder passwordEncoder; +// +// @Override +// public void configure(ClientDetailsServiceConfigurer clients) throws Exception { +// // 配置客户端 +// clients +// // 使用内存设置 +// .inMemory() +// // client_id +// .withClient("client") +// // client_secret +// .secret(passwordEncoder.encode("secret")) +// // 授权类型 +// .authorizedGrantTypes("authorization_code") +// // 授权范围 +// .scopes("app") +// // 注册跳转地址 +// .redirectUris("http://www.funtl.com"); +// +// } +//} diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java new file mode 100644 index 0000000..5e836c2 --- /dev/null +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java @@ -0,0 +1,12 @@ +package com.gsean.security.inmemory.sample.config; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:WebSecurityConfig + * Description:TODO + * Date:2020/11/23 14:46 + * Author:GSean + * Version: 1.0 + */ +public class WebSecurityConfig { +} diff --git a/security-demo/security-inmemory-sample/src/main/resources/application.yml b/security-demo/security-inmemory-sample/src/main/resources/application.yml new file mode 100644 index 0000000..e69de29 diff --git a/security-demo/security-inmemory-separate-sample/pom.xml b/security-demo/security-inmemory-separate-sample/pom.xml new file mode 100644 index 0000000..7472a08 --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/pom.xml @@ -0,0 +1,15 @@ + + + + security-demo + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-inmemory-separate-sample + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml b/security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml new file mode 100644 index 0000000..2c7b35a --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml @@ -0,0 +1,15 @@ + + + + security-inmemory-separate-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-authentication-server + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java new file mode 100644 index 0000000..906b981 --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java @@ -0,0 +1,12 @@ +package com.gsean.auth2; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:AuthenticationApplication + * Description:TODO + * Date:2020/11/23 22:47 + * Author:GSean + * Version: 1.0 + */ +public class AuthenticationApplication { +} diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java new file mode 100644 index 0000000..a851df5 --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java @@ -0,0 +1,57 @@ +package com.gsean.security.inmemory.sample.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; + +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + private AuthenticationManager authenticationManager;//security中注入的认证管理器 + + /** + * 使用内存中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 配置客户端 + clients + // 使用内存设置 + .inMemory() + // client_id + .withClient("admin") + // client_secret + .secret(passwordEncoder.encode("admin123456")) + // 授权类型 + .authorizedGrantTypes("authorization_code","password") + // 授权范围 + .scopes("all") + // 注册跳转地址 + .redirectUris("http://www.baidu.com"); + + } + + /** + * 认证服务器端点配置:认证服务器管理配置,支持表单登陆 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.authenticationManager(authenticationManager); + } + + //http://localhost:18081/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.com&scope=all&state=normal +} diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java new file mode 100644 index 0000000..9bccce5 --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java @@ -0,0 +1,75 @@ +package com.gsean.security.inmemory.sample.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:WebSecurityConfig + * Description:TODO + * Date:2020/11/23 14:46 + * Author:GSean + * Version: 1.0 + */ +@EnableWebSecurity +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + /** + * 密码加密器 + * @return + */ + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 认证管理器,必须导入的bean,否则oauth认证过程中无法实现表单登陆 + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * 使用内存中的用户名密码授权 + * @param auth + * @throws Exception + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); + } + + /** + * 配置security安全认证通过路径,包括oauth端点,login,logout + * @param http + * @throws Exception + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/oauth/**", "/login/**", "/logout/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .permitAll(); + + } + + +} diff --git a/security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml b/security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml new file mode 100644 index 0000000..36243fc --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml @@ -0,0 +1,15 @@ + + + + security-inmemory-separate-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-resource-server + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java new file mode 100644 index 0000000..d51ca2d --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java @@ -0,0 +1,12 @@ +package com.gsean.auth2; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:ResourceApplication + * Description:TODO + * Date:2020/11/23 22:49 + * Author:GSean + * Version: 1.0 + */ +public class ResourceApplication { +} diff --git a/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java new file mode 100644 index 0000000..3ca223b --- /dev/null +++ b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java @@ -0,0 +1,31 @@ +package com.gsean.security.inmemory.sample.config;//package com.gsean.security.inmemory.sample.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + super.configure(resources); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} diff --git a/security-demo/security-token-persisitence-sample/pom.xml b/security-demo/security-token-persisitence-sample/pom.xml new file mode 100644 index 0000000..673e501 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/pom.xml @@ -0,0 +1,33 @@ + + + + security-demo + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-token-persisitence_sample + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + com.gsean.demos + redis-spring-boot-starter + 1.0-SNAPSHOT + + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml new file mode 100644 index 0000000..58b35bb --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml @@ -0,0 +1,15 @@ + + + + security-token-jwt-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + jwt-auth-server + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java new file mode 100644 index 0000000..1fdb0b5 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java @@ -0,0 +1,35 @@ +package sample; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:InmemorySecuritySampleApplication + * Description:TODO + * Date:2020/11/23 14:16 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class SecurityTokenPersistenceSampleApplication { + public static void main(String[] args) { + SpringApplication.run(SecurityTokenPersistenceSampleApplication.class,args); + } + + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(){ + return "hello security token persistence"; + } + } + + //http://localhost:18081/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://www.baidu.com&scope=all&state=normal + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java new file mode 100644 index 0000000..d3a749d --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java @@ -0,0 +1,67 @@ +package com.gsean.security.tokenpersisence.sample.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; + +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + private AuthenticationManager authenticationManager;//security中注入的认证管理器 + + + @Autowired + private TokenStore tokenStore; + + @Autowired + private JwtAccessTokenConverter jwtAccessTokenConverter; + + /** + * 使用内存中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 配置客户端 + clients + // 使用内存设置 + .inMemory() + // client_id + .withClient("admin") + // client_secret + .secret(passwordEncoder.encode("admin123456")) + // 授权类型 + .authorizedGrantTypes("authorization_code","password","refresh_token") + // 授权范围 + .scopes("all") + // 注册跳转地址 + .redirectUris("http://www.baidu.com"); + + } + + /** + * 认证服务器端点配置:认证服务器管理配置,支持表单登陆 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.authenticationManager(authenticationManager) + .tokenStore(tokenStore).accessTokenConverter(jwtAccessTokenConverter); + } + + //http://localhost:18081/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.com&scope=all&state=normal +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java new file mode 100644 index 0000000..c4c9cbc --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java @@ -0,0 +1,12 @@ +package com.gsean.security.token.jwt.config; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:JwtTokenEnhancer + * Description:TODO + * Date:2020/11/25 17:35 + * Author:GSean + * Version: 1.0 + */ +public class JwtTokenEnhancer { +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java new file mode 100644 index 0000000..b88bf49 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java @@ -0,0 +1,37 @@ +package com.gsean.security.tokenpersisence.sample.config;//package com.gsean.security.inmemory.sample.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private TokenStore tokenStore; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java new file mode 100644 index 0000000..3feb877 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java @@ -0,0 +1,65 @@ +package com.gsean.security.tokenpersisence.sample.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.ClassPathResource; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; +import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; +import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; + +import java.security.KeyPair; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:TokenStoreConfig + * Description:TODO token存储方式配置 + * Date:2020/11/25 09:47 + * Author:GSean + * Version: 1.0 + */ +@Configuration +public class TokenStoreConfig { + @Autowired + private RedisConnectionFactory redisConnectionFactory; + + @Bean + public JwtAccessTokenConverter jwtAccessTokenConverter(){ + JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); + jwtAccessTokenConverter.setSigningKey("test_key");//配置jwt使用的对称密钥 + return jwtAccessTokenConverter; + } + + /** + * 配置token访问转换器使用rsa + * @return + */ + @Bean + @Primary + public JwtAccessTokenConverter rsaTokenConverter(){ + JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); + KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray()); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair("jwt"); + jwtAccessTokenConverter.setKeyPair(keyPair);//配置jwt使用的rsa密钥 + return jwtAccessTokenConverter; + } + + + + + @Bean + public TokenStore redisTokenStore(){ + return new RedisTokenStore(redisConnectionFactory); + } + + + @Bean + @Primary + public TokenStore jwtTokenStore(){ + return new JwtTokenStore(rsaTokenConverter()); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java new file mode 100644 index 0000000..04f9e74 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java @@ -0,0 +1,75 @@ +package com.gsean.security.tokenpersisence.sample.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:WebSecurityConfig + * Description:TODO + * Date:2020/11/23 14:46 + * Author:GSean + * Version: 1.0 + */ +@EnableWebSecurity +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + /** + * 密码加密器 + * @return + */ + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 认证管理器,必须导入的bean,否则oauth认证过程中无法实现表单登陆 + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * 使用内存中的用户名密码授权 + * @param auth + * @throws Exception + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); + } + + /** + * 配置security安全认证通过路径,包括oauth端点,login,logout + * @param http + * @throws Exception + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/oauth/**", "/login/**", "/logout/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .permitAll(); + + } + + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml new file mode 100644 index 0000000..1efaf0d --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml @@ -0,0 +1,9 @@ +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/db_springboot_demos?serverTimezone=GMT&useSSL=true&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + + liquibase: + change-log: classpath:/liquibase/master.xml diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/jwt.jks b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/jwt.jks new file mode 100644 index 0000000000000000000000000000000000000000..92687cc1aa3bbdab6fcf8f7b9824c7d5de04cc3b GIT binary patch literal 2243 zcmcgt`8(7L7oXJ(*_SNYMV9a#k`#$VWof*Ov6P*$WH3@DOAJQ5G1;?^Qkp^=Q5a(^ zSu)nK71^?M(YV!B*O>e2KKDLPf5H31d7kt6ob$tZKIc52!`t9(fIuL~UV#4&XvnoI zdwKM(tGNsa1cv}57!MHU6VTxU!@$}QF)$bof{|dKXg<=S9QIIL%C)Ua8*2eis?nZe z2Gh0isiusI42vi_-;JipjpiF6nRl(Jb}-|6UmDsI{)|MVBqLoVAKuBDblvPWV-Hd zykZS=lJA@0vlGZ;quEy2Ddl(KqluozIi5RjeTDq7Hg5gI;GO;wpWkp+=|Aw<%swT* zC5`16BTk@{tVIXH+yPftGlTwuBWY>&|F7B+cG|63#Vr4F$p(k}{- z(kxW0l2bl$3LW$oT_Aw8k@q=TNjIB}Y9EP!B266`Gou`~;8>&#w>dh^(*6#c0qerpDD>hw$eSg0j@}mw7s0TYRn{pX1mG@j&X+XR2DTo_L#!3t#jq6 zh?0RhUS8Da={|ZRNwpL|+b@@@bA^iKe^2yz&&p02mBC3ea+9CCoJPe~rS~=}t;J%h zItoerjQ&Q~PHrxrV3jmaVN(Gw-Xp*@x6Roolh;1Zd2FOua?e ze^7yzpBS&3MRq!=DT6HmBYBBual6OD9OGFLml(A2A3UcstJ?Y6*`0CpHm_GNcT7yj zo5T`U>`K>iF$R2)jPfVW^I-u2w>W`Oa&RFlr{a*?T63vgAk){8q8F@)0p~ zO;6)wTtM$YW#VG^g*meqy}Ngo)p{STOCC)pHZRE17_oJ~afY)NyueL)_9>E%X8H$$ z*ykgE*VU#wMlBUDS>aZ0jW3>Mpb75dfSDKB%DVT-kteGMcaL~o?Hly-Uw<*)RSxmI zc%UflR8R?70MvSeRj;4ZF>o2LMO1$ns*ZwQoZnpOYe=}55-mnBu3*Oa*d>>}xm&Z4 z6$;OtZH3=tuc@^>ExKXiADKwy^MsYz>LvAfyZ!^a0l6jfi z@;w)VZ{XD~WAd$!wcFCwnNxCWYrXgpwtjq&h^Pf7>G5RnG`80fC_L00~M2 zNDvcEye$Lh zEL~G=?JYf;K!7wUt>*C+--U8jIRyz48}lINoUm4R(*^zD36=?aequv2vs{E1xWKV}jMzr~D zEAg(W2YkDg{~h+vaNP2~F>vBl}^s( z7`7iKS+gpAi)@^*T*mkG4YZ;@=GK6$`>!JIUDck5U{IdMbid)T11d!^{G!G-l8Xku zLQfw2=>Cf(p({PpktrcRiOG=Fa}pa;6xt>qD)HTnXmFEQO<4??f5tqSrr>F719J6; zM-Y)~UcULrL-c!f`u6vej=&wXtTo79&D3ftr9jQwf={kp>P1>Kf3pnEGMidAtEZ{A zZ~5tS`L#d;3X7Nz4}Bt-Yt^WHE1c+XbXBtb@kL@niS8knhlEuZHN&Wf&H7{s#%H B*rNad literal 0 HcmV?d00001 diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml new file mode 100644 index 0000000..f3d0e5e --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml @@ -0,0 +1,15 @@ + + + + security-token-jwt-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + jwt-resource-server + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java new file mode 100644 index 0000000..ae2ac45 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java @@ -0,0 +1,34 @@ +package com.gsean.security.token.jwt; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:InmemorySecuritySampleApplication + * Description:TODO + * Date:2020/11/23 14:16 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class SecurityTokenJwtAuthServerApplication { + public static void main(String[] args) { + SpringApplication.run(SecurityTokenJwtAuthServerApplication.class,args); + } + + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(){ + return "hello security jwt token persistence"; + } + } + + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java new file mode 100644 index 0000000..30ccdf4 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java @@ -0,0 +1,37 @@ +package com.gsean.security.token.jwt.config;//package com.gsean.security.inmemory.com.gsean.security.token.jwt.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private TokenStore tokenStore; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java new file mode 100644 index 0000000..4e4d6ac --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java @@ -0,0 +1,63 @@ +package com.gsean.security.token.jwt.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.ClassPathResource; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; +import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; + +import java.security.KeyPair; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:TokenStoreConfig + * Description:TODO token存储方式配置 + * Date:2020/11/25 09:47 + * Author:GSean + * Version: 1.0 + */ +@Configuration +public class TokenStoreConfig { + + @Autowired + private JwtAccessTokenConverter jwtAccessTokenConverter; + /** + * 对称密钥jwt + * @return + */ + @Bean + public JwtAccessTokenConverter jwtAccessTokenConverter(){ + JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); + jwtAccessTokenConverter.setSigningKey("test_key");//配置jwt使用的对称密钥 + return jwtAccessTokenConverter; + } + + /** + * 配置token访问转换器使用rsa + * @return + */ + @Bean + @Primary + public JwtAccessTokenConverter rsaTokenConverter(){ + JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); + KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray()); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair("jwt"); + jwtAccessTokenConverter.setKeyPair(keyPair);//配置jwt使用的rsa密钥 + return jwtAccessTokenConverter; + } + + + + + + + @Bean + @Primary + public TokenStore jwtTokenStore(){ + return new JwtTokenStore(jwtAccessTokenConverter); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/resources/jwt.jks b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/resources/jwt.jks new file mode 100644 index 0000000000000000000000000000000000000000..92687cc1aa3bbdab6fcf8f7b9824c7d5de04cc3b GIT binary patch literal 2243 zcmcgt`8(7L7oXJ(*_SNYMV9a#k`#$VWof*Ov6P*$WH3@DOAJQ5G1;?^Qkp^=Q5a(^ zSu)nK71^?M(YV!B*O>e2KKDLPf5H31d7kt6ob$tZKIc52!`t9(fIuL~UV#4&XvnoI zdwKM(tGNsa1cv}57!MHU6VTxU!@$}QF)$bof{|dKXg<=S9QIIL%C)Ua8*2eis?nZe z2Gh0isiusI42vi_-;JipjpiF6nRl(Jb}-|6UmDsI{)|MVBqLoVAKuBDblvPWV-Hd zykZS=lJA@0vlGZ;quEy2Ddl(KqluozIi5RjeTDq7Hg5gI;GO;wpWkp+=|Aw<%swT* zC5`16BTk@{tVIXH+yPftGlTwuBWY>&|F7B+cG|63#Vr4F$p(k}{- z(kxW0l2bl$3LW$oT_Aw8k@q=TNjIB}Y9EP!B266`Gou`~;8>&#w>dh^(*6#c0qerpDD>hw$eSg0j@}mw7s0TYRn{pX1mG@j&X+XR2DTo_L#!3t#jq6 zh?0RhUS8Da={|ZRNwpL|+b@@@bA^iKe^2yz&&p02mBC3ea+9CCoJPe~rS~=}t;J%h zItoerjQ&Q~PHrxrV3jmaVN(Gw-Xp*@x6Roolh;1Zd2FOua?e ze^7yzpBS&3MRq!=DT6HmBYBBual6OD9OGFLml(A2A3UcstJ?Y6*`0CpHm_GNcT7yj zo5T`U>`K>iF$R2)jPfVW^I-u2w>W`Oa&RFlr{a*?T63vgAk){8q8F@)0p~ zO;6)wTtM$YW#VG^g*meqy}Ngo)p{STOCC)pHZRE17_oJ~afY)NyueL)_9>E%X8H$$ z*ykgE*VU#wMlBUDS>aZ0jW3>Mpb75dfSDKB%DVT-kteGMcaL~o?Hly-Uw<*)RSxmI zc%UflR8R?70MvSeRj;4ZF>o2LMO1$ns*ZwQoZnpOYe=}55-mnBu3*Oa*d>>}xm&Z4 z6$;OtZH3=tuc@^>ExKXiADKwy^MsYz>LvAfyZ!^a0l6jfi z@;w)VZ{XD~WAd$!wcFCwnNxCWYrXgpwtjq&h^Pf7>G5RnG`80fC_L00~M2 zNDvcEye$Lh zEL~G=?JYf;K!7wUt>*C+--U8jIRyz48}lINoUm4R(*^zD36=?aequv2vs{E1xWKV}jMzr~D zEAg(W2YkDg{~h+vaNP2~F>vBl}^s( z7`7iKS+gpAi)@^*T*mkG4YZ;@=GK6$`>!JIUDck5U{IdMbid)T11d!^{G!G-l8Xku zLQfw2=>Cf(p({PpktrcRiOG=Fa}pa;6xt>qD)HTnXmFEQO<4??f5tqSrr>F719J6; zM-Y)~UcULrL-c!f`u6vej=&wXtTo79&D3ftr9jQwf={kp>P1>Kf3pnEGMidAtEZ{A zZ~5tS`L#d;3X7Nz4}Bt-Yt^WHE1c+XbXBtb@kL@niS8knhlEuZHN&Wf&H7{s#%H B*rNad literal 0 HcmV?d00001 diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java new file mode 100644 index 0000000..7c763ef --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java @@ -0,0 +1,13 @@ +import static org.junit.Assert.*; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:SecurityTokenJwtResourceServerApplicationTest + * Description:TODO + * Date:2020/11/25 18:19 + * Author:GSean + * Version: 1.0 + */ +public class SecurityTokenJwtResourceServerApplicationTest { + +} \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml new file mode 100644 index 0000000..d521f15 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml @@ -0,0 +1,15 @@ + + + + security-token-persisitence_sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-token-jwt-sample + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/pom.xml new file mode 100644 index 0000000..8d4046c --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/pom.xml @@ -0,0 +1,43 @@ + + + + security-token-mysql-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + mysql-auth-server + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + mysql + mysql-connector-java + runtime + + + org.liquibase + liquibase-core + + + com.baomidou + mybatis-plus-boot-starter + 3.4.0 + + + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/MysqlAuthserverApplication.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/MysqlAuthserverApplication.java new file mode 100644 index 0000000..e65b215 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/MysqlAuthserverApplication.java @@ -0,0 +1,31 @@ +package com.gsean.security.token.mysql; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:SecurityDBApplication + * Description:TODO + * Date:2020/11/25 14:20 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class MysqlAuthserverApplication { + public static void main(String[] args) { + SpringApplication.run(MysqlAuthserverApplication.class,args); + } + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(){ + return "hello mysql resource"; + } + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/AuthorizationServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/AuthorizationServerConfig.java new file mode 100644 index 0000000..14f9ccf --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/AuthorizationServerConfig.java @@ -0,0 +1,67 @@ +package com.gsean.security.token.mysql.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + private AuthenticationManager authenticationManager;//security中注入的认证管理器 + + + @Autowired + private TokenStore tokenStore; + + + @Autowired + private JdbcClientDetailsService jdbcClientDetailsService; + + /** + * 使用数据库中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + clients.withClientDetails(jdbcClientDetailsService); + } + + /** + * 认证服务器端点配置:认证服务器管理配置,支持表单登陆 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.authenticationManager(authenticationManager) + .tokenStore(tokenStore); + } + + /** + * 配置 token 节点的安全策略 + * @param security + * @throws Exception + */ + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security + .allowFormAuthenticationForClients()//允许客户端表单认证 + .tokenKeyAccess("permitAll()") // 开启/oauth/token_key访问权限 + .checkTokenAccess("permitAll()");//开启/oauth/check_token的访问权限 + } + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java new file mode 100644 index 0000000..477b7c9 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java @@ -0,0 +1,36 @@ +package com.gsean.security.token.mysql.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JdbcTokenStore; + +import javax.sql.DataSource; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:DatabaseTokenStore + * Description:TODO + * Date:2020/11/25 14:38 + * Author:GSean + * Version: 1.0 + */ +@Configuration +public class DatabaseTokenStoreConfig { + + @Autowired + private DataSource dataSource; + + @Bean + public JdbcClientDetailsService jdbcClientDetailsService() { + return new JdbcClientDetailsService(dataSource); + } + + @Bean + public TokenStore tokenStore() { + return new JdbcTokenStore(dataSource); + } + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java new file mode 100644 index 0000000..a957f25 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java @@ -0,0 +1,37 @@ +package com.gsean.security.token.mysql.config;//package com.gsean.security.inmemory.com.gsean.security.token.com.gsean.security.token.com.gsean.security.token.redis.jwt.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private TokenStore tokenStore; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/WebSecurityConfig.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/WebSecurityConfig.java new file mode 100644 index 0000000..b32a9ca --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/java/com/gsean/security/token/mysql/config/WebSecurityConfig.java @@ -0,0 +1,75 @@ +package com.gsean.security.token.mysql.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:WebSecurityConfig + * Description:TODO + * Date:2020/11/23 14:46 + * Author:GSean + * Version: 1.0 + */ +@EnableWebSecurity +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + /** + * 密码加密器 + * @return + */ + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 认证管理器,必须导入的bean,否则oauth认证过程中无法实现表单登陆 + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * 使用内存中的用户名密码授权 + * @param auth + * @throws Exception + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); + } + + /** + * 配置security安全认证通过路径,包括oauth端点,login,logout + * @param http + * @throws Exception + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/oauth/**", "/login/**", "/logout/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .permitAll(); + + } + + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/application.yml b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/application.yml new file mode 100644 index 0000000..1efaf0d --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/application.yml @@ -0,0 +1,9 @@ +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/db_springboot_demos?serverTimezone=GMT&useSSL=true&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + + liquibase: + change-log: classpath:/liquibase/master.xml diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/changelog/release.init.xml b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/changelog/release.init.xml new file mode 100644 index 0000000..37f6f5d --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/changelog/release.init.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/master.xml b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/master.xml new file mode 100644 index 0000000..56783d0 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/master.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/sql/security.sql b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/sql/security.sql new file mode 100644 index 0000000..7f11196 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-auth-server/src/main/resources/liquibase/sql/security.sql @@ -0,0 +1,54 @@ +/* + Navicat MySQL Data Transfer + + Source Server : sop-db + Source Server Type : MySQL + Source Server Version : 80016 + Source Host : rm-2zes81e0248lwx8e0po.mysql.rds.aliyuncs.com:3306 + Source Schema : sop_test + + Target Server Type : MySQL + Target Server Version : 80016 + File Encoding : 65001 + + Date: 20/11/2020 14:55:07 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +DROP TABLE IF EXISTS `oauth_access_token`;CREATE TABLE `oauth_access_token` ( `token_id` varchar(255) DEFAULT NULL COMMENT '加密的access_token的值', `token` longblob COMMENT 'OAuth2AccessToken.java对象序列化后的二进制数据', `authentication_id` varchar(255) DEFAULT NULL COMMENT '加密过的username,client_id,scope', `user_name` varchar(255) DEFAULT NULL COMMENT '登录的用户名', `client_id` varchar(255) DEFAULT NULL COMMENT '客户端ID', `authentication` longblob COMMENT 'OAuth2Authentication.java对象序列化后的二进制数据', `refresh_token` varchar(255) DEFAULT NULL COMMENT '加密的refresh_token的值') ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `oauth_approvals`;CREATE TABLE `oauth_approvals` ( `userId` varchar(255) DEFAULT NULL COMMENT '登录的用户名', `clientId` varchar(255) DEFAULT NULL COMMENT '客户端ID', `scope` varchar(255) DEFAULT NULL COMMENT '申请的权限范围', `status` varchar(10) DEFAULT NULL COMMENT '状态(Approve或Deny)', `expiresAt` datetime DEFAULT NULL COMMENT '过期时间', `lastModifiedAt` datetime DEFAULT NULL COMMENT '最终修改时间') ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `oauth_client_details`;CREATE TABLE `oauth_client_details` ( `client_id` varchar(255) NOT NULL COMMENT '客户端ID', `resource_ids` varchar(255) DEFAULT NULL COMMENT '资源ID集合,多个资源时用逗号(,)分隔', `client_secret` varchar(255) DEFAULT NULL COMMENT '客户端密匙', `scope` varchar(255) DEFAULT NULL COMMENT '客户端申请的权限范围', `authorized_grant_types` varchar(255) DEFAULT NULL COMMENT '客户端支持的grant_type', `web_server_redirect_uri` varchar(255) DEFAULT NULL COMMENT '重定向URI', `authorities` varchar(255) DEFAULT NULL COMMENT '客户端所拥有的Spring Security的权限值,多个用逗号(,)分隔', `access_token_validity` int(11) DEFAULT NULL COMMENT '访问令牌有效时间值(单位:秒)', `refresh_token_validity` int(11) DEFAULT NULL COMMENT '更新令牌有效时间值(单位:秒)', `additional_information` varchar(255) DEFAULT NULL COMMENT '预留字段', `autoapprove` varchar(255) DEFAULT NULL COMMENT '用户是否自动Approval操作') ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `oauth_client_token`;CREATE TABLE `oauth_client_token` ( `token_id` varchar(255) DEFAULT NULL COMMENT '加密的access_token值', `token` longblob COMMENT 'OAuth2AccessToken.java对象序列化后的二进制数据', `authentication_id` varchar(255) DEFAULT NULL COMMENT '加密过的username,client_id,scope', `user_name` varchar(255) DEFAULT NULL COMMENT '登录的用户名', `client_id` varchar(255) DEFAULT NULL COMMENT '客户端ID') ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `oauth_code`;CREATE TABLE `oauth_code` ( `code` varchar(255) DEFAULT NULL COMMENT '授权码(未加密)', `authentication` varbinary(255) DEFAULT NULL COMMENT 'AuthorizationRequestHolder.java对象序列化后的二进制数据') ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `oauth_refresh_token`;CREATE TABLE `oauth_refresh_token` ( `token_id` varchar(255) DEFAULT NULL COMMENT '加密过的refresh_token的值', `token` longblob COMMENT 'OAuth2RefreshToken.java对象序列化后的二进制数据 ', `authentication` longblob COMMENT 'OAuth2Authentication.java对象序列化后的二进制数据') ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `sys_user`;CREATE TABLE `sys_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL COMMENT '用户名', `password` varchar(50) DEFAULT NULL COMMENT '密码', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表'; + +DROP TABLE IF EXISTS `authority`;CREATE TABLE `authority` ( `id` bigint(11) NOT NULL COMMENT '权限id', `authority` varchar(255) DEFAULT NULL COMMENT '权限', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `credentials`;CREATE TABLE `credentials` ( `id` bigint(11) NOT NULL COMMENT '凭证id', `enabled` tinyint(1) NOT NULL COMMENT '是否可用', `name` varchar(255) NOT NULL COMMENT '用户名', `password` varchar(255) NOT NULL COMMENT '密码', `version` int(11) DEFAULT NULL COMMENT '版本号', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `credentials_authorities`;CREATE TABLE `credentials_authorities` ( `credentials_id` bigint(20) NOT NULL COMMENT '凭证id', `authorities_id` bigint(20) NOT NULL COMMENT '权限id') ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +BEGIN; +INSERT INTO authority VALUES(1,'ROLE_OAUTH_ADMIN'); +INSERT INTO authority VALUES(2,'ROLE_RESOURCE_ADMIN'); +INSERT INTO authority VALUES(3,'ROLE_PROJECT_ADMIN'); +INSERT INTO credentials VALUES(1,b'1','oauth_admin','$2a$10$BurTWIy5NTF9GJJH4magz.9Bd4bBurWYG8tmXxeQh1vs7r/wnCFG2','0'); +INSERT INTO credentials VALUES(2,b'1','resource_admin','$2a$10$BurTWIy5NTF9GJJH4magz.9Bd4bBurWYG8tmXxeQh1vs7r/wnCFG2','0'); +INSERT INTO credentials VALUES(3,b'1','project_admin','$2a$10$BurTWIy5NTF9GJJH4magz.9Bd4bBurWYG8tmXxeQh1vs7r/wnCFG2','0'); +INSERT INTO credentials_authorities VALUE (1,1); +INSERT INTO credentials_authorities VALUE (2,2); +INSERT INTO credentials_authorities VALUE (3,3); +INSERT INTO oauth_client_details VALUES('user_client','project_api', '$2a$10$BurTWIy5NTF9GJJH4magz.9Bd4bBurWYG8tmXxeQh1vs7r/wnCFG2', 'read,write', 'password,refresh_token', 'http://127.0.0.1', 'ROLE_PROJECT_ADMIN', 7200, 1800, NULL, 'true'); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/pom.xml new file mode 100644 index 0000000..59489a2 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/pom.xml @@ -0,0 +1,38 @@ + + + + security-token-mysql-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + mysql-resource-server + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + com.baomidou + mybatis-plus-boot-starter + 3.4.0 + + + mysql + mysql-connector-java + runtime + + + + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/MysqlResourceServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/MysqlResourceServerApplication.java new file mode 100644 index 0000000..055fe93 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/MysqlResourceServerApplication.java @@ -0,0 +1,31 @@ +package com.gsean.security.token.mysql; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:SecurityDBApplication + * Description:TODO + * Date:2020/11/25 14:20 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class MysqlResourceServerApplication { + public static void main(String[] args) { + SpringApplication.run(MysqlResourceServerApplication.class,args); + } + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(){ + return "hello mysql resource"; + } + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java new file mode 100644 index 0000000..2899784 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/DatabaseTokenStoreConfig.java @@ -0,0 +1,31 @@ +package com.gsean.security.token.mysql.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JdbcTokenStore; + +import javax.sql.DataSource; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:DatabaseTokenStore + * Description:TODO + * Date:2020/11/25 14:38 + * Author:GSean + * Version: 1.0 + */ +@Configuration +public class DatabaseTokenStoreConfig { + + @Autowired + private DataSource dataSource; + + + @Bean + public TokenStore tokenStore() { + return new JdbcTokenStore(dataSource); + } + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java new file mode 100644 index 0000000..77ade71 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/java/com/gsean/security/token/mysql/config/ResourceServerConfig.java @@ -0,0 +1,52 @@ +package com.gsean.security.token.mysql.config;//package com.gsean.security.inmemory.com.gsean.security.token.com.gsean.security.token.com.gsean.security.token.redis.jwt.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.RemoteTokenServices; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private TokenStore tokenStore; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } + + + @Primary + @Bean + public RemoteTokenServices tokenServices() { + //这里需要使用定义一个client,专用于resouce访问认证服务器的客户端 + final RemoteTokenServices tokenService = new RemoteTokenServices(); + tokenService.setCheckTokenEndpointUrl("http://localhost:18090/oauth/check_token"); + tokenService.setClientId("user_client2"); + tokenService.setClientSecret("user"); + return tokenService; + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/resources/application.yml b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/resources/application.yml new file mode 100644 index 0000000..0caa049 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/mysql-resource-server/src/main/resources/application.yml @@ -0,0 +1,7 @@ +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/db_springboot_demos?serverTimezone=GMT&useSSL=true&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/pom.xml b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/pom.xml new file mode 100644 index 0000000..12a9ff9 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/pom.xml @@ -0,0 +1,20 @@ + + + + security-token-persisitence-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-token-mysql-sample + pom + + mysql-auth-server + mysql-resource-server + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-mysql-sample/readme.md b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/readme.md new file mode 100644 index 0000000..f091520 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-mysql-sample/readme.md @@ -0,0 +1,104 @@ +# 基于Mysql实现token认证 + +## 参考 + +- [springsecurity+oauth2+mysql持久化](https://www.cnblogs.com/zsg88/p/11382054.html) + + + +## 实现 + +#### 认证服务器配置 + +```java +/** + * 配置客户端从数据库获取 + * @return + */ + @Bean + public JdbcClientDetailsService createJdbcClientDetailsService() { + JdbcClientDetailsService jdbcClientDetailsService = new + JdbcClientDetailsService(dataSource); + return jdbcClientDetailsService; + } + /** + * 使用内存中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 配置客户端 + /** + * 客户端信息从mysql获取 + */ + clients.withClientDetails(jdbcClientDetailsService); + + } + + /** + * 配置 token 节点的安全策略 + * @param security + * @throws Exception + */ + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security + .allowFormAuthenticationForClients()//允许客户端表单认证 + .tokenKeyAccess("permitAll()") // 开启/oauth/token_key访问权限 + .checkTokenAccess("permitAll()");//开启/oauth/check_token的访问权限 + } + +``` + +> 认证服务器需要配置端点权限开放,否则资源服务器访问token_access会报forbidden + +#### 资源服务器配置 + +```java +@Primary + @Bean + public RemoteTokenServices tokenServices() { + //这里需要使用定义一个client,专用于resouce访问认证服务器的客户端 + final RemoteTokenServices tokenService = new RemoteTokenServices(); + tokenService.setCheckTokenEndpointUrl("http://localhost:18090/oauth/check_token"); + tokenService.setClientId("user_client2"); + tokenService.setClientSecret("user"); + return tokenService; + } + +@Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore).tokenServices(tokenServices()); + } +``` + +> 资源服务器需要配置远程校验token,这里需要录入客户端信息,可以固定为一个固定的客户端用于访问认证服务器端点接口 + + + +## 测试 + +- **启动授权服务器和资源服务器** +- **使用密码模式获取token** + +client信息:user_client/user + +post访问:localhost:18090/oauth/token?grant_type=password&username=admin&password=admin + +> 结果: +> +> { +> "access_token": "9bc28e4e-98b9-4ca0-9871-e0fbbefc8c0c", +> "token_type": "bearer", +> "refresh_token": "6eb75275-f2ca-414e-8ada-928fc2fba6bc", +> "expires_in": 7199, +> "scope": "read write" +> } + +- **资源访问** + +get访问:localhost:18091/user/hello + +> hello security mysql token persistence + diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml b/security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml new file mode 100644 index 0000000..bd5665d --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml @@ -0,0 +1,15 @@ + + + + security-token-persisitence_sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + security-token-redis-sample + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml new file mode 100644 index 0000000..deda052 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml @@ -0,0 +1,15 @@ + + + + security-token-redis-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + redis-auth-server + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisAuthServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisAuthServerApplication.java new file mode 100644 index 0000000..005df34 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisAuthServerApplication.java @@ -0,0 +1,35 @@ +package com.gsean.security.token.redis; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:InmemorySecuritySampleApplication + * Description:TODO + * Date:2020/11/23 14:16 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class SecurityTokenRedisAuthServerApplication { + public static void main(String[] args) { + SpringApplication.run(SecurityTokenRedisAuthServerApplication.class,args); + } + + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(Authentication user){ + return "hello security redis token persistence"; + } + } + + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java new file mode 100644 index 0000000..dadd03e --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java @@ -0,0 +1,76 @@ +package com.gsean.security.token.redis.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + private AuthenticationManager authenticationManager;//security中注入的认证管理器 + + + @Autowired + private TokenStore tokenStore; + + + + + + /** + * 使用内存中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 配置客户端 + /** + * 客户端信息从内存获取 + */ + clients + // 使用内存设置 + .inMemory() + // client_id + .withClient("admin") + // client_secret + .secret(passwordEncoder.encode("admin123456")) + // 授权类型 + .authorizedGrantTypes("authorization_code","password","refresh_token") + // 授权范围 + .scopes("all") + // 注册跳转地址 + .redirectUris("http://www.baidu.com"); + /** + * 客户端信息从mysql获取 + */ +// clients.withClientDetails(jdbcClientDetailsService); + + } + + /** + * 认证服务器端点配置:认证服务器管理配置,支持表单登陆 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + + endpoints.authenticationManager(authenticationManager) + .tokenStore(tokenStore); + + + } + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java new file mode 100644 index 0000000..5141918 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java @@ -0,0 +1,37 @@ +package com.gsean.security.token.redis.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private TokenStore tokenStore; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java new file mode 100644 index 0000000..2733e13 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java @@ -0,0 +1,35 @@ +package com.gsean.security.token.redis.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:TokenStoreConfig + * Description:TODO token存储方式配置 + * Date:2020/11/25 09:47 + * Author:GSean + * Version: 1.0 + */ +@Configuration +public class TokenStoreConfig { + + @Autowired + private RedisConnectionFactory redisConnectionFactory; + + + /** + * 使用redis存储token + * @return + */ + @Bean + @Primary + public TokenStore redisTokenStore(){ + return new RedisTokenStore(redisConnectionFactory); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/WebSecurityConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/WebSecurityConfig.java new file mode 100644 index 0000000..8078a98 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/WebSecurityConfig.java @@ -0,0 +1,75 @@ +package com.gsean.security.token.redis.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:WebSecurityConfig + * Description:TODO + * Date:2020/11/23 14:46 + * Author:GSean + * Version: 1.0 + */ +@EnableWebSecurity +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + /** + * 密码加密器 + * @return + */ + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 认证管理器,必须导入的bean,否则oauth认证过程中无法实现表单登陆 + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * 使用内存中的用户名密码授权 + * @param auth + * @throws Exception + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); + } + + /** + * 配置security安全认证通过路径,包括oauth端点,login,logout + * @param http + * @throws Exception + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/oauth/**", "/login/**", "/logout/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .permitAll(); + + } + + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/resources/application.yml b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/resources/application.yml new file mode 100644 index 0000000..0caa049 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/resources/application.yml @@ -0,0 +1,7 @@ +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/db_springboot_demos?serverTimezone=GMT&useSSL=true&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml new file mode 100644 index 0000000..1970977 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml @@ -0,0 +1,15 @@ + + + + security-token-redis-sample + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + redis-resource-server + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java new file mode 100644 index 0000000..005df34 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java @@ -0,0 +1,35 @@ +package com.gsean.security.token.redis; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:InmemorySecuritySampleApplication + * Description:TODO + * Date:2020/11/23 14:16 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class SecurityTokenRedisAuthServerApplication { + public static void main(String[] args) { + SpringApplication.run(SecurityTokenRedisAuthServerApplication.class,args); + } + + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(Authentication user){ + return "hello security redis token persistence"; + } + } + + +} diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java new file mode 100644 index 0000000..5141918 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java @@ -0,0 +1,37 @@ +package com.gsean.security.token.redis.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.TokenStore; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private TokenStore tokenStore; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java new file mode 100644 index 0000000..90c3808 --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java @@ -0,0 +1,63 @@ +package com.gsean.security.token.jwt.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.ClassPathResource; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; +import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; + +import java.security.KeyPair; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:TokenStoreConfig + * Description:TODO token存储方式配置 + * Date:2020/11/25 09:47 + * Author:GSean + * Version: 1.0 + */ +@Configuration +public class TokenStoreConfig { + + @Autowired + private JwtAccessTokenConverter jwtAccessTokenConverter; + /** + * 对称密钥jwt + * @return + */ + @Bean + public JwtAccessTokenConverter jwtAccessTokenConverter(){ + JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); + jwtAccessTokenConverter.setSigningKey("test_key");//配置jwt使用的对称密钥 + return jwtAccessTokenConverter; + } + + /** + * 配置token访问转换器使用rsa + * @return + */ + @Bean + @Primary + public JwtAccessTokenConverter rsaTokenConverter(){ + JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); + KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray()); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair("com.gsean.security.token.com.gsean.security.token.redis.jwt"); + jwtAccessTokenConverter.setKeyPair(keyPair);//配置jwt使用的rsa密钥 + return jwtAccessTokenConverter; + } + + + + + + + @Bean + @Primary + public TokenStore jwtTokenStore(){ + return new JwtTokenStore(jwtAccessTokenConverter); + } +} diff --git a/webflux-demo/pom.xml b/webflux-demo/pom.xml new file mode 100644 index 0000000..f494614 --- /dev/null +++ b/webflux-demo/pom.xml @@ -0,0 +1,15 @@ + + + + gsean-springboot-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + webflux-demo + + + \ No newline at end of file diff --git a/webflux-demo/webflux-sample/pom.xml b/webflux-demo/webflux-sample/pom.xml new file mode 100644 index 0000000..124dc3b --- /dev/null +++ b/webflux-demo/webflux-sample/pom.xml @@ -0,0 +1,15 @@ + + + + webflux-demo + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + webflux-sample + + + \ No newline at end of file diff --git a/webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java b/webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java new file mode 100644 index 0000000..2990c3a --- /dev/null +++ b/webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java @@ -0,0 +1,12 @@ +package com.gsean.webflux.sample; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:WebfluxSampleApplication + * Description:TODO + * Date:2020/11/22 15:47 + * Author:GSean + * Version: 1.0 + */ +public class WebfluxSampleApplication { +} diff --git a/webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java b/webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java new file mode 100644 index 0000000..092c1b1 --- /dev/null +++ b/webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java @@ -0,0 +1,13 @@ +import static org.junit.Assert.*; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:WebfluxSampleApplicationTest2 + * Description:TODO + * Date:2020/11/22 16:10 + * Author:GSean + * Version: 1.0 + */ +public class WebfluxSampleApplicationTest2 { + +} \ No newline at end of file -- Gitee From faf39244afa1a9d07f95e371f111ab606f6c4df3 Mon Sep 17 00:00:00 2001 From: guoc <770292311@qq.com> Date: Thu, 26 Nov 2020 17:19:41 +0800 Subject: [PATCH 2/5] feat(init): springboot-demos-init --- .../liquibase/changelog/release.init.xml | 2 +- internel-demo/bean-demo/pom.xml | 5 + .../java/com/gsean/bean/BeanApplication.java | 7 + .../conditonalDemo/ConditionOnServerType.java | 12 +- .../conditonalDemo/OnServerTypeCOndition.java | 16 +- .../gsean/bean/conditonalDemo/ServerType.java | 1 + .../conditonalDemo/conditionBeanConfig.java | 84 +++++++ .../bean/enableBeanDemo/EnableServer.java | 15 +- .../enableBeanDemo/ServerImportSelector.java | 22 +- .../com/gsean/bean/enableBeanDemo/Type.java | 1 + .../bean/enableBeanDemo/enableBeanDemo.java | 27 +++ .../src/main/resources/application.properties | 1 + .../com/gsean/bean/BeanApplicationTest.java | 29 +++ .../com/gsean/bean/BeanApplicationTest2.java | 50 ++-- jwt-demos/jwt-sample/pom.xml | 23 +- .../jwt/sample/JwtSampleApplication.java | 7 + .../jwt/sample/JwtSampleApplicationTest.java | 47 +++- jwt-demos/jwt-spring-boot-starter/pom.xml | 39 +++- jwt-demos/jwt-spring-boot-starter/readme.md | 63 +++++ .../java/com/gsean/jwt/JwtAutoConfig.java | 17 +- .../com/gsean/jwt/JwtInvalidException.java | 12 +- .../java/com/gsean/jwt/JwtTokenService.java | 49 ++++ .../com/gsean/jwt/JwtTokenServiceImpl.java | 117 +++++++++- .../src/main/java/com/gsean/jwt/JwtUtil.java | 68 ++++++ .../main/java/com/gsean/jwt/PayloadDto.java | 33 +++ .../main/resources/META-INF/spring.factories | 2 +- jwt-demos/pom.xml | 7 +- pom.xml | 37 ++- redis-demos/pom.xml | 7 +- redis-demos/redis-core/pom.xml | 6 +- .../java/com/gsean/redis/util/RedisUtil.java | 11 +- redis-demos/redis-sample/pom.xml | 13 +- .../sample/RedisSampleApplicationTest.java | 22 +- redis-demos/redis-spring-boot-starter/pom.xml | 18 +- .../starter/redis/GseanRedisAutoConfig.java | 12 +- .../starter/redis/util/GseanRedisUtil.java | 7 +- .../main/resources/META-INF/spring.factories | 2 +- security-demo/pom.xml | 17 ++ .../security-inmemory-sample/pom.xml | 13 ++ .../security-inmemory-sample/readme.md | 219 ++++++++++++++++++ .../InmemorySecuritySampleApplication.java | 23 ++ .../config/AuthorizationServerConfig.java | 49 +++- .../sample/config/ResourceServerConfig.java | 64 +++-- .../sample/config/WebSecurityConfig.java | 65 +++++- .../src/main/resources/application.yml | 5 + .../security-inmemory-separate-sample/pom.xml | 6 + .../security-authentication-server/pom.xml | 12 + .../auth2/AuthenticationApplication.java | 7 + .../config/AuthorizationServerConfig.java | 2 +- .../gsean/auth2/config/WebSecurityConfig.java | 9 +- .../security-resource-server/pom.xml | 12 + .../com/gsean/auth2/ResourceApplication.java | 20 ++ .../auth2/config/ResourceServerConfig.java | 15 +- .../pom.xml | 24 +- .../readme.md | 25 ++ .../jwt-auth-server/pom.xml | 26 +++ ...SecurityTokenJwtAuthServerApplication.java | 14 +- .../jwt/config/AuthorizationServerConfig.java | 61 +++-- .../token/jwt/config/JwtTokenEnhancer.java | 22 +- .../jwt/config/ResourceServerConfig.java | 2 +- .../token/jwt/config/TokenStoreConfig.java | 37 ++- .../token/jwt/config/WebSecurityConfig.java | 2 +- .../src/main/resources/application.yml | 2 - .../jwt-resource-server/pom.xml | 16 ++ ...rityTokenJwtResourceServerApplication.java | 9 +- .../jwt/config/ResourceServerConfig.java | 2 +- .../token/jwt/config/TokenStoreConfig.java | 2 +- ...TokenJwtResourceServerApplicationTest.java | 20 +- .../security-token-jwt-sample/pom.xml | 7 +- .../security-token-jwt-sample/readme.md | 127 ++++++++++ .../security-token-redis-sample/pom.xml | 9 +- .../security-token-redis-sample/readme.md | 143 ++++++++++++ .../redis-auth-server/pom.xml | 28 +++ .../config/AuthorizationServerConfig.java | 46 ++-- .../token/redis/config/TokenStoreConfig.java | 20 ++ .../redis-resource-server/pom.xml | 17 ++ ...tyTokenRedisResourceServerApplication.java | 4 +- .../redis/config/ResourceServerConfig.java | 16 +- .../token/redis/config/TokenStoreConfig.java | 44 +--- .../gsean/swagger/config/SwaagerConfig.java | 2 +- webflux-demo/pom.xml | 4 + webflux-demo/webflux-sample/pom.xml | 19 ++ .../sample/WebfluxSampleApplication.java | 21 ++ .../sample/WebfluxSampleApplicationTest2.java | 29 +++ 84 files changed, 1989 insertions(+), 240 deletions(-) create mode 100644 jwt-demos/jwt-spring-boot-starter/readme.md create mode 100644 security-demo/security-inmemory-sample/readme.md create mode 100644 security-demo/security-token-persisitence-sample/readme.md create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/readme.md create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/readme.md diff --git a/data-migration-demo/liquibase-sample/src/main/resources/liquibase/changelog/release.init.xml b/data-migration-demo/liquibase-sample/src/main/resources/liquibase/changelog/release.init.xml index 22e64cd..48b621b 100644 --- a/data-migration-demo/liquibase-sample/src/main/resources/liquibase/changelog/release.init.xml +++ b/data-migration-demo/liquibase-sample/src/main/resources/liquibase/changelog/release.init.xml @@ -7,7 +7,7 @@ - + diff --git a/internel-demo/bean-demo/pom.xml b/internel-demo/bean-demo/pom.xml index d668588..c406233 100644 --- a/internel-demo/bean-demo/pom.xml +++ b/internel-demo/bean-demo/pom.xml @@ -37,6 +37,11 @@ org.projectlombok lombok + + commons-lang + commons-lang + 2.6 + diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/BeanApplication.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/BeanApplication.java index 3ef6bc2..2a09e03 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/BeanApplication.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/BeanApplication.java @@ -1,5 +1,8 @@ package com.gsean.bean; +import com.gsean.bean.enableBeanDemo.EnableServer; +import com.gsean.bean.enableBeanDemo.Type; +import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** @@ -11,5 +14,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * Version: 1.0 */ @SpringBootApplication +@EnableServer(type = Type.FTP) public class BeanApplication { + public static void main(String[] args) { + SpringApplication.run(BeanApplication.class,args); + } } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java index 2c91c2b..9abf418 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ConditionOnServerType.java @@ -1,6 +1,6 @@ -package com.gsean.bean.enableBeanDemo; +package com.gsean.bean.conditonalDemo; -import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Conditional; import java.lang.annotation.*; @@ -13,13 +13,13 @@ import java.lang.annotation.*; * Version: 1.0 */ @Documented -@Target(ElementType.TYPE) +@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) -@Import(ServerImportSelector.class) -public @interface EnableServer { +@Conditional(OnServerTypeCOndition.class) +public @interface ConditionOnServerType { /** * 启动服务类型,默认启动http服务器 * @return */ - Type type() ; + ServerType type() ; } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java index 96bf6f4..931d306 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/OnServerTypeCOndition.java @@ -1,5 +1,9 @@ package com.gsean.bean.conditonalDemo; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + /** * ProjectName:gsean-springboot-demos * ClassName:OnServerTypeCOndition @@ -8,5 +12,15 @@ package com.gsean.bean.conditonalDemo; * Author:GSean * Version: 1.0 */ -public class OnServerTypeCOndition { +public class OnServerTypeCOndition implements Condition{ + /** + * 条件匹配逻辑 + * @param context + * @param metadata + * @return + */ + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return true; + } } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java index b64a6d4..d305120 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/ServerType.java @@ -9,4 +9,5 @@ package com.gsean.bean.conditonalDemo; * Version: 1.0 */ public enum ServerType { + Cache,Redis } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java index 1fb5eaa..471c677 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/conditonalDemo/conditionBeanConfig.java @@ -1,5 +1,11 @@ package com.gsean.bean.conditonalDemo; +import lombok.Data; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + /** * ProjectName:gsean-springboot-demos * ClassName:conditionBeanConfig @@ -8,5 +14,83 @@ package com.gsean.bean.conditonalDemo; * Author:GSean * Version: 1.0 */ +@Configuration public class conditionBeanConfig { + public interface ConI{ + void getCon(); + } + @Data + public class Con01 implements ConI{ + private String name="Con01"; + + @Override + public void getCon() { + System.out.println(this.name); + } + } + @Data + public class Con02 implements ConI{ + private String name="Con02"; + + @Override + public void getCon() { + System.out.println(this.name); + } + } + + /** + * 主配置文件的mycon.select.con有值为01才会被装载,即使无值默认也会装载,因为matchIfMissing = true + * @return + */ + @Bean + @ConditionalOnProperty(value = "mycon.select.con",havingValue = "01",matchIfMissing = true) + public ConI con01(){ + return new Con01(); + } + + @Bean + @ConditionalOnProperty(value = "mycon.select.con",havingValue = "02") + public ConI con02(){ + return new Con02(); + } + + + public interface MyConI{ + void getCon(); + } + @Data + public class MyCon01 implements MyConI{ + private String name="MyCon01 cache"; + + @Override + public void getCon() { + System.out.println(this.name); + } + } + + @Data + public class MyCon02 implements MyConI{ + private String name="MyCon02 com.gsean.security.token.redis"; + + @Override + public void getCon() { + System.out.println(this.name); + } + } + + + @Bean + + @ConditionOnServerType(type = ServerType.Cache) + public MyConI mycon01(){ + return new MyCon01(); + } + + @Bean + @Primary + @ConditionOnServerType(type = ServerType.Redis) + public MyConI mycon02(){ + return new MyCon02(); + } + } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java index 9e4586b..2c91c2b 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/EnableServer.java @@ -1,6 +1,8 @@ -package com.gsean.bean.annotation; +package com.gsean.bean.enableBeanDemo; -import java.lang.annotation.Documented; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; /** * ProjectName:gsean-springboot-demos @@ -11,6 +13,13 @@ import java.lang.annotation.Documented; * Version: 1.0 */ @Documented - +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Import(ServerImportSelector.class) public @interface EnableServer { + /** + * 启动服务类型,默认启动http服务器 + * @return + */ + Type type() ; } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java index faf67fd..55b9b70 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/ServerImportSelector.java @@ -1,5 +1,10 @@ package com.gsean.bean.enableBeanDemo; +import org.springframework.context.annotation.ImportSelector; +import org.springframework.core.type.AnnotationMetadata; + +import java.util.Map; + /** * ProjectName:gsean-springboot-demos * ClassName:ServerImportSelector @@ -8,5 +13,20 @@ package com.gsean.bean.enableBeanDemo; * Author:GSean * Version: 1.0 */ -public class ServerImportSelector { +public class ServerImportSelector implements ImportSelector { + @Override + public String[] selectImports(AnnotationMetadata importingClassMetadata) { + Map annotationAttributes = importingClassMetadata.getAnnotationAttributes(EnableServer.class.getName()); + Type type = (Type) annotationAttributes.get("type"); + String[] importClassNames = new String[0]; + switch (type){ + case FTP: + importClassNames=new String[]{enableBeanDemo.FtpServer.class.getName()}; + break; + case HTTP: + importClassNames=new String[]{enableBeanDemo.HttpServer.class.getName()}; + break; + } + return importClassNames; + } } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java index 5ede075..71122c8 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/Type.java @@ -9,4 +9,5 @@ package com.gsean.bean.enableBeanDemo; * Version: 1.0 */ public enum Type { + HTTP,FTP } diff --git a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java index bfc571f..89f7a85 100644 --- a/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java +++ b/internel-demo/bean-demo/src/main/java/com/gsean/bean/enableBeanDemo/enableBeanDemo.java @@ -1,5 +1,7 @@ package com.gsean.bean.enableBeanDemo; +import org.springframework.stereotype.Component; + /** * ProjectName:gsean-springboot-demos * ClassName:enableBeanDemo @@ -8,5 +10,30 @@ package com.gsean.bean.enableBeanDemo; * Author:GSean * Version: 1.0 */ +@Component public class enableBeanDemo { + public interface Server{ + + void getCurentServer(); + + + } +// @Component + public class HttpServer implements Server { + + @Override + public void getCurentServer() { + System.out.println("current server is http"); + } + } +// @Component + public class FtpServer implements Server { + + @Override + public void getCurentServer() { + System.out.println("current server is ftp"); + } + } + + } diff --git a/internel-demo/bean-demo/src/main/resources/application.properties b/internel-demo/bean-demo/src/main/resources/application.properties index e69de29..ef90116 100644 --- a/internel-demo/bean-demo/src/main/resources/application.properties +++ b/internel-demo/bean-demo/src/main/resources/application.properties @@ -0,0 +1 @@ +mycon.select.con=02 \ No newline at end of file diff --git a/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest.java b/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest.java index 2f177a9..b6bc6c5 100644 --- a/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest.java +++ b/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest.java @@ -1,6 +1,8 @@ package com.gsean.bean; +import com.gsean.bean.conditonalDemo.conditionBeanConfig; import com.gsean.bean.config.BeanConfig; +import com.gsean.bean.enableBeanDemo.enableBeanDemo; import org.junit.Before; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -36,4 +38,31 @@ public class BeanApplicationTest { System.out.println(groups); } + /** + * 测试import中的selector倒入bean + */ + @Test + public void testImportSelector(){ + enableBeanDemo.Server serverBean = context.getBean(enableBeanDemo.Server.class); + serverBean.getCurentServer(); + } + + /** + * 测试spring内置条件注解 + */ + @Test + public void testInnerConditional(){ + conditionBeanConfig.ConI conI = context.getBean(conditionBeanConfig.ConI.class); + conI.getCon(); + } + + + /** + */ + @Test + public void testMyConditional(){ + conditionBeanConfig.MyConI conI = context.getBean(conditionBeanConfig.MyConI.class); + conI.getCon(); + } + } \ No newline at end of file diff --git a/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java b/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java index b2b9312..fde5f82 100644 --- a/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java +++ b/internel-demo/bean-demo/src/test/java/com/gsean/bean/BeanApplicationTest2.java @@ -1,11 +1,11 @@ package com.gsean.bean; import com.gsean.bean.conditonalDemo.conditionBeanConfig; -import com.gsean.bean.config.BeanConfig; -import com.gsean.bean.enableBeanDemo.enableBeanDemo; -import org.junit.Before; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; /** @@ -16,44 +16,30 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext * Author:GSean * Version: 1.0 */ -public class BeanApplicationTest { - private AnnotationConfigApplicationContext context; - @Before - public void buildContext(){ - context = new AnnotationConfigApplicationContext(); - context.register(BeanApplication.class); - context.refresh(); - } +@RunWith(SpringRunner.class) +@SpringBootTest +public class BeanApplicationTest2 { + @Autowired + private conditionBeanConfig.ConI conI; + + @Autowired + private conditionBeanConfig.MyConI myconI; - /** - * bean参数加载容器中的bean - */ - @Test - public void testBeanLoad(){ - BeanConfig.User tom = context.getBean( BeanConfig.User.class); - System.out.println(tom.getName()); - BeanConfig.Group group = context.getBean("group",BeanConfig.Group.class); - System.out.println(group); - BeanConfig.Group groups = context.getBean("groups",BeanConfig.Group.class); - System.out.println(groups); - } /** - * 测试import中的selector倒入bean + * 测试spring内置条件注解 */ @Test - public void testImportSelector(){ - enableBeanDemo.Server serverBean = context.getBean(enableBeanDemo.Server.class); - serverBean.getCurentServer(); + public void testInnerConditional(){ + conI.getCon(); } + /** - * 测试spring内置条件注解 */ @Test - public void testInnerConditional(){ - conditionBeanConfig.ConI conI = context.getBean(conditionBeanConfig.ConI.class); - conI.getCon(); + public void testMyConditional(){ + myconI.getCon(); } } \ No newline at end of file diff --git a/jwt-demos/jwt-sample/pom.xml b/jwt-demos/jwt-sample/pom.xml index 64f1b1a..17f66a9 100644 --- a/jwt-demos/jwt-sample/pom.xml +++ b/jwt-demos/jwt-sample/pom.xml @@ -3,13 +3,32 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - jwt-demos + com.gsean.security.token.com.gsean.security.token.redis.jwt-demos com.gsean.demos 1.0-SNAPSHOT 4.0.0 - jwt-sample + com.gsean.security.token.com.gsean.security.token.redis.jwt-sample + + + + + + + org.springframework.boot + spring-boot-starter-test + + + com.gsean.demos + com.gsean.security.token.com.gsean.security.token.redis.jwt-spring-boot-starter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter + + \ No newline at end of file diff --git a/jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java b/jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java index 9a8c839..48b954f 100644 --- a/jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java +++ b/jwt-demos/jwt-sample/src/main/java/com/gsean/jwt/sample/JwtSampleApplication.java @@ -1,5 +1,8 @@ package com.gsean.jwt.sample; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + /** * ProjectName:gsean-springboot-demos * ClassName:JwtSampleApplication @@ -8,5 +11,9 @@ package com.gsean.jwt.sample; * Author:GSean * Version: 1.0 */ +@SpringBootApplication public class JwtSampleApplication { + public static void main(String[] args) { + SpringApplication.run(JwtSampleApplication.class,args); + } } diff --git a/jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java b/jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java index 206a415..9bebfb9 100644 --- a/jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java +++ b/jwt-demos/jwt-sample/src/test/java/com/gsean/jwt/sample/JwtSampleApplicationTest.java @@ -1,4 +1,12 @@ -import static org.junit.Assert.*; +package com.gsean.jwt.sample; + +import com.gsean.jwt.JwtUtil; +import com.gsean.jwt.PayloadDto; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; /** * ProjectName:gsean-springboot-demos @@ -8,6 +16,43 @@ import static org.junit.Assert.*; * Author:GSean * Version: 1.0 */ +@RunWith(SpringRunner.class) +@SpringBootTest public class JwtSampleApplicationTest { + @Autowired + private JwtUtil jwtUtil; + @Test + public void testJwt(){ + String jwtToken = null; + jwtToken = jwtUtil.generateTokenByHMAC(); + System.out.println(jwtToken); + } + + @Test + public void testVerify(){ + String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdXRob3JpdGllcyI6WyJBRE1JTiJdLCJleHAiOjE2MDYyNzU1NjE3MTgsImlhdCI6MTYwNjI3MTk2MTcxOCwianRpIjoiMTUzZDFiMTUtOTg1Zi00NDczLWI2ZmEtNzdmYWRiNWIxN2MwIiwic3ViIjoibWFjcm8iLCJ1c2VybmFtZSI6Im1hY3JvIn0.r7V5nSSI0t0pE7DBHJ02OPuOtQkX9WOR3jBdjDFmumM"; + PayloadDto payloadDto = jwtUtil.verifyToken(jwtToken); + System.out.println(payloadDto); + } + + @Test + public void testDefaultRSAKey(){ + System.out.println(jwtUtil.getDefaultRSAKey()); + } + + @Test + public void testJwtTokenRSA(){ + String jwtToken = null; + jwtToken = jwtUtil.generateTokenByRSA(); + System.out.println(jwtToken); + } + + @Test + public void testVerifyByRSA(){ + String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdXRob3JpdGllcyI6WyJBRE1JTiJdLCJleHAiOjE2MDYyNzg5ODk1NzIsImlhdCI6MTYwNjI3NTM4OTU3MiwianRpIjoiYzAyNGYzYTQtZWE3Ni00MzU3LTgzMDgtMTliMzhkNGQ0Y2JhIiwic3ViIjoibWFjcm8iLCJ1c2VybmFtZSI6Im1hY3JvIn0.O1bR8Jq4zdBq1fWX68g_cpZoC-jblYuTzEpCO7Yzkhi9VXK8muMO7fF3EU-12aTNSsz5KnviPYArRM3DevFCTeUu-G6PW1KX6RqqC9AT2hUWZabPwhn0QzxMScf7tBMzAzuQkjKOWmjZ-uptSnoQym-zwETu29Ew1ggaYodqKRVxWAJfAu0n-s9x4FFOKMeBue_iVwyXReU7ldazvQZ6CK0hFrQHDYIbuxqGZ5algavLpDxPjMYESyWInAobogEiUVv0AUsJV8n_aYilnkO8Tw1tGiJ-cmebm9Ok5drXBzV6A4BCGsvz6UFp9T9RvsGZPuXglWIfOAmEhV7ANDaFpA"; + PayloadDto payloadDto = jwtUtil.verifyTokenByRSA(jwtToken); + System.out.println(payloadDto); + } + } \ No newline at end of file diff --git a/jwt-demos/jwt-spring-boot-starter/pom.xml b/jwt-demos/jwt-spring-boot-starter/pom.xml index 852efaf..46142b4 100644 --- a/jwt-demos/jwt-spring-boot-starter/pom.xml +++ b/jwt-demos/jwt-spring-boot-starter/pom.xml @@ -3,13 +3,48 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - jwt-demos + com.gsean.security.token.com.gsean.security.token.redis.jwt-demos com.gsean.demos 1.0-SNAPSHOT 4.0.0 - jwt-spring-boot-starter + com.gsean.security.token.com.gsean.security.token.redis.jwt-spring-boot-starter + + + + + + com.nimbusds + nimbus-jose-com.gsean.security.token.com.gsean.security.token.redis.jwt + 8.16 + + + + org.springframework.security + spring-security-rsa + + + org.projectlombok + lombok + provided + + + com.alibaba + fastjson + 1.2.73 + + + org.springframework.boot + spring-boot-starter + + + cn.hutool + hutool-crypto + 5.4.6 + + + \ No newline at end of file diff --git a/jwt-demos/jwt-spring-boot-starter/readme.md b/jwt-demos/jwt-spring-boot-starter/readme.md new file mode 100644 index 0000000..1164392 --- /dev/null +++ b/jwt-demos/jwt-spring-boot-starter/readme.md @@ -0,0 +1,63 @@ +# JWT + +[toc] + +## 参考 + +- [nimbus-jose-com.gsean.security.token.com.gsean.security.token.redis.jwt](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247485769&idx=1&sn=f032cf07e5104112f7a7187d9d254022&scene=21#wechat_redirect) + + + +## 简介 + + + +### 基本概念 + +- **JWT**: 即JSON Web Token,一种传递安全可靠信息的规范 +- **JWS**: 即JSON Web Signature,是JWT规范的一种实现,常用 +- **JWE**: 即JSON Web Encryption,是JWT规范的另一种实现 + + + +## 实现 + + + +token通过RSA非对称密钥私钥签名,公钥验证签名 + + + +- **生成非对称密钥对** + +使用java自带工具keytool生成keypair + +**keytool -genkey -alias com.gsean.security.token.com.gsean.security.token.redis.jwt -keyalg RSA -keystore com.gsean.security.token.com.gsean.security.token.redis.jwt.jks** + +![image-20201125114156286](https://gitee.com/GSean180/img-bed/raw/master/img/image-20201125114156286.png) + +> -genkey:生成密钥对 +> +> -genkey -alias:指定密钥库的中密钥对的别名 +> +> -genkey -keyalg:指定算法,这里指定RSA +> +> -genkey -keystore:密钥库名称,同一密钥库别名不能相同 + +回车后需要录入使用密钥库的密码,这个密钥会在java调用时使用到,需记住 + +```java +@Override + public RSAKey getDefaultRSAKey() { + KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("com.gsean.security.token.com.gsean.security.token.redis.jwt.jks"), "123456".toCharArray()); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair("com.gsean.security.token.com.gsean.security.token.redis.jwt"); + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + RSAKey rasKey = new RSAKey.Builder(publicKey).privateKey(privateKey).build(); + return rasKey; + } +``` + +这里录入123456为密钥库密码 + +获取密钥对别名这里指定为jwt,即和创建密钥的别名一致 \ No newline at end of file diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java index c890a90..3849243 100644 --- a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtAutoConfig.java @@ -1,4 +1,7 @@ -package com.gsean.jwt.config; +package com.gsean.jwt; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; /** * ProjectName:gsean-springboot-demos @@ -8,5 +11,17 @@ package com.gsean.jwt.config; * Author:GSean * Version: 1.0 */ +@Configuration public class JwtAutoConfig { + + @Bean + public JwtTokenService jwtTokenService(){ + return new JwtTokenServiceImpl(); + } + + @Bean + public JwtUtil jwtUtil(JwtTokenService jwtTokenService){ + return new JwtUtil(jwtTokenService); + } + } diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java index afc04e8..6000a8d 100644 --- a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtInvalidException.java @@ -1,5 +1,7 @@ package com.gsean.jwt; +import com.nimbusds.jose.JOSEException; + /** * ProjectName:gsean-springboot-demos * ClassName:JwtInvalidException @@ -8,5 +10,13 @@ package com.gsean.jwt; * Author:GSean * Version: 1.0 */ -public class JwtInvalidException { +public class JwtInvalidException extends JOSEException { + public JwtInvalidException(String message) { + super(message); + } + + public JwtInvalidException(String message, Throwable cause) { + super(message, cause); + } + } diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java index 08638bb..325bffe 100644 --- a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenService.java @@ -1,5 +1,10 @@ package com.gsean.jwt; +import com.nimbusds.jose.JOSEException; +import com.nimbusds.jose.jwk.RSAKey; + +import java.text.ParseException; + /** * ProjectName:gsean-springboot-demos * ClassName:JwtTokenService @@ -9,4 +14,48 @@ package com.gsean.jwt; * Version: 1.0 */ public interface JwtTokenService { + /** + * 通过对称密钥HMAC生成token + * @param payloadStr + * @param secret + * @return + */ + String generateTokenByHMAC(String payloadStr,String secret) throws JOSEException; + + /** + * 校验token 使用对称密钥验证签名 + * @param token + * @param secret + * @return + */ + PayloadDto verifyTokenByHMAC(String token,String secret) throws ParseException, JOSEException; + + + /** + * 获取默认payloadDto,jwt过期时间设置为60min + * @return + */ + PayloadDto getDefaultPayloadDto(); + + /** + * 获取默认的非对称密钥 + * @return + */ + RSAKey getDefaultRSAKey(); + + /** + * 通过非对称密钥签名生成的token + * @param payloadStr + * @param rsaKey + * @return + */ + String generateTokenByRSA(String payloadStr,RSAKey rsaKey) throws JOSEException; + + /** + * 通过公钥验证签名 + * @param token + * @param rsaKey + * @return + */ + PayloadDto verifyTokenByRSA(String token,RSAKey rsaKey) throws ParseException, JOSEException; } diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java index 4d7a933..1450cef 100644 --- a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtTokenServiceImpl.java @@ -1,5 +1,25 @@ package com.gsean.jwt; +import com.alibaba.fastjson.JSON; +import com.nimbusds.jose.*; +import com.nimbusds.jose.crypto.MACSigner; +import com.nimbusds.jose.crypto.MACVerifier; +import com.nimbusds.jose.crypto.RSASSASigner; +import com.nimbusds.jose.crypto.RSASSAVerifier; +import com.nimbusds.jose.jwk.RSAKey; +import org.springframework.core.io.ClassPathResource; +import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; + +import java.security.KeyPair; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.text.ParseException; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.Arrays; +import java.util.Date; +import java.util.UUID; + /** * ProjectName:gsean-springboot-demos * ClassName:JwtTokenServiceImpl @@ -8,5 +28,100 @@ package com.gsean.jwt; * Author:GSean * Version: 1.0 */ -public class JwtTokenServiceImpl { +public class JwtTokenServiceImpl implements JwtTokenService { + @Override + public String generateTokenByHMAC(String payloadStr, String secret) throws JOSEException { + //创建JWS头,设置签名算法和类型 + JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256). + type(JOSEObjectType.JWT) + .build(); + //将负载信息封装到Payload中 + Payload payload = new Payload(payloadStr); + //创建JWS对象 + JWSObject jwsObject = new JWSObject(jwsHeader, payload); + //创建HMAC签名器 + JWSSigner jwsSigner = new MACSigner(secret); + //签名 + jwsObject.sign(jwsSigner); + return jwsObject.serialize(); + } + + @Override + public PayloadDto verifyTokenByHMAC(String token, String secret) throws ParseException, JOSEException { + //从token中解析JWS对象 + JWSObject jwsObject = JWSObject.parse(token); + //创建HMAC验证器 + JWSVerifier jwsVerifier = new MACVerifier(secret); + if (!jwsObject.verify(jwsVerifier)) { + throw new JwtInvalidException("token签名不合法!"); + } + String payload = jwsObject.getPayload().toString(); + PayloadDto payloadDto = JSON.parseObject(payload, PayloadDto.class); + if (payloadDto.getExp() < new Date().getTime()) { + throw new JwtInvalidException("token已过期!"); + } + return payloadDto; + } + + @Override + public PayloadDto getDefaultPayloadDto() { +// Date now = new Date(); + LocalDateTime now=LocalDateTime.now(); + LocalDateTime offset = now.plusMinutes(60); +// Date exp = DateUtil.offsetSecond(now, 60*60); + return PayloadDto.builder() + .sub("macro") + .iat(now.toInstant(ZoneOffset.of("+8")).toEpochMilli()) + .exp(offset.toInstant(ZoneOffset.of("+8")).toEpochMilli()) + .jti(UUID.randomUUID().toString()) + .username("macro") +// .authorities(CollUtil.toList("ADMIN")) + .authorities(Arrays.asList("ADMIN")) + .build(); + } + + @Override + public RSAKey getDefaultRSAKey() { + KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray()); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair("com.gsean.security.token.com.gsean.security.token.redis.jwt"); + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + RSAKey rasKey = new RSAKey.Builder(publicKey).privateKey(privateKey).build(); + return rasKey; + } + + @Override + public String generateTokenByRSA(String payloadStr, RSAKey rsaKey) throws JOSEException { + //创建JWS头,设置签名算法和类型 + JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.RS256). + type(JOSEObjectType.JWT) + .build(); + //将负载信息封装到Payload中 + Payload payload = new Payload(payloadStr); + //创建JWS对象 + JWSObject jwsObject = new JWSObject(jwsHeader, payload); + //创建RSA签名器 + RSASSASigner rsaSigner = new RSASSASigner(rsaKey); + //签名 + jwsObject.sign(rsaSigner); + return jwsObject.serialize(); + } + + @Override + public PayloadDto verifyTokenByRSA(String token, RSAKey rsaKey) throws ParseException, JOSEException { + //从token中解析JWS对象 + JWSObject jwsObject = JWSObject.parse(token); + RSAKey publicRsaKey = rsaKey.toPublicJWK(); + //使用RSA公钥创建RSA验证器 + RSASSAVerifier jwsVerifier = new RSASSAVerifier(publicRsaKey); + if (!jwsObject.verify(jwsVerifier)) { + throw new JwtInvalidException("token签名不合法!"); + } + String payload = jwsObject.getPayload().toString(); + PayloadDto payloadDto = JSON.parseObject(payload, PayloadDto.class); + if (payloadDto.getExp() < new Date().getTime()) { + throw new JwtInvalidException("token已过期!"); + } + return payloadDto; + } } diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java index 3cd70f4..669fe21 100644 --- a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/JwtUtil.java @@ -1,5 +1,12 @@ package com.gsean.jwt; +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSON; +import com.nimbusds.jose.JOSEException; +import com.nimbusds.jose.jwk.RSAKey; + +import java.text.ParseException; + /** * ProjectName:gsean-springboot-demos * ClassName:JwtUtil @@ -9,4 +16,65 @@ package com.gsean.jwt; * Version: 1.0 */ public class JwtUtil { + private JwtTokenService jwtTokenService; + + public JwtUtil(JwtTokenService jwtTokenService) { + this.jwtTokenService=jwtTokenService; + } + + + public String generateTokenByHMAC() { + String res=""; + PayloadDto defaultPayloadDto = jwtTokenService.getDefaultPayloadDto(); + try { + res=jwtTokenService.generateTokenByHMAC(JSON.toJSONString(defaultPayloadDto), SecureUtil.md5("test")); + } catch (JOSEException e) { + e.printStackTrace(); + } + return res; + } + + + public PayloadDto verifyToken(String token) { + try { + PayloadDto test = jwtTokenService.verifyTokenByHMAC(token, SecureUtil.md5("test")); + return test; + } catch (ParseException e) { + e.printStackTrace(); + } catch (JOSEException e) { + e.printStackTrace(); + } + return null; + } + + + public RSAKey getDefaultRSAKey(){ + RSAKey defaultRSAKey = jwtTokenService.getDefaultRSAKey(); + return defaultRSAKey; + } + + + public String generateTokenByRSA() { + String res=""; + PayloadDto defaultPayloadDto = jwtTokenService.getDefaultPayloadDto(); + try { + res=jwtTokenService.generateTokenByRSA(JSON.toJSONString(defaultPayloadDto), jwtTokenService.getDefaultRSAKey()); + } catch (JOSEException e) { + e.printStackTrace(); + } + return res; + } + + + public PayloadDto verifyTokenByRSA(String token) { + try { + PayloadDto test = jwtTokenService.verifyTokenByRSA(token, jwtTokenService.getDefaultRSAKey()); + return test; + } catch (ParseException e) { + e.printStackTrace(); + } catch (JOSEException e) { + e.printStackTrace(); + } + return null; + } } diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java index 9d94e32..6d6d245 100644 --- a/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java +++ b/jwt-demos/jwt-spring-boot-starter/src/main/java/com/gsean/jwt/PayloadDto.java @@ -1,5 +1,9 @@ package com.gsean.jwt; +import lombok.*; + +import java.util.List; + /** * ProjectName:gsean-springboot-demos * ClassName:PayloadDto @@ -8,5 +12,34 @@ package com.gsean.jwt; * Author:GSean * Version: 1.0 */ +@Data +@EqualsAndHashCode(callSuper = false) +@Builder +@AllArgsConstructor +@NoArgsConstructor public class PayloadDto { + /** + * 主题 + */ + private String sub; + /** + * 签发时间 + */ + private Long iat; + /** + * 过期时间 + */ + private Long exp; + /** + * jwt的id + */ + private String jti; + /** + * 用户名称 + */ + private String username; + /** + * 用户拥有的权限 + */ + private List authorities; } diff --git a/jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories b/jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories index 744385b..f919626 100644 --- a/jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/jwt-demos/jwt-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -com.gsean.starter.redis.GseanRedisAutoConfig \ No newline at end of file +com.gsean.com.gsean.security.token.com.gsean.security.token.redis.jwt.JwtAutoConfig \ No newline at end of file diff --git a/jwt-demos/pom.xml b/jwt-demos/pom.xml index 7f226c9..b0443c9 100644 --- a/jwt-demos/pom.xml +++ b/jwt-demos/pom.xml @@ -9,7 +9,12 @@ 4.0.0 - jwt-demos + com.gsean.security.token.com.gsean.security.token.redis.jwt-demos + pom + + com.gsean.security.token.com.gsean.security.token.redis.jwt-spring-boot-starter + com.gsean.security.token.com.gsean.security.token.redis.jwt-sample + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 778a905..69af477 100644 --- a/pom.xml +++ b/pom.xml @@ -10,10 +10,11 @@ 1.0-SNAPSHOT swagger-demo - redis-demos internel-demo mybatis-demo data-migration-demo + webflux-demo + security-demo @@ -22,14 +23,46 @@ org.springframework.boot spring-boot-dependencies - 2.2.2.RELEASE + 2.2.5.RELEASE import pom + + org.springframework.cloud + spring-cloud-dependencies + Hoxton.SR3 + pom + import + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + diff --git a/redis-demos/pom.xml b/redis-demos/pom.xml index 2d4db57..7412d2c 100644 --- a/redis-demos/pom.xml +++ b/redis-demos/pom.xml @@ -9,11 +9,12 @@ 4.0.0 - redis-demos + com.gsean.security.token.redis-demos pom - redis-core - redis-sample + com.gsean.security.token.redis-core + com.gsean.security.token.redis-sample + com.gsean.security.token.redis-spring-boot-starter diff --git a/redis-demos/redis-core/pom.xml b/redis-demos/redis-core/pom.xml index 35309de..1bda089 100644 --- a/redis-demos/redis-core/pom.xml +++ b/redis-demos/redis-core/pom.xml @@ -3,13 +3,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - redis-demos + com.gsean.security.token.redis-demos com.gsean.demos 1.0-SNAPSHOT 4.0.0 - redis-core + com.gsean.security.token.redis-core @@ -26,7 +26,7 @@ org.springframework.boot - spring-boot-starter-data-redis + spring-boot-starter-data-com.gsean.security.token.redis com.fasterxml.jackson.core diff --git a/redis-demos/redis-core/src/main/java/com/gsean/redis/util/RedisUtil.java b/redis-demos/redis-core/src/main/java/com/gsean/redis/util/RedisUtil.java index c04bee6..052db79 100644 --- a/redis-demos/redis-core/src/main/java/com/gsean/redis/util/RedisUtil.java +++ b/redis-demos/redis-core/src/main/java/com/gsean/redis/util/RedisUtil.java @@ -1,8 +1,6 @@ package com.gsean.redis.util; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.util.SerializationUtils; import org.springframework.util.StringUtils; import java.util.Arrays; @@ -206,4 +204,13 @@ public class RedisUtil { public Map hmget(String key){ return redisTemplate.opsForHash().entries(key); } + + /** + * 返回某个hash表的所有值 + * @param key + * @return + */ + public List hmvget(String key){ + return redisTemplate.opsForHash().values(key); + } } diff --git a/redis-demos/redis-sample/pom.xml b/redis-demos/redis-sample/pom.xml index f704dc5..f07dde0 100644 --- a/redis-demos/redis-sample/pom.xml +++ b/redis-demos/redis-sample/pom.xml @@ -3,25 +3,32 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - redis-demos + com.gsean.security.token.redis-demos com.gsean.demos 1.0-SNAPSHOT 4.0.0 - redis-sample + com.gsean.security.token.redis-sample com.gsean.demos - redis-core + com.gsean.security.token.redis-core 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-test + + + + com.gsean.demos + com.gsean.security.token.redis-spring-boot-starter + 1.0-SNAPSHOT + diff --git a/redis-demos/redis-sample/src/test/java/com/gsean/redis/sample/RedisSampleApplicationTest.java b/redis-demos/redis-sample/src/test/java/com/gsean/redis/sample/RedisSampleApplicationTest.java index 24e86d6..0468858 100644 --- a/redis-demos/redis-sample/src/test/java/com/gsean/redis/sample/RedisSampleApplicationTest.java +++ b/redis-demos/redis-sample/src/test/java/com/gsean/redis/sample/RedisSampleApplicationTest.java @@ -1,16 +1,14 @@ package com.gsean.redis.sample; import com.gsean.redis.util.RedisUtil; +import com.gsean.starter.redis.util.GseanRedisUtil; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import static org.junit.Assert.*; - /** * ProjectName:gsean-springboot-demos * ClassName:RedisSampleApplicationTest @@ -26,11 +24,27 @@ public class RedisSampleApplicationTest { @Autowired private RedisUtil redisUtil; + @Autowired + private GseanRedisUtil gseanRedisUtil; + @Test - public void add(){ + public void addStr(){ boolean set = redisUtil.set("test", "test01", 300); Assert.assertEquals(true,set); } + @Test + public void addHash(){ + boolean set = redisUtil.hset("tableName", "item1", "yes",300); + Assert.assertEquals(true,set); + } + + + @Test + public void testStarterAdd(){ + Object key4 = gseanRedisUtil.get("key4"); + System.out.println(key4); + } + } \ No newline at end of file diff --git a/redis-demos/redis-spring-boot-starter/pom.xml b/redis-demos/redis-spring-boot-starter/pom.xml index 3e0eb13..63409f9 100644 --- a/redis-demos/redis-spring-boot-starter/pom.xml +++ b/redis-demos/redis-spring-boot-starter/pom.xml @@ -3,13 +3,27 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - redis-demos + com.gsean.security.token.redis-demos com.gsean.demos 1.0-SNAPSHOT 4.0.0 - redis-spring-boot-starter + com.gsean.security.token.redis-spring-boot-starter + + + + + + org.springframework.boot + spring-boot-starter-data-com.gsean.security.token.redis + + + com.fasterxml.jackson.core + jackson-databind + 2.10.3 + + \ No newline at end of file diff --git a/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java index 48d9c65..455aa4f 100644 --- a/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java +++ b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/GseanRedisAutoConfig.java @@ -1,6 +1,6 @@ -package com.gsean.redis.config; +package com.gsean.starter.redis; -import com.gsean.redis.util.RedisUtil; +import com.gsean.starter.redis.util.GseanRedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -20,12 +20,12 @@ import java.io.Serializable; * Version: 1.0 */ @Configuration -public class RedisConfig { +public class GseanRedisAutoConfig { @Autowired(required = false) private LettuceConnectionFactory connectionFactory; - @Bean + @Bean(name = "gseanRedisTemplate") public RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); @@ -45,8 +45,8 @@ public class RedisConfig { } @Bean - public RedisUtil redisUtil(){ - return new RedisUtil(redisTemplate()); + public GseanRedisUtil gseanRedisUtil(){ + return new GseanRedisUtil(redisTemplate()); } } diff --git a/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java index 052db79..7a00b5a 100644 --- a/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java +++ b/redis-demos/redis-spring-boot-starter/src/main/java/com/gsean/starter/redis/util/GseanRedisUtil.java @@ -1,5 +1,6 @@ -package com.gsean.redis.util; +package com.gsean.starter.redis.util; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.StringUtils; @@ -16,10 +17,10 @@ import java.util.concurrent.TimeUnit; * Author:GSean * Version: 1.0 */ -public class RedisUtil { +public class GseanRedisUtil { private RedisTemplate redisTemplate; - public RedisUtil(RedisTemplate redisTemplate) { + public GseanRedisUtil(@Qualifier("gseanRedisTemplate") RedisTemplate redisTemplate) { this.redisTemplate=redisTemplate; } diff --git a/redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories b/redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories index 369d1a8..57fa838 100644 --- a/redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/redis-demos/redis-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -com.open.capacity.redis.RedisAutoConfig \ No newline at end of file +com.gsean.starter.com.gsean.security.token.redis.GseanRedisAutoConfig \ No newline at end of file diff --git a/security-demo/pom.xml b/security-demo/pom.xml index 2a6debe..fe9a666 100644 --- a/security-demo/pom.xml +++ b/security-demo/pom.xml @@ -10,6 +10,23 @@ 4.0.0 security-demo + pom + + security-inmemory-sample + security-inmemory-separate-sample + security-token-persisitence-sample + + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.0 + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-sample/pom.xml b/security-demo/security-inmemory-sample/pom.xml index 1e78266..aa16597 100644 --- a/security-demo/security-inmemory-sample/pom.xml +++ b/security-demo/security-inmemory-sample/pom.xml @@ -12,4 +12,17 @@ security-inmemory-sample + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-sample/readme.md b/security-demo/security-inmemory-sample/readme.md new file mode 100644 index 0000000..f374fd6 --- /dev/null +++ b/security-demo/security-inmemory-sample/readme.md @@ -0,0 +1,219 @@ +# spring cloud security oatuh2 + +[toc] + + + +## 内存实现 + + + +### 功能 + + + +使用springcloud的oatuh2协议实现资源服务和认证服务,认证通过认证登陆页面首先登陆,然后获取用户token进行资源访问 + + + +### 参考 + + + +[Spring Cloud Security:Oauth2使用入门](https://juejin.cn/post/6844903987137740813) + + + +### 实现步骤 + + + +- **引入依赖** + +```maven + + org.springframework.cloud + spring-cloud-starter-oauth2 + +``` + +- **SpringSecurity配置,允许认证相关路径的访问及表单登陆** + +```java +@EnableWebSecurity +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + /** + * 密码加密器 + * @return + */ + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 认证管理器,必须导入的bean,否则oauth认证过程中无法实现表单登陆 + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * 使用内存中的用户名密码授权 + * @param auth + * @throws Exception + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); + } + + /** + * 配置security安全认证通过路径,包括oauth端点,login,logout + * @param http + * @throws Exception + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/oauth/**", "/login/**", "/logout/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .permitAll(); + + } +} +``` + +- **认证服务器配置** + +```java +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private BCryptPasswordEncoder passwordEncoder; + + @Autowired + private AuthenticationManager authenticationManager;//security中注入的认证管理器 + + /** + * 使用内存中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 配置客户端 + clients + // 使用内存设置 + .inMemory() + // client_id + .withClient("admin") + // client_secret + .secret(passwordEncoder.encode("admin123456")) + // 授权类型 + .authorizedGrantTypes("authorization_code","password") + // 授权范围 + .scopes("all") + // 注册跳转地址 + .redirectUris("http://www.baidu.com"); + + } + + /** + * 认证服务器端点配置:认证服务器管理配置,支持表单登陆 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.authenticationManager(authenticationManager); + } + + //http://localhost:18081/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.com&scope=all&state=normal +} +``` + +- **配置资源服务器** + +```java +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + super.configure(resources); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} +``` + + + +### 测试 + + + +#### 用户授权密码认证 + +- 录入客户端认证 + +![](https://gitee.com/GSean180/img-bed/raw/master/img/image-20201123182814515.png) + +- 发送请求获取token + +localhost:18081/oauth/token?grant_type=password&username=admin&password=admin&scope=all + +- 用返回的token访问保护资源 + +![](https://gitee.com/GSean180/img-bed/raw/master/img/image-20201123183048825.png) + + + +#### 用户授权码授权认证 + +- get获取用户授权码 + +http://localhost:18081/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.com&scope=all + +访问后会弹出security表单登陆让用户进行认证登陆并授权 + +![image-20201123183903843](https://gitee.com/GSean180/img-bed/raw/master/img/image-20201123183903843.png) + +![image-20201123183927689](https://gitee.com/GSean180/img-bed/raw/master/img/image-20201123183927689.png) + +- 客户端用用户授权码获取token + +同密码认证一样都需要录入Authorization,为客户端的id和密钥 + +localhost:18081/oauth/token?grant_type=authorization_code&code=uYc2kN&client_id=admin&redirect_uri=http://www.baidu.com&scope=all + +![image-20201123184119149](https://gitee.com/GSean180/img-bed/raw/master/img/image-20201123184119149.png) + diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java index aa2bb80..8e1785e 100644 --- a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/InmemorySecuritySampleApplication.java @@ -1,5 +1,11 @@ package com.gsean.security.inmemory.sample; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + /** * ProjectName:gsean-springboot-demos * ClassName:InmemorySecuritySampleApplication @@ -8,5 +14,22 @@ package com.gsean.security.inmemory.sample; * Author:GSean * Version: 1.0 */ +@SpringBootApplication public class InmemorySecuritySampleApplication { + public static void main(String[] args) { + SpringApplication.run(InmemorySecuritySampleApplication.class,args); + } + + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(){ + return "hello security inmemory"; + } + } + + //http://localhost:18081/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://www.baidu.com&scope=all&state=normal + } diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java index 11b395d..a851df5 100644 --- a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/AuthorizationServerConfig.java @@ -1,14 +1,57 @@ package com.gsean.security.inmemory.sample.config; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; -//@Configuration -//@EnableAuthorizationServer -public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private BCryptPasswordEncoder passwordEncoder; + @Autowired + private AuthenticationManager authenticationManager;//security中注入的认证管理器 + + /** + * 使用内存中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 配置客户端 + clients + // 使用内存设置 + .inMemory() + // client_id + .withClient("admin") + // client_secret + .secret(passwordEncoder.encode("admin123456")) + // 授权类型 + .authorizedGrantTypes("authorization_code","password") + // 授权范围 + .scopes("all") + // 注册跳转地址 + .redirectUris("http://www.baidu.com"); + + } + + /** + * 认证服务器端点配置:认证服务器管理配置,支持表单登陆 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.authenticationManager(authenticationManager); + } + + //http://localhost:18081/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.com&scope=all&state=normal } diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java index 760b74f..7734b0a 100644 --- a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/ResourceServerConfig.java @@ -1,33 +1,31 @@ -//package com.gsean.security.inmemory.sample.config; -// -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -//import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; -//import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; -// -////@Configuration -////@EnableAuthorizationServer -//public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { -// -// @Autowired -// private BCryptPasswordEncoder passwordEncoder; -// -// @Override -// public void configure(ClientDetailsServiceConfigurer clients) throws Exception { -// // 配置客户端 -// clients -// // 使用内存设置 -// .inMemory() -// // client_id -// .withClient("client") -// // client_secret -// .secret(passwordEncoder.encode("secret")) -// // 授权类型 -// .authorizedGrantTypes("authorization_code") -// // 授权范围 -// .scopes("app") -// // 注册跳转地址 -// .redirectUris("http://www.funtl.com"); -// -// } -//} +package com.gsean.security.inmemory.sample.config;//package com.gsean.security.inmemory.com.gsean.security.token.com.gsean.security.token.com.gsean.security.token.redis.jwt.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; + +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + super.configure(resources); + } + + /** + * 配置需要资源服务器需要保护的资源 + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .requestMatchers() + .antMatchers("/user/**"); + } +} diff --git a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java index 5e836c2..9bccce5 100644 --- a/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java +++ b/security-demo/security-inmemory-sample/src/main/java/com/gsean/security/inmemory/sample/config/WebSecurityConfig.java @@ -1,5 +1,14 @@ package com.gsean.security.inmemory.sample.config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + /** * ProjectName:gsean-springboot-demos * ClassName:WebSecurityConfig @@ -8,5 +17,59 @@ package com.gsean.security.inmemory.sample.config; * Author:GSean * Version: 1.0 */ -public class WebSecurityConfig { +@EnableWebSecurity +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + /** + * 密码加密器 + * @return + */ + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 认证管理器,必须导入的bean,否则oauth认证过程中无法实现表单登陆 + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * 使用内存中的用户名密码授权 + * @param auth + * @throws Exception + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); + } + + /** + * 配置security安全认证通过路径,包括oauth端点,login,logout + * @param http + * @throws Exception + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/oauth/**", "/login/**", "/logout/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .permitAll(); + + } + + } diff --git a/security-demo/security-inmemory-sample/src/main/resources/application.yml b/security-demo/security-inmemory-sample/src/main/resources/application.yml index e69de29..196b567 100644 --- a/security-demo/security-inmemory-sample/src/main/resources/application.yml +++ b/security-demo/security-inmemory-sample/src/main/resources/application.yml @@ -0,0 +1,5 @@ +#security: +# oauth2: +# client: +# client-id: app01 +# client-secret: app01 diff --git a/security-demo/security-inmemory-separate-sample/pom.xml b/security-demo/security-inmemory-separate-sample/pom.xml index 7472a08..601b7d1 100644 --- a/security-demo/security-inmemory-separate-sample/pom.xml +++ b/security-demo/security-inmemory-separate-sample/pom.xml @@ -10,6 +10,12 @@ 4.0.0 security-inmemory-separate-sample + pom + 资源服务器和认证服务器分离sample + + security-authentication-server + security-resource-server + \ No newline at end of file diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml b/security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml index 2c7b35a..dfa9e70 100644 --- a/security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/pom.xml @@ -12,4 +12,16 @@ security-authentication-server + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + org.springframework.boot + spring-boot-starter-web + + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java index 906b981..df3d56d 100644 --- a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/AuthenticationApplication.java @@ -1,5 +1,8 @@ package com.gsean.auth2; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + /** * ProjectName:gsean-springboot-demos * ClassName:AuthenticationApplication @@ -8,5 +11,9 @@ package com.gsean.auth2; * Author:GSean * Version: 1.0 */ +@SpringBootApplication public class AuthenticationApplication { + public static void main(String[] args) { + SpringApplication.run(AuthenticationApplication.class,args); + } } diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java index a851df5..63cb695 100644 --- a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/AuthorizationServerConfig.java @@ -1,4 +1,4 @@ -package com.gsean.security.inmemory.sample.config; +package com.gsean.auth2.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; diff --git a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java index 9bccce5..91cb776 100644 --- a/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java +++ b/security-demo/security-inmemory-separate-sample/security-authentication-server/src/main/java/com/gsean/auth2/config/WebSecurityConfig.java @@ -1,10 +1,11 @@ -package com.gsean.security.inmemory.sample.config; +package com.gsean.auth2.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -71,5 +72,11 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { } + @Override + public void configure(WebSecurity web) throws Exception { + // 将 check_token 暴露出去,否则资源服务器访问时报 403 错误 + web.ignoring().antMatchers("/oauth/check_token"); + } + } diff --git a/security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml b/security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml index 36243fc..5d9af86 100644 --- a/security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml +++ b/security-demo/security-inmemory-separate-sample/security-resource-server/pom.xml @@ -12,4 +12,16 @@ security-resource-server + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + org.springframework.boot + spring-boot-starter-web + + + + \ No newline at end of file diff --git a/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java index d51ca2d..a801576 100644 --- a/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java +++ b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/ResourceApplication.java @@ -1,5 +1,11 @@ package com.gsean.auth2; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + /** * ProjectName:gsean-springboot-demos * ClassName:ResourceApplication @@ -8,5 +14,19 @@ package com.gsean.auth2; * Author:GSean * Version: 1.0 */ +@SpringBootApplication public class ResourceApplication { + public static void main(String[] args) { + SpringApplication.run(ResourceApplication.class,args); + } + + + @RestController + @RequestMapping("/user") + public class HelloController{ + @GetMapping("/hello") + public String hello(){ + return "hello inmemory resource"; + } + } } diff --git a/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java index 3ca223b..13f9a25 100644 --- a/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java +++ b/security-demo/security-inmemory-separate-sample/security-resource-server/src/main/java/com/gsean/auth2/config/ResourceServerConfig.java @@ -1,10 +1,13 @@ -package com.gsean.security.inmemory.sample.config;//package com.gsean.security.inmemory.sample.config; +package com.gsean.auth2.config;//package com.gsean.security.inmemory.com.gsean.security.token.com.gsean.security.token.com.gsean.security.token.redis.jwt.config; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.RemoteTokenServices; @Configuration @EnableResourceServer @@ -28,4 +31,14 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { .requestMatchers() .antMatchers("/user/**"); } + + @Primary + @Bean + public RemoteTokenServices tokenServices() { + final RemoteTokenServices tokenService = new RemoteTokenServices(); + tokenService.setCheckTokenEndpointUrl("http://localhost:18082/oauth/check_token"); + tokenService.setClientId("admin"); + tokenService.setClientSecret("admin123456"); + return tokenService; + } } diff --git a/security-demo/security-token-persisitence-sample/pom.xml b/security-demo/security-token-persisitence-sample/pom.xml index 673e501..0917e34 100644 --- a/security-demo/security-token-persisitence-sample/pom.xml +++ b/security-demo/security-token-persisitence-sample/pom.xml @@ -9,25 +9,15 @@ 4.0.0 - security-token-persisitence_sample + security-token-persisitence-sample + pom + + security-token-jwt-sample + security-token-redis-sample + security-token-mysql-sample + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-oauth2 - - - com.gsean.demos - redis-spring-boot-starter - 1.0-SNAPSHOT - - - \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/readme.md b/security-demo/security-token-persisitence-sample/readme.md new file mode 100644 index 0000000..57e64bf --- /dev/null +++ b/security-demo/security-token-persisitence-sample/readme.md @@ -0,0 +1,25 @@ +# jwt存储token + +## 参考 + +- [jwt存储对称和非对称两种实现方式](https://www.cnblogs.com/hellxz/p/12044340.html) +- [微服务统⼀认证⽅案 Spring Cloud OAuth2 + JWT](https://juejin.cn/post/6855302923996856334) + +## token存储 + +### token存储方式 +- 内存 +- com.gsean.security.token.com.gsean.security.token.redis.jwt +- jdbc +- com.gsean.security.token.redis + +jdbc和redis生成的token都是一个随机的uuid,里面不含有用户信息,校验token出了校验有效时间,还需要校验这个token是由哪个用户授权给哪个客户端的,所以资源服务器还需要再一次访问授权服务器check_token用户信息,而jwt本身默认包含了用户信息,即谁授权给谁,因此可以直接在资源服务器校验 + +check_token校验流程 + +- token是否存在 +- token是否失效 +- token能否加载认证信息(谁授权给谁,有哪些权限) + +所以uuid形式的token不包含认证信息,需要查询数据库中相关表获取到认证信息 + diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml index 58b35bb..43b0783 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/pom.xml @@ -12,4 +12,30 @@ jwt-auth-server + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + com.baomidou + mybatis-plus-boot-starter + + + mysql + mysql-connector-java + runtime + + + com.alibaba + fastjson + 1.2.73 + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java index 1fdb0b5..c35304d 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtAuthServerApplication.java @@ -1,7 +1,9 @@ -package sample; +package com.gsean.security.token.jwt; +import com.alibaba.fastjson.JSON; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,9 +17,9 @@ import org.springframework.web.bind.annotation.RestController; * Version: 1.0 */ @SpringBootApplication -public class SecurityTokenPersistenceSampleApplication { +public class SecurityTokenJwtAuthServerApplication { public static void main(String[] args) { - SpringApplication.run(SecurityTokenPersistenceSampleApplication.class,args); + SpringApplication.run(SecurityTokenJwtAuthServerApplication.class,args); } @@ -25,11 +27,11 @@ public class SecurityTokenPersistenceSampleApplication { @RequestMapping("/user") public class HelloController{ @GetMapping("/hello") - public String hello(){ - return "hello security token persistence"; + public String hello(Authentication user){ +// return "hello security com.gsean.security.token.com.gsean.security.token.redis.jwt token persistence"; + return JSON.toJSONString(user); } } - //http://localhost:18081/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://www.baidu.com&scope=all&state=normal } diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java index d3a749d..8a80671 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/AuthorizationServerConfig.java @@ -1,4 +1,4 @@ -package com.gsean.security.tokenpersisence.sample.config; +package com.gsean.security.token.jwt.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -8,9 +8,15 @@ import org.springframework.security.oauth2.config.annotation.configurers.ClientD import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.security.oauth2.provider.token.TokenEnhancer; +import org.springframework.security.oauth2.provider.token.TokenEnhancerChain; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import java.util.ArrayList; +import java.util.List; + @Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @@ -28,6 +34,13 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap @Autowired private JwtAccessTokenConverter jwtAccessTokenConverter; + @Autowired + private JdbcClientDetailsService jdbcClientDetailsService; + + @Autowired + private JwtTokenEnhancer jwtTokenEnhancer; + + /** * 使用内存中的客户端信息 * @param clients @@ -36,19 +49,26 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { // 配置客户端 - clients - // 使用内存设置 - .inMemory() - // client_id - .withClient("admin") - // client_secret - .secret(passwordEncoder.encode("admin123456")) - // 授权类型 - .authorizedGrantTypes("authorization_code","password","refresh_token") - // 授权范围 - .scopes("all") - // 注册跳转地址 - .redirectUris("http://www.baidu.com"); + /** + * 客户端信息从内存获取 + */ +// clients +// // 使用内存设置 +// .inMemory() +// // client_id +// .withClient("admin") +// // client_secret +// .secret(passwordEncoder.encode("admin123456")) +// // 授权类型 +// .authorizedGrantTypes("authorization_code","password","refresh_token") +// // 授权范围 +// .scopes("all") +// // 注册跳转地址 +// .redirectUris("http://www.baidu.com"); + /** + * 客户端信息从mysql获取 + */ + clients.withClientDetails(jdbcClientDetailsService); } @@ -59,9 +79,18 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap */ @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + TokenEnhancerChain enhancerChain = new TokenEnhancerChain(); + List delegates = new ArrayList<>(); + delegates.add(jwtTokenEnhancer); //配置JWT的内容增强器 + delegates.add(jwtAccessTokenConverter); + enhancerChain.setTokenEnhancers(delegates); + endpoints.authenticationManager(authenticationManager) - .tokenStore(tokenStore).accessTokenConverter(jwtAccessTokenConverter); + .tokenStore(tokenStore) + .tokenEnhancer(enhancerChain) + .accessTokenConverter(jwtAccessTokenConverter); + + } - //http://localhost:18081/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.com&scope=all&state=normal } diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java index c4c9cbc..6bfd57d 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/JwtTokenEnhancer.java @@ -1,12 +1,30 @@ package com.gsean.security.token.jwt.config; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.token.TokenEnhancer; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + /** * ProjectName:gsean-springboot-demos * ClassName:JwtTokenEnhancer - * Description:TODO + * Description:TODO jwt内容增强器 * Date:2020/11/25 17:35 * Author:GSean * Version: 1.0 */ -public class JwtTokenEnhancer { +@Component +public class JwtTokenEnhancer implements TokenEnhancer { + + @Override + public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { + Map info=new HashMap<>(); + info.put("enhance","enhance info"); + ((DefaultOAuth2AccessToken)accessToken).setAdditionalInformation(info); + return accessToken; + } } diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java index b88bf49..7ddbfd1 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java @@ -1,4 +1,4 @@ -package com.gsean.security.tokenpersisence.sample.config;//package com.gsean.security.inmemory.sample.config; +package com.gsean.security.token.jwt.config;//package com.gsean.security.inmemory.com.gsean.security.token.com.gsean.security.token.com.gsean.security.token.redis.jwt.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java index 3feb877..6d08bfa 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java @@ -1,17 +1,17 @@ -package com.gsean.security.tokenpersisence.sample.config; +package com.gsean.security.token.jwt.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.ClassPathResource; -import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; -import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; +import javax.sql.DataSource; import java.security.KeyPair; /** @@ -24,9 +24,29 @@ import java.security.KeyPair; */ @Configuration public class TokenStoreConfig { + + @Autowired + private JwtAccessTokenConverter jwtAccessTokenConverter; + @Autowired - private RedisConnectionFactory redisConnectionFactory; + private DataSource dataSource; + + + /** + * 配置客户端从数据库获取 + * @return + */ + @Bean + public JdbcClientDetailsService createJdbcClientDetailsService() { + JdbcClientDetailsService jdbcClientDetailsService = new + JdbcClientDetailsService(dataSource); + return jdbcClientDetailsService; + } + /** + * 对称密钥jwt + * @return + */ @Bean public JwtAccessTokenConverter jwtAccessTokenConverter(){ JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); @@ -43,7 +63,7 @@ public class TokenStoreConfig { public JwtAccessTokenConverter rsaTokenConverter(){ JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray()); - KeyPair keyPair = keyStoreKeyFactory.getKeyPair("jwt"); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair("com.gsean.security.token.com.gsean.security.token.redis.jwt"); jwtAccessTokenConverter.setKeyPair(keyPair);//配置jwt使用的rsa密钥 return jwtAccessTokenConverter; } @@ -51,15 +71,12 @@ public class TokenStoreConfig { - @Bean - public TokenStore redisTokenStore(){ - return new RedisTokenStore(redisConnectionFactory); - } + @Bean @Primary public TokenStore jwtTokenStore(){ - return new JwtTokenStore(rsaTokenConverter()); + return new JwtTokenStore(jwtAccessTokenConverter); } } diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java index 04f9e74..3cfd37d 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/java/com/gsean/security/token/jwt/config/WebSecurityConfig.java @@ -1,4 +1,4 @@ -package com.gsean.security.tokenpersisence.sample.config; +package com.gsean.security.token.jwt.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml index 1efaf0d..0caa049 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-auth-server/src/main/resources/application.yml @@ -5,5 +5,3 @@ spring: password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver - liquibase: - change-log: classpath:/liquibase/master.xml diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml index f3d0e5e..df37da7 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/pom.xml @@ -11,5 +11,21 @@ jwt-resource-server + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + com.nimbusds + nimbus-jose-jwt + 8.16 + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java index ae2ac45..4c57296 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplication.java @@ -15,9 +15,9 @@ import org.springframework.web.bind.annotation.RestController; * Version: 1.0 */ @SpringBootApplication -public class SecurityTokenJwtAuthServerApplication { +public class SecurityTokenJwtResourceServerApplication { public static void main(String[] args) { - SpringApplication.run(SecurityTokenJwtAuthServerApplication.class,args); + SpringApplication.run(SecurityTokenJwtResourceServerApplication.class,args); } @@ -26,9 +26,12 @@ public class SecurityTokenJwtAuthServerApplication { public class HelloController{ @GetMapping("/hello") public String hello(){ - return "hello security jwt token persistence"; + return "hello security com.gsean.security.token.com.gsean.security.token.redis.jwt token persistence"; } } + + + } diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java index 30ccdf4..7ddbfd1 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/ResourceServerConfig.java @@ -1,4 +1,4 @@ -package com.gsean.security.token.jwt.config;//package com.gsean.security.inmemory.com.gsean.security.token.jwt.config; +package com.gsean.security.token.jwt.config;//package com.gsean.security.inmemory.com.gsean.security.token.com.gsean.security.token.com.gsean.security.token.redis.jwt.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java index 4e4d6ac..90c3808 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/main/java/com/gsean/security/token/jwt/config/TokenStoreConfig.java @@ -45,7 +45,7 @@ public class TokenStoreConfig { public JwtAccessTokenConverter rsaTokenConverter(){ JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray()); - KeyPair keyPair = keyStoreKeyFactory.getKeyPair("jwt"); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair("com.gsean.security.token.com.gsean.security.token.redis.jwt"); jwtAccessTokenConverter.setKeyPair(keyPair);//配置jwt使用的rsa密钥 return jwtAccessTokenConverter; } diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java index 7c763ef..dcad79f 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/jwt-resource-server/src/test/java/com/gsean/security/token/jwt/SecurityTokenJwtResourceServerApplicationTest.java @@ -1,4 +1,9 @@ -import static org.junit.Assert.*; +package com.gsean.security.token.jwt; + + +import com.nimbusds.jose.JWSObject; + +import java.text.ParseException; /** * ProjectName:gsean-springboot-demos @@ -9,5 +14,18 @@ import static org.junit.Assert.*; * Version: 1.0 */ public class SecurityTokenJwtResourceServerApplicationTest { + public static void main(String[] args) { + String token="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdLCJleHAiOjE2MDYzMDU3NzMsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iXSwianRpIjoiZmJlNTE1N2UtMzAwYy00NzhkLWFlYTAtNTBlZDhlNmU4NjlmIiwiY2xpZW50X2lkIjoidXNlcl9jbGllbnQiLCJlbmhhbmNlIjoiZW5oYW5jZSBpbmZvIn0.Ls6yfVAZB8g856ky9M0oSV-YWzVBvm_KmRWSWqT8xvNb0wvhjNErq4sgXsmC-vzR5ClKMd0BgIPG4J8jAX_1kDe3NKLi_X3RwRqfOFslZQMcHw6aQa1ox6XMGTd7Brbvp9xgAONEMTl_d98f2agkB3B6nUZFvgfdMU5sOpS2-BXSmdyXUglT8UjTTc8OdWs613pPj_gXBMZmhLADCX_8vG-w7_DI3ZWYmi2w9_9qRAoquWhyVe0NZ54qXOD58qg6QBL79GZFtdBWeG8P8WeDBo9VbAfO_hIoh1gwOzzgtuDL4buTPd2EXi1dzMYwQmp0WF2z2oWkuxGJnDJRxHk7aA"; + //从token中解析JWS对象 + JWSObject jwsObject = null; + try { + jwsObject = JWSObject.parse(token); + } catch (ParseException e) { + e.printStackTrace(); + } + //创建HMAC验证器 + String payload = jwsObject.getPayload().toString(); + System.out.println(payload); + } } \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml index d521f15..7c69b13 100644 --- a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/pom.xml @@ -3,13 +3,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - security-token-persisitence_sample + security-token-persisitence-sample com.gsean.demos 1.0-SNAPSHOT 4.0.0 security-token-jwt-sample + pom + + jwt-auth-server + jwt-resource-server + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-jwt-sample/readme.md b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/readme.md new file mode 100644 index 0000000..ca2580c --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-jwt-sample/readme.md @@ -0,0 +1,127 @@ +# 基于JWT实现token认证 + +## 参考 + +- [微服务统⼀认证⽅案 Spring Cloud OAuth2 + JWT](https://juejin.cn/post/6855302923996856334#heading-17) + +- [Spring Cloud Security:Oauth2结合JWT使用](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484130&idx=1&sn=299fc3c9bb0147a2858cde9b33322b44&chksm=fc2fbeeacb5837fc7c1a4ed6a9f31c9ec954bb0ca3d83931b3a0f960d89fd48b375cab2eadac&scene=178&cur_album_id=1344323159075553282#rd) +- [jwt在线解析工具](https://www.jstoolset.com/com.gsean.security.token.com.gsean.security.token.redis.jwt) +- [SpringBoot 整合 oauth2(五)实现 com.gsean.security.token.com.gsean.security.token.redis.jwt 及 扩展](https://www.jianshu.com/p/766cf742e3e8) + +## 实现 + +### 客户端持久化 + +```sql +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; +-- ---------------------------- +配置数据源 +-- Table structure for oauth_client_details +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_client_details`; +CREATE TABLE `oauth_client_details` ( +`client_id` varchar(48) NOT NULL, +`resource_ids` varchar(256) DEFAULT NULL, +`client_secret` varchar(256) DEFAULT NULL, +`scope` varchar(256) DEFAULT NULL, +`authorized_grant_types` varchar(256) DEFAULT NULL, +`web_server_redirect_uri` varchar(256) DEFAULT NULL, +`authorities` varchar(256) DEFAULT NULL, +`access_token_validity` int(11) DEFAULT NULL, +`refresh_token_validity` int(11) DEFAULT NULL, +`additional_information` varchar(4096) DEFAULT NULL, +`autoapprove` varchar(256) DEFAULT NULL, +PRIMARY KEY (`client_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- ---------------------------- +-- Records of oauth_client_details +-- ---------------------------- + +SET FOREIGN_KEY_CHECKS = 1; + +``` + +> - 客户端细腻维护在数据库 +> - resouceids是限制客户端访问资源设置,不设置默认访问所有资源 +> - client_secret需要加密 + +### jwt内容扩展 + +- **实现TokenEnhancer** + +```java +@Component +public class JwtTokenEnhancer implements TokenEnhancer { + + @Override + public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { + Map info=new HashMap<>(); + info.put("enhance","enhance info"); + ((DefaultOAuth2AccessToken)accessToken).setAdditionalInformation(info); + return accessToken; + } +} +``` + +- **认证服务器配置** + +```java + /** + * 认证服务器端点配置:认证服务器管理配置,支持表单登陆 + * @param endpoints + * @throws Exception + */ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + TokenEnhancerChain enhancerChain = new TokenEnhancerChain(); + List delegates = new ArrayList<>(); + delegates.add(jwtTokenEnhancer); //配置JWT的内容增强器 + delegates.add(jwtAccessTokenConverter); + enhancerChain.setTokenEnhancers(delegates); + + endpoints.authenticationManager(authenticationManager) + .tokenStore(tokenStore) + .tokenEnhancer(enhancerChain) + .accessTokenConverter(jwtAccessTokenConverter); + + + } +``` + +> 增加enhancerChain + +![image-20201125181315221](https://gitee.com/GSean180/img-bed/raw/master/img/image-20201125181315221.png) + + + + + + + +## 测试 + +- **启动授权服务器和资源服务器** +- **使用密码模式获取token** + +client信息:user_client/user + +post访问:localhost:18086/oauth/token?grant_type=password&username=admin&password=admin + +> 结果: +> +> { +> "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDYzMDI2MzEsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9BRE1JTiJdLCJqdGkiOiIzY2Q0MDEzNy1hNjg2LTQ5OWMtODRiYS00Y2RlN2ZjZTIwM2EiLCJjbGllbnRfaWQiOiJ1c2VyX2NsaWVudCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdfQ.k6vRegXqrB74vmLi0z-a1jFULBOTnUXGw93rBwbDSSdSBph9JeEBq-xOWJBeRxmSD32LfUy9bQZazAg24NEczB2K6ao_pzniz5W8GjAtwlu7qomxI0fnmotaG6Wwf6viiYcv2YlszGhZqm5xPTES7ndepbNFozcBimVpr58nKLaojnz6o-dvwUrvyMCNX1LTHXvs2LQOuaLasS1q5WsggkkJQrO2Jh-t4YVwSUlIvIm2oZRPBun51qhUVC7C1yJz_DKqZnPaUovjum1qNpsEOsCcMFbXStSbQRkbCE2ehYDfl5OQ4TP-RbgJ27h0EuCJ1lscnYz0w_BbuGn1_H2y2A", +> "token_type": "bearer", +> "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdLCJhdGkiOiIzY2Q0MDEzNy1hNjg2LTQ5OWMtODRiYS00Y2RlN2ZjZTIwM2EiLCJleHAiOjE2MDYyOTcyMzEsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iXSwianRpIjoiNWUxZWQ4N2EtNWJlNi00NWIyLWExZmEtYjQ4ZTU2YjI1MjVmIiwiY2xpZW50X2lkIjoidXNlcl9jbGllbnQifQ.c-8-fxBVMLyxtA_OuB26aYrRG-9xLT1Fl7B54FZyKsdVFFv2LJmIVKDR5bxdOE45gfs8A8KPPx4CZ9gpvA3lLKKiJbMpmhNqJt5bnHtuU_wFmaCDU3leBQ5zS0HxC259ZYxv4UgX5Wp7IUh34PNXHdXDTdT0xr918o8dfx2XsMVZTx5VGDRDAgg9xBdYhw_I3DTp4G5FI2mQKvg3AX7I870sXtGs3CXeXOPs07p81L7lCNs1GH3M63K5KTiOgLvFeU0RNRcPcgJImk19XcAK_1siZfA-oB11dXY6uX_N6mrz3vrk_PaxQx5ksk_lm0YD_1OExJtQZHRoL2NnT9w0aQ", +> "expires_in": 7199, +> "scope": "read write", +> "jti": "3cd40137-a686-499c-84ba-4cde7fce203a" +> } + +- **资源访问** + +get访问:localhost:18087/user/hello + +> hello security com.gsean.security.token.com.gsean.security.token.redis.jwt token persistence + diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml b/security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml index bd5665d..7737222 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/pom.xml @@ -3,13 +3,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - security-token-persisitence_sample + security-token-persisitence-sample com.gsean.demos 1.0-SNAPSHOT 4.0.0 security-token-redis-sample + pom + + redis-auth-server + redis-resource-server + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/readme.md b/security-demo/security-token-persisitence-sample/security-token-redis-sample/readme.md new file mode 100644 index 0000000..3695cea --- /dev/null +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/readme.md @@ -0,0 +1,143 @@ +# 基于Redis实现token认证 + +## 参考 + +- [Spring Cloud Security:Oauth2结合JWT使用](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484130&idx=1&sn=299fc3c9bb0147a2858cde9b33322b44&chksm=fc2fbeeacb5837fc7c1a4ed6a9f31c9ec954bb0ca3d83931b3a0f960d89fd48b375cab2eadac&scene=178&cur_album_id=1344323159075553282#rd) +- [SpringBoot 整合 oauth2(五)实现 com.gsean.security.token.com.gsean.security.token.redis.jwt 及 扩展](https://www.jianshu.com/p/766cf742e3e8) + + + +## 实现 + +### 客户端持久化 + +#### sql + +```sql +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; +-- ---------------------------- +配置数据源 +-- Table structure for oauth_client_details +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_client_details`; +CREATE TABLE `oauth_client_details` ( +`client_id` varchar(48) NOT NULL, +`resource_ids` varchar(256) DEFAULT NULL, +`client_secret` varchar(256) DEFAULT NULL, +`scope` varchar(256) DEFAULT NULL, +`authorized_grant_types` varchar(256) DEFAULT NULL, +`web_server_redirect_uri` varchar(256) DEFAULT NULL, +`authorities` varchar(256) DEFAULT NULL, +`access_token_validity` int(11) DEFAULT NULL, +`refresh_token_validity` int(11) DEFAULT NULL, +`additional_information` varchar(4096) DEFAULT NULL, +`autoapprove` varchar(256) DEFAULT NULL, +PRIMARY KEY (`client_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- ---------------------------- +-- Records of oauth_client_details +-- ---------------------------- + +SET FOREIGN_KEY_CHECKS = 1; + +``` + +> - 客户端细腻维护在数据库 +> - resouceids是限制客户端访问资源设置,不设置默认访问所有资源 +> - client_secret需要加密 + +#### 认证服务器配置 + +```java +/** + * 配置客户端从数据库获取 + * @return + */ + @Bean + public JdbcClientDetailsService createJdbcClientDetailsService() { + JdbcClientDetailsService jdbcClientDetailsService = new + JdbcClientDetailsService(dataSource); + return jdbcClientDetailsService; + } + /** + * 使用内存中的客户端信息 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 配置客户端 + /** + * 客户端信息从mysql获取 + */ + clients.withClientDetails(jdbcClientDetailsService); + + } + + /** + * 配置 token 节点的安全策略 + * @param security + * @throws Exception + */ + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security + .allowFormAuthenticationForClients()//允许客户端表单认证 + .tokenKeyAccess("permitAll()") // 开启/oauth/token_key访问权限 + .checkTokenAccess("permitAll()");//开启/oauth/check_token的访问权限 + } + +``` + +> 认证服务器需要配置端点权限开放,否则资源服务器访问token_access会报forbidden + +#### 资源服务器配置 + +```java +@Primary + @Bean + public RemoteTokenServices tokenServices() { + //这里需要使用定义一个client,专用于resouce访问认证服务器的客户端 + final RemoteTokenServices tokenService = new RemoteTokenServices(); + tokenService.setCheckTokenEndpointUrl("http://localhost:18088/oauth/check_token"); + tokenService.setClientId("user_client2"); + tokenService.setClientSecret("user"); + return tokenService; + } + +@Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources.tokenStore(tokenStore).tokenServices(tokenServices()); + } +``` + +> 资源服务器需要配置远程校验token,这里需要录入客户端信息,可以固定为一个固定的客户端用于访问认证服务器端点接口 + + + +## 测试 + +- **启动授权服务器和资源服务器** +- **使用密码模式获取token** + +client信息:user_client/user + +post访问:localhost:18088/oauth/token?grant_type=password&username=admin&password=admin + +> 结果: +> +> { +> "access_token": "c27bb976-867a-48c8-ab7b-d72e3729da57", +> "token_type": "bearer", +> "refresh_token": "2c960e72-b150-482e-87ab-77f2bca8e1bb", +> "expires_in": 7199, +> "scope": "read write" +> } + +- **资源访问** + +get访问:localhost:18089/user/hello + +> hello security redis token persistence + diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml index deda052..560d195 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/pom.xml @@ -12,4 +12,32 @@ redis-auth-server + + + + com.gsean.demos + redis-spring-boot-starter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + + com.baomidou + mybatis-plus-boot-starter + + + mysql + mysql-connector-java + runtime + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java index dadd03e..3f96bb7 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/AuthorizationServerConfig.java @@ -8,6 +8,8 @@ import org.springframework.security.oauth2.config.annotation.configurers.ClientD import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.token.TokenStore; @Configuration @@ -24,6 +26,9 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap @Autowired private TokenStore tokenStore; + @Autowired + private JdbcClientDetailsService jdbcClientDetailsService; + @@ -39,23 +44,23 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap /** * 客户端信息从内存获取 */ - clients - // 使用内存设置 - .inMemory() - // client_id - .withClient("admin") - // client_secret - .secret(passwordEncoder.encode("admin123456")) - // 授权类型 - .authorizedGrantTypes("authorization_code","password","refresh_token") - // 授权范围 - .scopes("all") - // 注册跳转地址 - .redirectUris("http://www.baidu.com"); +// clients +// // 使用内存设置 +// .inMemory() +// // client_id +// .withClient("admin") +// // client_secret +// .secret(passwordEncoder.encode("admin123456")) +// // 授权类型 +// .authorizedGrantTypes("authorization_code","password","refresh_token") +// // 授权范围 +// .scopes("all") +// // 注册跳转地址 +// .redirectUris("http://www.baidu.com"); /** * 客户端信息从mysql获取 */ -// clients.withClientDetails(jdbcClientDetailsService); + clients.withClientDetails(jdbcClientDetailsService); } @@ -73,4 +78,17 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap } + /** + * 配置 token 节点的安全策略 + * @param security + * @throws Exception + */ + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + security + .allowFormAuthenticationForClients()//允许客户端表单认证 + .tokenKeyAccess("permitAll()") // 开启/oauth/token_key访问权限 + .checkTokenAccess("permitAll()");//开启/oauth/check_token的访问权限 + } + } diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java index 2733e13..d5862fc 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-auth-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java @@ -5,9 +5,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; +import javax.sql.DataSource; + /** * ProjectName:gsean-springboot-demos * ClassName:TokenStoreConfig @@ -19,9 +22,26 @@ import org.springframework.security.oauth2.provider.token.store.redis.RedisToken @Configuration public class TokenStoreConfig { + @Autowired + private DataSource dataSource; + + + + @Autowired private RedisConnectionFactory redisConnectionFactory; + /** + * 配置客户端从数据库获取 + * @return + */ + @Bean + public JdbcClientDetailsService createJdbcClientDetailsService() { + JdbcClientDetailsService jdbcClientDetailsService = new + JdbcClientDetailsService(dataSource); + return jdbcClientDetailsService; + } + /** * 使用redis存储token diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml index 1970977..8041854 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/pom.xml @@ -11,5 +11,22 @@ redis-resource-server + + + com.gsean.demos + redis-spring-boot-starter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + + \ No newline at end of file diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java index 005df34..3209561 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/SecurityTokenRedisResourceServerApplication.java @@ -16,9 +16,9 @@ import org.springframework.web.bind.annotation.RestController; * Version: 1.0 */ @SpringBootApplication -public class SecurityTokenRedisAuthServerApplication { +public class SecurityTokenRedisResourceServerApplication { public static void main(String[] args) { - SpringApplication.run(SecurityTokenRedisAuthServerApplication.class,args); + SpringApplication.run(SecurityTokenRedisResourceServerApplication.class,args); } diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java index 5141918..b7002ad 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/ResourceServerConfig.java @@ -1,11 +1,14 @@ package com.gsean.security.token.redis.config; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.RemoteTokenServices; import org.springframework.security.oauth2.provider.token.TokenStore; @Configuration @@ -17,7 +20,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { - resources.tokenStore(tokenStore); + resources.tokenStore(tokenStore).tokenServices(tokenServices()); } /** @@ -34,4 +37,15 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { .requestMatchers() .antMatchers("/user/**"); } + + @Primary + @Bean + public RemoteTokenServices tokenServices() { + //这里需要使用定义一个client,专用于resouce访问认证服务器的客户端 + final RemoteTokenServices tokenService = new RemoteTokenServices(); + tokenService.setCheckTokenEndpointUrl("http://localhost:18088/oauth/check_token"); + tokenService.setClientId("user_client2"); + tokenService.setClientSecret("user"); + return tokenService; + } } diff --git a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java index 90c3808..2733e13 100644 --- a/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java +++ b/security-demo/security-token-persisitence-sample/security-token-redis-sample/redis-resource-server/src/main/java/com/gsean/security/token/redis/config/TokenStoreConfig.java @@ -1,16 +1,12 @@ -package com.gsean.security.token.jwt.config; +package com.gsean.security.token.redis.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; -import org.springframework.core.io.ClassPathResource; +import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.security.oauth2.provider.token.TokenStore; -import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; -import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; -import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; - -import java.security.KeyPair; +import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; /** * ProjectName:gsean-springboot-demos @@ -24,40 +20,16 @@ import java.security.KeyPair; public class TokenStoreConfig { @Autowired - private JwtAccessTokenConverter jwtAccessTokenConverter; - /** - * 对称密钥jwt - * @return - */ - @Bean - public JwtAccessTokenConverter jwtAccessTokenConverter(){ - JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); - jwtAccessTokenConverter.setSigningKey("test_key");//配置jwt使用的对称密钥 - return jwtAccessTokenConverter; - } + private RedisConnectionFactory redisConnectionFactory; + /** - * 配置token访问转换器使用rsa + * 使用redis存储token * @return */ @Bean @Primary - public JwtAccessTokenConverter rsaTokenConverter(){ - JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter(); - KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray()); - KeyPair keyPair = keyStoreKeyFactory.getKeyPair("com.gsean.security.token.com.gsean.security.token.redis.jwt"); - jwtAccessTokenConverter.setKeyPair(keyPair);//配置jwt使用的rsa密钥 - return jwtAccessTokenConverter; - } - - - - - - - @Bean - @Primary - public TokenStore jwtTokenStore(){ - return new JwtTokenStore(jwtAccessTokenConverter); + public TokenStore redisTokenStore(){ + return new RedisTokenStore(redisConnectionFactory); } } diff --git a/swagger-demo/swagger-core/src/main/java/com/gsean/swagger/config/SwaagerConfig.java b/swagger-demo/swagger-core/src/main/java/com/gsean/swagger/config/SwaagerConfig.java index 00fde4e..f2db8cc 100644 --- a/swagger-demo/swagger-core/src/main/java/com/gsean/swagger/config/SwaagerConfig.java +++ b/swagger-demo/swagger-core/src/main/java/com/gsean/swagger/config/SwaagerConfig.java @@ -74,7 +74,7 @@ public class SwaagerConfig { //// PathSelectors.regex("/oauth/token/list.*").apply(input)|| //// PathSelectors.regex("/clients.*").apply(input)|| //// PathSelectors.regex("/services.*").apply(input)|| -//// PathSelectors.regex("/redis.*").apply(input) +//// PathSelectors.regex("/com.gsean.security.token.redis.*").apply(input) // PathSelectors.regex("/users.*").apply(input) // // ) diff --git a/webflux-demo/pom.xml b/webflux-demo/pom.xml index f494614..9f44f68 100644 --- a/webflux-demo/pom.xml +++ b/webflux-demo/pom.xml @@ -10,6 +10,10 @@ 4.0.0 webflux-demo + pom + + webflux-sample + \ No newline at end of file diff --git a/webflux-demo/webflux-sample/pom.xml b/webflux-demo/webflux-sample/pom.xml index 124dc3b..15f35ac 100644 --- a/webflux-demo/webflux-sample/pom.xml +++ b/webflux-demo/webflux-sample/pom.xml @@ -12,4 +12,23 @@ webflux-sample + + + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-test + + + io.projectreactor + reactor-test + test + + + + \ No newline at end of file diff --git a/webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java b/webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java index 2990c3a..c9d8997 100644 --- a/webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java +++ b/webflux-demo/webflux-sample/src/main/java/com/gsean/webflux/sample/WebfluxSampleApplication.java @@ -1,5 +1,12 @@ package com.gsean.webflux.sample; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + /** * ProjectName:gsean-springboot-demos * ClassName:WebfluxSampleApplication @@ -8,5 +15,19 @@ package com.gsean.webflux.sample; * Author:GSean * Version: 1.0 */ +@SpringBootApplication public class WebfluxSampleApplication { + public static void main(String[] args) { + SpringApplication.run(WebfluxSampleApplication.class,args); + } + + + @RestController + @RequestMapping("/webflux") + public class WebfluxController{ + @GetMapping("/hello") + public Mono sayHello(){ + return Mono.just("hello webflux"); + } + } } diff --git a/webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java b/webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java index 092c1b1..03f482a 100644 --- a/webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java +++ b/webflux-demo/webflux-sample/src/test/java/com/gsean/webflux/sample/WebfluxSampleApplicationTest2.java @@ -1,3 +1,13 @@ +package com.gsean.webflux.sample; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; + import static org.junit.Assert.*; /** @@ -8,6 +18,25 @@ import static org.junit.Assert.*; * Author:GSean * Version: 1.0 */ +@RunWith(SpringRunner.class) +@WebFluxTest(WebfluxSampleApplication.WebfluxController.class) public class WebfluxSampleApplicationTest2 { + @Autowired + private WebTestClient webClient; + + @Test + public void testWebFlux(){ + webClient.get() + .uri("/webflux/hello") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus().isOk() + .expectBody().consumeWith(item->{ + System.out.println(new String(item.getResponseBody())); + }); + + + } + } \ No newline at end of file -- Gitee From 2dd73a24ccb5afae22eaa281b5c155abfe8bfeae Mon Sep 17 00:00:00 2001 From: guoc <770292311@qq.com> Date: Thu, 26 Nov 2020 17:19:41 +0800 Subject: [PATCH 3/5] feat(init): springboot-demos-init --- api-demos/easyopen-demo/pom.xml | 27 + .../gsean/easyopen/EasyOpenApplication.java | 19 + .../src/main/resources/application.yml | 2 + .../http-demos/http-demo-response/pom.xml | 22 + .../java/com/gsean/http/HttpApplication.java | 43 + .../src/main/resources/application.yml | 2 + api-demos/http-demos/pom.xml | 19 + api-demos/pom.xml | 22 + api-demos/vue-api-demo/pom.xml | 32 + .../java/com/gsean/api/VueApiApplication.java | 96 + .../src/main/resources/static/index.html | 1 + .../app.30790115300ab27614ce176899523b62.css | 2 + ...p.30790115300ab27614ce176899523b62.css.map | 1 + .../static/js/app.b22ce679862c47a75225.js | 2 + .../static/js/app.b22ce679862c47a75225.js.map | 1 + .../js/manifest.2ae2e69a05c33dfc65f8.js | 2 + .../js/manifest.2ae2e69a05c33dfc65f8.js.map | 1 + .../js/manifest.3ad1d5771e9b13dbdad2.js | 2 + .../js/manifest.3ad1d5771e9b13dbdad2.js.map | 1 + .../static/js/vendor.1489dda13598d34ee312.js | 13 + .../js/vendor.1489dda13598d34ee312.js.map | 1 + api-demos/vue-deploy-demo/pom.xml | 19 + .../vue-deploy-hello-server/pom.xml | 22 + .../com/gsean/vue/VueDeployApplication.java | 19 + .../src/main/resources/application.yml | 7 + .../src/main/resources/index.html | 1 + .../app.30790115300ab27614ce176899523b62.css | 2 + ...p.30790115300ab27614ce176899523b62.css.map | 1 + .../static/js/app.b22ce679862c47a75225.js | 2 + .../static/js/app.b22ce679862c47a75225.js.map | 1 + .../js/manifest.3ad1d5771e9b13dbdad2.js | 2 + .../js/manifest.3ad1d5771e9b13dbdad2.js.map | 1 + .../static/js/vendor.1489dda13598d34ee312.js | 13 + .../js/vendor.1489dda13598d34ee312.js.map | 1 + .../vue-deploy-demo/vue-deploy-hello/.babelrc | 12 + .../vue-deploy-hello/.editorconfig | 9 + .../vue-deploy-hello/.eslintignore | 4 + .../vue-deploy-hello/.eslintrc.js | 29 + .../vue-deploy-hello/.gitignore | 14 + .../vue-deploy-hello/.postcssrc.js | 10 + .../vue-deploy-hello/README.md | 21 + .../vue-deploy-hello/build/build.js | 41 + .../vue-deploy-hello/build/check-versions.js | 54 + .../vue-deploy-hello/build/logo.png | Bin 0 -> 6849 bytes .../vue-deploy-hello/build/utils.js | 101 + .../vue-deploy-hello/build/vue-loader.conf.js | 22 + .../build/webpack.base.conf.js | 92 + .../build/webpack.dev.conf.js | 95 + .../build/webpack.prod.conf.js | 145 + .../vue-deploy-hello/config/dev.env.js | 7 + .../vue-deploy-hello/config/index.js | 76 + .../vue-deploy-hello/config/prod.env.js | 4 + .../vue-deploy-hello/index.html | 12 + .../vue-deploy-hello/package-lock.json | 12789 ++++++++++++++++ .../vue-deploy-hello/package.json | 73 + .../vue-deploy-hello/src/App.vue | 23 + .../vue-deploy-hello/src/assets/logo.png | Bin 0 -> 6849 bytes .../src/components/HelloWorld.vue | 113 + .../vue-deploy-hello/src/main.js | 15 + .../vue-deploy-hello/src/router/index.js | 15 + .../vue-deploy-hello/static/.gitkeep | 0 .../liquibase/changelog/release.init.xml | 2 +- internel-demo/bean-demo/pom.xml | 5 + .../java/com/gsean/bean/BeanApplication.java | 7 + .../conditonalDemo/ConditionOnServerType.java | 12 +- .../conditonalDemo/OnServerTypeCOndition.java | 16 +- .../gsean/bean/conditonalDemo/ServerType.java | 1 + .../conditonalDemo/conditionBeanConfig.java | 84 + .../com/gsean/bean/config/BeanConfig.java | 24 +- .../bean/enableBeanDemo/EnableServer.java | 15 +- .../enableBeanDemo/ServerImportSelector.java | 22 +- .../com/gsean/bean/enableBeanDemo/Type.java | 1 + .../bean/enableBeanDemo/enableBeanDemo.java | 27 + .../src/main/resources/application.properties | 1 + .../com/gsean/bean/BeanApplicationTest.java | 39 + .../com/gsean/bean/BeanApplicationTest2.java | 50 +- internel-demo/eventListener-demo/pom.xml | 35 + .../com/gsean/event/EventApplication.java | 19 + .../com/gsean/event/listener/MyEvent.java | 26 + .../com/gsean/event/listener/MyListener.java | 29 + .../com/gsean/event/EventApplicationTest.java | 32 + internel-demo/mapstruct-sample/pom.xml | 61 + internel-demo/mapstruct-sample/readme.md | 39 + .../com/gsean/mapstruct/MapStructUtil.java | 14 + .../com/gsean/mapstruct/PersonConverter.java | 18 + .../java/com/gsean/mapstruct/PersonDTO.java | 25 + .../com/gsean/mapstruct/PersonEntity.java | 25 + .../gsean/mapstruct/MapStructUtilTest.java | 142 + .../com/gsean/mapstruct/UserConverter.java | 29 + internel-demo/pom.xml | 2 + java8-demos/java8-stream-demo/pom.xml | 25 + .../test/java/com/gsean/java8/StreamTest.java | 27 + java8-demos/pom.xml | 19 + jwt-demos/jwt-sample/pom.xml | 19 + .../jwt/sample/JwtSampleApplication.java | 7 + .../jwt/sample/JwtSampleApplicationTest.java | 47 +- jwt-demos/jwt-spring-boot-starter/pom.xml | 35 + jwt-demos/jwt-spring-boot-starter/readme.md | 63 + .../java/com/gsean/jwt/JwtAutoConfig.java | 17 +- .../com/gsean/jwt/JwtInvalidException.java | 12 +- .../java/com/gsean/jwt/JwtTokenService.java | 49 + .../com/gsean/jwt/JwtTokenServiceImpl.java | 117 +- .../src/main/java/com/gsean/jwt/JwtUtil.java | 68 + .../main/java/com/gsean/jwt/PayloadDto.java | 33 + .../main/resources/META-INF/spring.factories | 2 +- jwt-demos/pom.xml | 5 + .../gsean/mybatis/plus/CodeGeneratorUtil.java | 7 +- .../gsean/plus/api/mapper/SysUserMapper.java | 16 + .../gsean/plus/api/module/entity/Base.java | 12 + .../gsean/plus/api/module/entity/SysUser.java | 37 + .../resources/mapper/api/SysUserMapper.xml | 12 + .../test/java/com/gsean/plus/CodeTest.java | 6 +- pom.xml | 47 +- redis-demos/pom.xml | 1 + .../java/com/gsean/redis/util/RedisUtil.java | 11 +- redis-demos/redis-sample/pom.xml | 7 + .../sample/RedisSampleApplicationTest.java | 22 +- redis-demos/redis-spring-boot-starter/pom.xml | 14 + .../starter/redis/GseanRedisAutoConfig.java | 12 +- .../starter/redis/util/GseanRedisUtil.java | 7 +- .../main/resources/META-INF/spring.factories | 2 +- sdk-demos/pom.xml | 15 + security-demo/pom.xml | 17 + .../security-inmemory-sample/pom.xml | 13 + .../security-inmemory-sample/readme.md | 219 + .../InmemorySecuritySampleApplication.java | 23 + .../config/AuthorizationServerConfig.java | 49 +- .../sample/config/ResourceServerConfig.java | 64 +- .../sample/config/WebSecurityConfig.java | 65 +- .../src/main/resources/application.yml | 5 + .../security-inmemory-separate-sample/pom.xml | 6 + .../security-authentication-server/pom.xml | 12 + .../auth2/AuthenticationApplication.java | 7 + .../config/AuthorizationServerConfig.java | 2 +- .../gsean/auth2/config/WebSecurityConfig.java | 9 +- .../security-resource-server/pom.xml | 12 + .../com/gsean/auth2/ResourceApplication.java | 20 + .../auth2/config/ResourceServerConfig.java | 15 +- .../pom.xml | 24 +- .../readme.md | 25 + .../jwt-auth-server/pom.xml | 26 + ...SecurityTokenJwtAuthServerApplication.java | 14 +- .../jwt/config/AuthorizationServerConfig.java | 61 +- .../token/jwt/config/JwtTokenEnhancer.java | 22 +- .../jwt/config/ResourceServerConfig.java | 2 +- .../token/jwt/config/TokenStoreConfig.java | 35 +- .../token/jwt/config/WebSecurityConfig.java | 2 +- .../src/main/resources/application.yml | 2 - .../jwt-resource-server/pom.xml | 16 + ...rityTokenJwtResourceServerApplication.java | 7 +- .../jwt/config/ResourceServerConfig.java | 2 +- ...TokenJwtResourceServerApplicationTest.java | 20 +- .../security-token-jwt-sample/pom.xml | 7 +- .../security-token-jwt-sample/readme.md | 127 + .../security-token-redis-sample/pom.xml | 9 +- .../security-token-redis-sample/readme.md | 143 + .../redis-auth-server/pom.xml | 28 + .../config/AuthorizationServerConfig.java | 46 +- .../token/redis/config/TokenStoreConfig.java | 20 + .../redis-resource-server/pom.xml | 17 + ...tyTokenRedisResourceServerApplication.java | 4 +- .../redis/config/ResourceServerConfig.java | 16 +- .../token/redis/config/TokenStoreConfig.java | 44 +- .../gsean/swagger/config/SwaagerConfig.java | 2 +- test-base/mockmvc-demo/pom.xml | 27 + .../com/gsean/test/MockMvcApplication.java | 37 + .../gsean/test/MockMvcApplicationTest.java | 52 + test-base/pom.xml | 19 + webflux-demo/pom.xml | 4 + webflux-demo/webflux-sample/pom.xml | 19 + .../sample/WebfluxSampleApplication.java | 21 + .../sample/WebfluxSampleApplicationTest2.java | 29 + 172 files changed, 16990 insertions(+), 230 deletions(-) create mode 100644 api-demos/easyopen-demo/pom.xml create mode 100644 api-demos/easyopen-demo/src/main/java/com/gsean/easyopen/EasyOpenApplication.java create mode 100644 api-demos/easyopen-demo/src/main/resources/application.yml create mode 100644 api-demos/http-demos/http-demo-response/pom.xml create mode 100644 api-demos/http-demos/http-demo-response/src/main/java/com/gsean/http/HttpApplication.java create mode 100644 api-demos/http-demos/http-demo-response/src/main/resources/application.yml create mode 100644 api-demos/http-demos/pom.xml create mode 100644 api-demos/pom.xml create mode 100644 api-demos/vue-api-demo/pom.xml create mode 100644 api-demos/vue-api-demo/src/main/java/com/gsean/api/VueApiApplication.java create mode 100644 api-demos/vue-api-demo/src/main/resources/static/index.html create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css.map create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js.map create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/manifest.2ae2e69a05c33dfc65f8.js create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/manifest.2ae2e69a05c33dfc65f8.js.map create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/manifest.3ad1d5771e9b13dbdad2.js create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/manifest.3ad1d5771e9b13dbdad2.js.map create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/vendor.1489dda13598d34ee312.js create mode 100644 api-demos/vue-api-demo/src/main/resources/static/static/js/vendor.1489dda13598d34ee312.js.map create mode 100644 api-demos/vue-deploy-demo/pom.xml create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/pom.xml create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/java/com/gsean/vue/VueDeployApplication.java create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/application.yml create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/index.html create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/css/app.30790115300ab27614ce176899523b62.css create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/css/app.30790115300ab27614ce176899523b62.css.map create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/js/app.b22ce679862c47a75225.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/js/app.b22ce679862c47a75225.js.map create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/js/manifest.3ad1d5771e9b13dbdad2.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/js/manifest.3ad1d5771e9b13dbdad2.js.map create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/js/vendor.1489dda13598d34ee312.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello-server/src/main/resources/static/js/vendor.1489dda13598d34ee312.js.map create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/.babelrc create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/.editorconfig create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/.eslintignore create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/.eslintrc.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/.gitignore create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/.postcssrc.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/README.md create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/build/build.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/build/check-versions.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/build/logo.png create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/build/utils.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/build/vue-loader.conf.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/build/webpack.base.conf.js create mode 100755 api-demos/vue-deploy-demo/vue-deploy-hello/build/webpack.dev.conf.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/build/webpack.prod.conf.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/config/dev.env.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/config/index.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/config/prod.env.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/index.html create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/package-lock.json create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/package.json create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/src/App.vue create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/src/assets/logo.png create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/src/components/HelloWorld.vue create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/src/main.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/src/router/index.js create mode 100644 api-demos/vue-deploy-demo/vue-deploy-hello/static/.gitkeep create mode 100644 internel-demo/eventListener-demo/pom.xml create mode 100644 internel-demo/eventListener-demo/src/main/java/com/gsean/event/EventApplication.java create mode 100644 internel-demo/eventListener-demo/src/main/java/com/gsean/event/listener/MyEvent.java create mode 100644 internel-demo/eventListener-demo/src/main/java/com/gsean/event/listener/MyListener.java create mode 100644 internel-demo/eventListener-demo/src/test/java/com/gsean/event/EventApplicationTest.java create mode 100644 internel-demo/mapstruct-sample/pom.xml create mode 100644 internel-demo/mapstruct-sample/readme.md create mode 100644 internel-demo/mapstruct-sample/src/main/java/com/gsean/mapstruct/MapStructUtil.java create mode 100644 internel-demo/mapstruct-sample/src/main/java/com/gsean/mapstruct/PersonConverter.java create mode 100644 internel-demo/mapstruct-sample/src/main/java/com/gsean/mapstruct/PersonDTO.java create mode 100644 internel-demo/mapstruct-sample/src/main/java/com/gsean/mapstruct/PersonEntity.java create mode 100644 internel-demo/mapstruct-sample/src/test/java/com/gsean/mapstruct/MapStructUtilTest.java create mode 100644 internel-demo/mapstruct-sample/src/test/java/com/gsean/mapstruct/UserConverter.java create mode 100644 java8-demos/java8-stream-demo/pom.xml create mode 100644 java8-demos/java8-stream-demo/src/test/java/com/gsean/java8/StreamTest.java create mode 100644 java8-demos/pom.xml create mode 100644 jwt-demos/jwt-spring-boot-starter/readme.md create mode 100644 mybatis-demo/mybatisplus-sample/src/main/java/com/gsean/plus/api/mapper/SysUserMapper.java create mode 100644 mybatis-demo/mybatisplus-sample/src/main/java/com/gsean/plus/api/module/entity/Base.java create mode 100644 mybatis-demo/mybatisplus-sample/src/main/java/com/gsean/plus/api/module/entity/SysUser.java create mode 100644 mybatis-demo/mybatisplus-sample/src/main/resources/mapper/api/SysUserMapper.xml create mode 100644 sdk-demos/pom.xml create mode 100644 security-demo/security-inmemory-sample/readme.md create mode 100644 security-demo/security-token-persisitence-sample/readme.md create mode 100644 security-demo/security-token-persisitence-sample/security-token-jwt-sample/readme.md create mode 100644 security-demo/security-token-persisitence-sample/security-token-redis-sample/readme.md create mode 100644 test-base/mockmvc-demo/pom.xml create mode 100644 test-base/mockmvc-demo/src/main/java/com/gsean/test/MockMvcApplication.java create mode 100644 test-base/mockmvc-demo/src/test/java/com/gsean/test/MockMvcApplicationTest.java create mode 100644 test-base/pom.xml diff --git a/api-demos/easyopen-demo/pom.xml b/api-demos/easyopen-demo/pom.xml new file mode 100644 index 0000000..fac8cd4 --- /dev/null +++ b/api-demos/easyopen-demo/pom.xml @@ -0,0 +1,27 @@ + + + + api-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + easyopen-demo + + + + + net.oschina.durcframework + easyopen-spring-boot-starter + 1.16.9 + + + org.springframework.boot + spring-boot-starter-web + + + + \ No newline at end of file diff --git a/api-demos/easyopen-demo/src/main/java/com/gsean/easyopen/EasyOpenApplication.java b/api-demos/easyopen-demo/src/main/java/com/gsean/easyopen/EasyOpenApplication.java new file mode 100644 index 0000000..31080ec --- /dev/null +++ b/api-demos/easyopen-demo/src/main/java/com/gsean/easyopen/EasyOpenApplication.java @@ -0,0 +1,19 @@ +package com.gsean.easyopen; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:EasyOpenApplication + * Description:TODO + * Date:2020/12/25 15:13 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class EasyOpenApplication { + public static void main(String[] args) { + SpringApplication.run(EasyOpenApplication.class,args); + } +} diff --git a/api-demos/easyopen-demo/src/main/resources/application.yml b/api-demos/easyopen-demo/src/main/resources/application.yml new file mode 100644 index 0000000..4ca1e1f --- /dev/null +++ b/api-demos/easyopen-demo/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 8801 \ No newline at end of file diff --git a/api-demos/http-demos/http-demo-response/pom.xml b/api-demos/http-demos/http-demo-response/pom.xml new file mode 100644 index 0000000..56a9f67 --- /dev/null +++ b/api-demos/http-demos/http-demo-response/pom.xml @@ -0,0 +1,22 @@ + + + + http-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + http-demo-response + + + + org.springframework.boot + spring-boot-starter-web + + + + + \ No newline at end of file diff --git a/api-demos/http-demos/http-demo-response/src/main/java/com/gsean/http/HttpApplication.java b/api-demos/http-demos/http-demo-response/src/main/java/com/gsean/http/HttpApplication.java new file mode 100644 index 0000000..9436618 --- /dev/null +++ b/api-demos/http-demos/http-demo-response/src/main/java/com/gsean/http/HttpApplication.java @@ -0,0 +1,43 @@ +package com.gsean.http; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:HttpApplication + * Description:TODO + * Date:2020/12/22 10:15 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class HttpApplication { + public static void main(String[] args) { + SpringApplication.run(HttpApplication.class,args); + } + + + @RestController + public class HelloController{ + @GetMapping("/hello") + public String hello(HttpServletResponse response){ + System.out.println("hello req1"); + response.addHeader("Location","http://www.baidu.com"); +// response.getHeaders("Location")[0].get + try { + response.sendRedirect("http://www.baidu.com"); + } catch (IOException e) { + e.printStackTrace(); + } + return "hello"; + } + } + + +} diff --git a/api-demos/http-demos/http-demo-response/src/main/resources/application.yml b/api-demos/http-demos/http-demo-response/src/main/resources/application.yml new file mode 100644 index 0000000..b94c605 --- /dev/null +++ b/api-demos/http-demos/http-demo-response/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 10089 \ No newline at end of file diff --git a/api-demos/http-demos/pom.xml b/api-demos/http-demos/pom.xml new file mode 100644 index 0000000..ecb79dc --- /dev/null +++ b/api-demos/http-demos/pom.xml @@ -0,0 +1,19 @@ + + + + api-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + http-demos + pom + + http-demo-response + + + + \ No newline at end of file diff --git a/api-demos/pom.xml b/api-demos/pom.xml new file mode 100644 index 0000000..7490b17 --- /dev/null +++ b/api-demos/pom.xml @@ -0,0 +1,22 @@ + + + + gsean-springboot-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + api-demos + pom + + vue-api-demo + vue-deploy-demo + http-demos + easyopen-demo + + + + \ No newline at end of file diff --git a/api-demos/vue-api-demo/pom.xml b/api-demos/vue-api-demo/pom.xml new file mode 100644 index 0000000..06775b1 --- /dev/null +++ b/api-demos/vue-api-demo/pom.xml @@ -0,0 +1,32 @@ + + + + api-demos + com.gsean.demos + 1.0-SNAPSHOT + + 4.0.0 + + vue-api-demo + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + + + + + + + + \ No newline at end of file diff --git a/api-demos/vue-api-demo/src/main/java/com/gsean/api/VueApiApplication.java b/api-demos/vue-api-demo/src/main/java/com/gsean/api/VueApiApplication.java new file mode 100644 index 0000000..bd41ae1 --- /dev/null +++ b/api-demos/vue-api-demo/src/main/java/com/gsean/api/VueApiApplication.java @@ -0,0 +1,96 @@ +package com.gsean.api; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * ProjectName:gsean-springboot-demos + * ClassName:VueApiApplication + * Description:TODO + * Date:2020/12/5 12:03 + * Author:GSean + * Version: 1.0 + */ +@SpringBootApplication +public class VueApiApplication { + public static void main(String[] args) { + SpringApplication.run(VueApiApplication.class,args); + } + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + //重写父类提供的跨域请求处理的接口 + public void addCorsMappings(CorsRegistry registry) { + //添加映射路径 + registry.addMapping("/**") + //放行哪些原始域 + .allowedOrigins("*") + //是否发送Cookie信息 + .allowCredentials(true) + //放行哪些原始域(请求方式) + .allowedMethods("GET","POST", "PUT", "DELETE") + //放行哪些原始域(头部信息) + .allowedHeaders("*") + //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) + .exposedHeaders("Header1", "Header2"); + } + }; + } + + /** + * 跨域过滤器 + * @return + */ + @Bean + public Filter corsFilter(){ + Filter corsFilter = new Filter() { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + String curOrigin = request.getHeader("Origin"); + System.out.println("###跨域过滤器->当前访问来源->"+curOrigin+"###"); + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, GET"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + + } + }; + return corsFilter; + } + + + @RestController + public class HelloController{ + @Value("${server.port}") + private String port; + @GetMapping("/hello") + public String hello(){ + return "hello vue update,port:"+port; + } + } +} diff --git a/api-demos/vue-api-demo/src/main/resources/static/index.html b/api-demos/vue-api-demo/src/main/resources/static/index.html new file mode 100644 index 0000000..63d95e2 --- /dev/null +++ b/api-demos/vue-api-demo/src/main/resources/static/index.html @@ -0,0 +1 @@ +vue-deploy-hello
\ No newline at end of file diff --git a/api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css b/api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css new file mode 100644 index 0000000..703d891 --- /dev/null +++ b/api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css @@ -0,0 +1,2 @@ +#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}h1[data-v-d8ec41bc],h2[data-v-d8ec41bc]{font-weight:400}ul[data-v-d8ec41bc]{list-style-type:none;padding:0}li[data-v-d8ec41bc]{display:inline-block;margin:0 10px}a[data-v-d8ec41bc]{color:#42b983} +/*# sourceMappingURL=app.30790115300ab27614ce176899523b62.css.map */ \ No newline at end of file diff --git a/api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css.map b/api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css.map new file mode 100644 index 0000000..f208280 --- /dev/null +++ b/api-demos/vue-api-demo/src/main/resources/static/static/css/app.30790115300ab27614ce176899523b62.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["app.30790115300ab27614ce176899523b62.css"],"names":[],"mappings":"AACA,KACE,6CAAmD,CACnD,kCAAmC,CACnC,iCAAkC,CAClC,iBAAkB,CAClB,aAAc,CACd,eACF,CAEA,wCACE,eACF,CACA,oBACE,oBAAqB,CACrB,SACF,CACA,oBACE,oBAAqB,CACrB,aACF,CACA,mBACE,aACF","file":"app.30790115300ab27614ce176899523b62.css","sourcesContent":["\n#app {\n font-family: 'Avenir', Helvetica, Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-align: center;\n color: #2c3e50;\n margin-top: 60px;\n}\n\nh1[data-v-d8ec41bc], h2[data-v-d8ec41bc] {\n font-weight: normal;\n}\nul[data-v-d8ec41bc] {\n list-style-type: none;\n padding: 0;\n}\nli[data-v-d8ec41bc] {\n display: inline-block;\n margin: 0 10px;\n}\na[data-v-d8ec41bc] {\n color: #42b983;\n}\n"]} \ No newline at end of file diff --git a/api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js b/api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js new file mode 100644 index 0000000..06c5aae --- /dev/null +++ b/api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js @@ -0,0 +1,2 @@ +webpackJsonp([1],{"1uuo":function(t,e){},"7Otq":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTk2QkI4RkE3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTk2QkI4Rjk3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjU2QTEyNzk3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjU2QTEyN0E3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5WHowqAAAXNElEQVR42uxda4xd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"},NHnr:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a=n("7+uW"),s={render:function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"app"}},[e("img",{attrs:{src:n("7Otq")}}),this._v(" "),e("router-view")],1)},staticRenderFns:[]};var i=n("VU/8")({name:"App"},s,!1,function(t){n("Yz1H")},null,null).exports,r=n("/ocq"),l={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"hello"},[n("h1",[t._v(t._s(t.msg))]),t._v(" "),n("h2",[t._v("Essential Links")]),t._v(" "),t._m(0),t._v(" "),n("h2",[t._v("Ecosystem")]),t._v(" "),t._m(1)])},staticRenderFns:[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ul",[n("li",[n("a",{attrs:{href:"https://vuejs.org",target:"_blank"}},[t._v("\n Core Docs\n ")])]),t._v(" "),n("li",[n("a",{attrs:{href:"https://forum.vuejs.org",target:"_blank"}},[t._v("\n Forum\n ")])]),t._v(" "),n("li",[n("a",{attrs:{href:"https://chat.vuejs.org",target:"_blank"}},[t._v("\n Community Chat\n ")])]),t._v(" "),n("li",[n("a",{attrs:{href:"https://twitter.com/vuejs",target:"_blank"}},[t._v("\n Twitter\n ")])]),t._v(" "),n("br"),t._v(" "),n("li",[n("a",{attrs:{href:"http://vuejs-templates.github.io/webpack/",target:"_blank"}},[t._v("\n Docs for This Template\n ")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[e("a",{attrs:{href:"http://router.vuejs.org/",target:"_blank"}},[this._v("\n vue-router\n ")])]),this._v(" "),e("li",[e("a",{attrs:{href:"http://vuex.vuejs.org/",target:"_blank"}},[this._v("\n vuex\n ")])]),this._v(" "),e("li",[e("a",{attrs:{href:"http://vue-loader.vuejs.org/",target:"_blank"}},[this._v("\n vue-loader\n ")])]),this._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/vuejs/awesome-vue",target:"_blank"}},[this._v("\n awesome-vue\n ")])])])}]};var c=n("VU/8")({name:"HelloWorld",data:function(){return{msg:"Welcome to Your Vue.js App"}}},l,!1,function(t){n("1uuo")},"data-v-d8ec41bc",null).exports;a.a.use(r.a);var h=new r.a({routes:[{path:"/",name:"HelloWorld",component:c}]});a.a.config.productionTip=!1,new a.a({el:"#app",router:h,components:{App:i},template:""})},Yz1H:function(t,e){}},["NHnr"]); +//# sourceMappingURL=app.b22ce679862c47a75225.js.map \ No newline at end of file diff --git a/api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js.map b/api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js.map new file mode 100644 index 0000000..cb71d91 --- /dev/null +++ b/api-demos/vue-api-demo/src/main/resources/static/static/js/app.b22ce679862c47a75225.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/assets/logo.png","webpack:///./src/App.vue?e77b","webpack:///./src/App.vue","webpack:///src/App.vue","webpack:///./src/components/HelloWorld.vue?3ba4","webpack:///./src/components/HelloWorld.vue","webpack:///src/components/HelloWorld.vue","webpack:///./src/router/index.js","webpack:///./src/main.js"],"names":["module","exports","selectortype_template_index_0_src_App","render","_h","this","$createElement","_c","_self","attrs","id","src","__webpack_require__","_v","staticRenderFns","src_App","normalizeComponent","name","ssrContext","components_HelloWorld","_vm","staticClass","_s","msg","_m","href","target","src_components_HelloWorld","HelloWorld_normalizeComponent","data","Vue","use","Router","router","routes","path","component","HelloWorld","config","productionTip","el","components","App","template"],"mappings":"8DAAAA,EAAAC,QAAA,yiSCGeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,OAAOC,GAAA,SAAYH,EAAA,OAAYE,OAAOE,IAAMC,EAAQ,WAApIP,KAA0JQ,GAAA,KAAAN,EAAA,oBAEnKO,oBCCjB,IAuBeC,EAvBUH,EAAQ,OAcjCI,ECRAC,KAAA,ODUEf,GATF,EAVA,SAAAgB,GACEN,EAAQ,SAaV,KAEA,MAUgC,oBEvBjBO,GADEhB,OAFP,WAAgB,IAAAiB,EAAAf,KAAaD,EAAAgB,EAAAd,eAA0BC,EAAAa,EAAAZ,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBc,YAAA,UAAoBd,EAAA,MAAAa,EAAAP,GAAAO,EAAAE,GAAAF,EAAAG,QAAAH,EAAAP,GAAA,KAAAN,EAAA,MAAAa,EAAAP,GAAA,qBAAAO,EAAAP,GAAA,KAAAO,EAAAI,GAAA,GAAAJ,EAAAP,GAAA,KAAAN,EAAA,MAAAa,EAAAP,GAAA,eAAAO,EAAAP,GAAA,KAAAO,EAAAI,GAAA,MAE9FV,iBADb,WAAiB,IAAAM,EAAAf,KAAaD,EAAAgB,EAAAd,eAA0BC,EAAAa,EAAAZ,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,MAAAA,EAAA,MAAAA,EAAA,KAAiCE,OAAOgB,KAAA,oBAAAC,OAAA,YAA8CN,EAAAP,GAAA,mCAAAO,EAAAP,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAAyEE,OAAOgB,KAAA,0BAAAC,OAAA,YAAoDN,EAAAP,GAAA,+BAAAO,EAAAP,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAAqEE,OAAOgB,KAAA,yBAAAC,OAAA,YAAmDN,EAAAP,GAAA,wCAAAO,EAAAP,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAA8EE,OAAOgB,KAAA,4BAAAC,OAAA,YAAsDN,EAAAP,GAAA,iCAAAO,EAAAP,GAAA,KAAAN,EAAA,MAAAa,EAAAP,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAA4FE,OAAOgB,KAAA,4CAAAC,OAAA,YAAsEN,EAAAP,GAAA,mDAA2D,WAAc,IAAaT,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,MAAAA,EAAA,MAAAA,EAAA,KAAiCE,OAAOgB,KAAA,2BAAAC,OAAA,YAAvGrB,KAA4JQ,GAAA,oCAA5JR,KAA4JQ,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAA0EE,OAAOgB,KAAA,yBAAAC,OAAA,YAA7OrB,KAAgSQ,GAAA,8BAAhSR,KAAgSQ,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAAoEE,OAAOgB,KAAA,+BAAAC,OAAA,YAA3WrB,KAAoaQ,GAAA,oCAApaR,KAAoaQ,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAA0EE,OAAOgB,KAAA,uCAAAC,OAAA,YAArfrB,KAAsjBQ,GAAA,0CCE/2C,IAuBec,EAvBUf,EAAQ,OAcjBgB,ECsEhBX,KAAA,aACAY,KAFA,WAGA,OACAN,IAAA,gCDvEEJ,GAT6B,EAV/B,SAAoBD,GAClBN,EAAQ,SAaS,kBAEU,MAUG,QEtBhCkB,IAAIC,IAAIC,KAEO,IAAAC,EAAA,IAAID,KACjBE,SAEIC,KAAM,IACNlB,KAAM,aACNmB,UAAWC,MCLjBP,IAAIQ,OAAOC,eAAgB,EAG3B,IAAIT,KACFU,GAAI,OACJP,SACAQ,YAAcC,OACdC,SAAU","file":"static/js/app.b22ce679862c47a75225.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTk2QkI4RkE3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTk2QkI4Rjk3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjU2QTEyNzk3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjU2QTEyN0E3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5WHowqAAAXNElEQVR42uxda4xd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\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/assets/logo.png\n// module id = 7Otq\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('img',{attrs:{\"src\":require(\"./assets/logo.png\")}}),_vm._v(\" \"),_c('router-view')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4c97dd40\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4c97dd40\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4c97dd40\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/App.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"hello\"},[_c('h1',[_vm._v(_vm._s(_vm.msg))]),_vm._v(\" \"),_c('h2',[_vm._v(\"Essential Links\")]),_vm._v(\" \"),_vm._m(0),_vm._v(\" \"),_c('h2',[_vm._v(\"Ecosystem\")]),_vm._v(\" \"),_vm._m(1)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',[_c('li',[_c('a',{attrs:{\"href\":\"https://vuejs.org\",\"target\":\"_blank\"}},[_vm._v(\"\\n Core Docs\\n \")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"https://forum.vuejs.org\",\"target\":\"_blank\"}},[_vm._v(\"\\n Forum\\n \")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"https://chat.vuejs.org\",\"target\":\"_blank\"}},[_vm._v(\"\\n Community Chat\\n \")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"https://twitter.com/vuejs\",\"target\":\"_blank\"}},[_vm._v(\"\\n Twitter\\n \")])]),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"http://vuejs-templates.github.io/webpack/\",\"target\":\"_blank\"}},[_vm._v(\"\\n Docs for This Template\\n \")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',[_c('li',[_c('a',{attrs:{\"href\":\"http://router.vuejs.org/\",\"target\":\"_blank\"}},[_vm._v(\"\\n vue-router\\n \")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"http://vuex.vuejs.org/\",\"target\":\"_blank\"}},[_vm._v(\"\\n vuex\\n \")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"http://vue-loader.vuejs.org/\",\"target\":\"_blank\"}},[_vm._v(\"\\n vue-loader\\n \")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"https://github.com/vuejs/awesome-vue\",\"target\":\"_blank\"}},[_vm._v(\"\\n awesome-vue\\n \")])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-d8ec41bc\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HelloWorld.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-d8ec41bc\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./HelloWorld.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelloWorld.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelloWorld.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-d8ec41bc\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./HelloWorld.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-d8ec41bc\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/HelloWorld.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/HelloWorld.vue","import Vue from 'vue'\nimport Router from 'vue-router'\nimport HelloWorld from '@/components/HelloWorld'\n\nVue.use(Router)\n\nexport default new Router({\n routes: [\n {\n path: '/',\n name: 'HelloWorld',\n component: HelloWorld\n }\n ]\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/router/index.js","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport App from './App'\nimport router from './router'\n\nVue.config.productionTip = false\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n router,\n components: { App },\n template: ''\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js"],"sourceRoot":""} \ No newline at end of file diff --git a/api-demos/vue-api-demo/src/main/resources/static/static/js/manifest.2ae2e69a05c33dfc65f8.js b/api-demos/vue-api-demo/src/main/resources/static/static/js/manifest.2ae2e69a05c33dfc65f8.js new file mode 100644 index 0000000..20fc5d9 --- /dev/null +++ b/api-demos/vue-api-demo/src/main/resources/static/static/js/manifest.2ae2e69a05c33dfc65f8.js @@ -0,0 +1,2 @@ +!function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a=0&&(e=t.slice(r),t=t.slice(0,r));var i=t.indexOf("?");return i>=0&&(n=t.slice(i+1),t=t.slice(0,i)),{path:t,query:n,hash:e}}(o.path||""),p=e&&e.path||"/",d=u.path?x(u.path,p,n||o.append):p,v=function(t,e,n){void 0===e&&(e={});var r,i=n||f;try{r=i(t||"")}catch(t){r={}}for(var o in e){var a=e[o];r[o]=Array.isArray(a)?a.map(l):l(a)}return r}(u.query,o.query,r&&r.options.parseQuery),h=o.hash||u.hash;return h&&"#"!==h.charAt(0)&&(h="#"+h),{_normalized:!0,path:d,query:v,hash:h}}var q,z=[String,Object],K=[String,Array],J=function(){},W={name:"RouterLink",props:{to:{type:z,required:!0},tag:{type:String,default:"a"},exact:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:K,default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),a=o.location,s=o.route,c=o.href,u={},l=n.options.linkActiveClass,f=n.options.linkExactActiveClass,p=null==l?"router-link-active":l,h=null==f?"router-link-exact-active":f,m=null==this.activeClass?p:this.activeClass,y=null==this.exactActiveClass?h:this.exactActiveClass,_=s.redirectedFrom?v(null,V(s.redirectedFrom),null,n):s;u[y]=g(r,_),u[m]=this.exact?u[y]:function(t,e){return 0===t.path.replace(d,"/").indexOf(e.path.replace(d,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,_);var b=u[y]?this.ariaCurrentValue:null,w=function(t){X(t)&&(e.replace?n.replace(a,J):n.push(a,J))},$={click:X};Array.isArray(this.event)?this.event.forEach(function(t){$[t]=w}):$[this.event]=w;var x={class:u},C=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:s,navigate:w,isActive:u[m],isExactActive:u[y]});if(C){if(1===C.length)return C[0];if(C.length>1||!C.length)return 0===C.length?t():t("span",{},C)}if("a"===this.tag)x.on=$,x.attrs={href:c,"aria-current":b};else{var k=function t(e){if(e)for(var n,r=0;r-1&&(s.params[p]=n.params[p]);return s.path=B(l.path,s.params),c(l,s,a)}if(s.path){s.params={};for(var d=0;d=t.length?n():t[i]?e(t[i],function(){r(i+1)}):r(i+1)};r(0)}var wt={redirected:2,aborted:4,cancelled:8,duplicated:16};function $t(t,e){return Ct(t,e,wt.redirected,'Redirected when going from "'+t.fullPath+'" to "'+function(t){if("string"==typeof t)return t;if("path"in t)return t.path;var e={};return kt.forEach(function(n){n in t&&(e[n]=t[n])}),JSON.stringify(e,null,2)}(e)+'" via a navigation guard.')}function xt(t,e){return Ct(t,e,wt.cancelled,'Navigation cancelled from "'+t.fullPath+'" to "'+e.fullPath+'" with a new navigation.')}function Ct(t,e,n,r){var i=new Error(r);return i._isRouter=!0,i.from=t,i.to=e,i.type=n,i}var kt=["params","query","hash"];function At(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}function Ot(t,e){return At(t)&&t._isRouter&&(null==e||t.type===e)}function St(t){return function(e,n,r){var i=!1,o=0,a=null;Tt(t,function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){i=!0,o++;var c,u=Rt(function(e){var i;((i=e).__esModule||jt&&"Module"===i[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:q.extend(e),n.components[s]=e,--o<=0&&r()}),l=Rt(function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=At(t)?t:new Error(e),r(a))});try{c=t(u,l)}catch(t){l(t)}if(c)if("function"==typeof c.then)c.then(u,l);else{var f=c.component;f&&"function"==typeof f.then&&f.then(u,l)}}}),i||r()}}function Tt(t,e){return Et(t.map(function(t){return Object.keys(t.components).map(function(n){return e(t.components[n],t.instances[n],t,n)})}))}function Et(t){return Array.prototype.concat.apply([],t)}var jt="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Rt(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Lt=function(t,e){this.router=t,this.base=function(t){if(!t)if(G){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=m,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Nt(t,e,n,r){var i=Tt(t,function(t,r,i,o){var a=function(t,e){"function"!=typeof t&&(t=q.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map(function(t){return n(t,r,i,o)}):n(a,r,i,o)});return Et(r?i.reverse():i)}function Pt(t,e){if(e)return function(){return t.apply(e,arguments)}}Lt.prototype.listen=function(t){this.cb=t},Lt.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Lt.prototype.onError=function(t){this.errorCbs.push(t)},Lt.prototype.transitionTo=function(t,e,n){var r,i=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach(function(e){e(t)}),t}var o=this.current;this.confirmTransition(r,function(){i.updateRoute(r),e&&e(r),i.ensureURL(),i.router.afterHooks.forEach(function(t){t&&t(r,o)}),i.ready||(i.ready=!0,i.readyCbs.forEach(function(t){t(r)}))},function(t){n&&n(t),t&&!i.ready&&(Ot(t,wt.redirected)&&o===m||(i.ready=!0,i.readyErrorCbs.forEach(function(e){e(t)})))})},Lt.prototype.confirmTransition=function(t,e,n){var i=this,o=this.current;this.pending=t;var a,s,c=function(t){!Ot(t)&&At(t)&&(i.errorCbs.length?i.errorCbs.forEach(function(e){e(t)}):(r(),console.error(t))),n&&n(t)},u=t.matched.length-1,l=o.matched.length-1;if(g(t,o)&&u===l&&t.matched[u]===o.matched[l])return this.ensureURL(),c(((s=Ct(a=o,t,wt.duplicated,'Avoided redundant navigation to current location: "'+a.fullPath+'".')).name="NavigationDuplicated",s));var f=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=yt&&n;r&&this.listeners.push(st());var i=function(){var n=t.current,i=Dt(t.base);t.current===m&&i===t._startLocation||t.transitionTo(i,function(t){r&&ct(e,t,n,!0)})};window.addEventListener("popstate",i),this.listeners.push(function(){window.removeEventListener("popstate",i)})}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,function(t){gt(C(r.base+t.fullPath)),ct(r.router,t,i,!1),e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,function(t){_t(C(r.base+t.fullPath)),ct(r.router,t,i,!1),e&&e(t)},n)},e.prototype.ensureURL=function(t){if(Dt(this.base)!==this.current.fullPath){var e=C(this.base+this.current.fullPath);t?gt(e):_t(e)}},e.prototype.getCurrentLocation=function(){return Dt(this.base)},e}(Lt);function Dt(t){var e=window.location.pathname;return t&&0===e.toLowerCase().indexOf(t.toLowerCase())&&(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var It=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=Dt(t);if(!/^\/#/.test(e))return window.location.replace(C(t+"/#"+e)),!0}(this.base)||Ft()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=yt&&e;n&&this.listeners.push(st());var r=function(){var e=t.current;Ft()&&t.transitionTo(Ht(),function(r){n&&ct(t.router,r,e,!0),yt||Vt(r.fullPath)})},i=yt?"popstate":"hashchange";window.addEventListener(i,r),this.listeners.push(function(){window.removeEventListener(i,r)})}},e.prototype.push=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,function(t){Bt(t.fullPath),ct(r.router,t,i,!1),e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,function(t){Vt(t.fullPath),ct(r.router,t,i,!1),e&&e(t)},n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Ht()!==e&&(t?Bt(e):Vt(e))},e.prototype.getCurrentLocation=function(){return Ht()},e}(Lt);function Ft(){var t=Ht();return"/"===t.charAt(0)||(Vt("/"+t),!1)}function Ht(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Ut(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Bt(t){yt?gt(Ut(t)):window.location.hash=t}function Vt(t){yt?_t(Ut(t)):window.location.replace(Ut(t))}var qt=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)},n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach(function(e){e&&e(r,t)})},function(t){Ot(t,wt.duplicated)&&(e.index=n)})}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Lt),zt=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Q(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!yt&&!1!==t.fallback,this.fallback&&(e="hash"),G||(e="abstract"),this.mode=e,e){case"history":this.history=new Mt(this,t.base);break;case"hash":this.history=new It(this,t.base,this.fallback);break;case"abstract":this.history=new qt(this,t.base);break;default:0}},Kt={currentRoute:{configurable:!0}};function Jt(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}zt.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Kt.currentRoute.get=function(){return this.history&&this.history.current},zt.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()}),!this.app){this.app=t;var n=this.history;if(n instanceof Mt||n instanceof It){var r=function(t){n.setupListeners(),function(t){var r=n.current,i=e.options.scrollBehavior;yt&&i&&"fullPath"in t&&ct(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen(function(t){e.apps.forEach(function(e){e._route=t})})}},zt.prototype.beforeEach=function(t){return Jt(this.beforeHooks,t)},zt.prototype.beforeResolve=function(t){return Jt(this.resolveHooks,t)},zt.prototype.afterEach=function(t){return Jt(this.afterHooks,t)},zt.prototype.onReady=function(t,e){this.history.onReady(t,e)},zt.prototype.onError=function(t){this.history.onError(t)},zt.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise(function(e,n){r.history.push(t,e,n)});this.history.push(t,e,n)},zt.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise(function(e,n){r.history.replace(t,e,n)});this.history.replace(t,e,n)},zt.prototype.go=function(t){this.history.go(t)},zt.prototype.back=function(){this.go(-1)},zt.prototype.forward=function(){this.go(1)},zt.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map(function(t){return Object.keys(t.components).map(function(e){return t.components[e]})})):[]},zt.prototype.resolve=function(t,e,n){var r=V(t,e=e||this.history.current,n,this),i=this.match(r,e),o=i.redirectedFrom||i.fullPath;return{location:r,route:i,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?C(t+"/"+r):r}(this.history.base,o,this.mode),normalizedTo:r,resolved:i}},zt.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(zt.prototype,Kt),zt.install=Z,zt.version="3.4.9",zt.isNavigationFailure=Ot,zt.NavigationFailureType=wt,G&&window.Vue&&window.Vue.use(zt),e.a=zt},"7+uW":function(t,e,n){"use strict";(function(t){ +/*! + * Vue.js v2.6.12 + * (c) 2014-2020 Evan You + * Released under the MIT License. + */ +var n=Object.freeze({});function r(t){return void 0===t||null===t}function i(t){return void 0!==t&&null!==t}function o(t){return!0===t}function a(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function s(t){return null!==t&&"object"==typeof t}var c=Object.prototype.toString;function u(t){return"[object Object]"===c.call(t)}function l(t){return"[object RegExp]"===c.call(t)}function f(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function p(t){return i(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function d(t){return null==t?"":Array.isArray(t)||u(t)&&t.toString===c?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function h(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i-1)return t.splice(n,1)}}var _=Object.prototype.hasOwnProperty;function b(t,e){return _.call(t,e)}function w(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var $=/-(\w)/g,x=w(function(t){return t.replace($,function(t,e){return e?e.toUpperCase():""})}),C=w(function(t){return t.charAt(0).toUpperCase()+t.slice(1)}),k=/\B([A-Z])/g,A=w(function(t){return t.replace(k,"-$1").toLowerCase()});var O=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function S(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function T(t,e){for(var n in e)t[n]=e[n];return t}function E(t){for(var e={},n=0;n0,Q=Z&&Z.indexOf("edge/")>0,tt=(Z&&Z.indexOf("android"),Z&&/iphone|ipad|ipod|ios/.test(Z)||"ios"===X),et=(Z&&/chrome\/\d+/.test(Z),Z&&/phantomjs/.test(Z),Z&&Z.match(/firefox\/(\d+)/)),nt={}.watch,rt=!1;if(J)try{var it={};Object.defineProperty(it,"passive",{get:function(){rt=!0}}),window.addEventListener("test-passive",null,it)}catch(t){}var ot=function(){return void 0===z&&(z=!J&&!W&&void 0!==t&&(t.process&&"server"===t.process.env.VUE_ENV)),z},at=J&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function st(t){return"function"==typeof t&&/native code/.test(t.toString())}var ct,ut="undefined"!=typeof Symbol&&st(Symbol)&&"undefined"!=typeof Reflect&&st(Reflect.ownKeys);ct="undefined"!=typeof Set&&st(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var lt=j,ft=0,pt=function(){this.id=ft++,this.subs=[]};pt.prototype.addSub=function(t){this.subs.push(t)},pt.prototype.removeSub=function(t){g(this.subs,t)},pt.prototype.depend=function(){pt.target&&pt.target.addDep(this)},pt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(o&&!b(i,"default"))a=!1;else if(""===a||a===A(t)){var c=Bt(String,i.type);(c<0||s0&&(fe((u=t(u,(n||"")+"_"+c))[0])&&fe(f)&&(s[l]=_t(f.text+u[0].text),u.shift()),s.push.apply(s,u)):a(u)?fe(f)?s[l]=_t(f.text+u):""!==u&&s.push(_t(u)):fe(u)&&fe(f)?s[l]=_t(f.text+u.text):(o(e._isVList)&&i(u.tag)&&r(u.key)&&i(n)&&(u.key="__vlist"+n+"_"+c+"__"),s.push(u)));return s}(t):void 0}function fe(t){return i(t)&&i(t.text)&&!1===t.isComment}function pe(t,e){if(t){for(var n=Object.create(null),r=ut?Reflect.ownKeys(t):Object.keys(t),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==n&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=me(e,c,t[c]))}else i={};for(var u in e)u in i||(i[u]=ye(e,u));return t&&Object.isExtensible(t)&&(t._normalized=i),V(i,"$stable",a),V(i,"$key",s),V(i,"$hasNormal",o),i}function me(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({});return(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:le(t))&&(0===t.length||1===t.length&&t[0].isComment)?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function ye(t,e){return function(){return t[e]}}function ge(t,e){var n,r,o,a,c;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,o=t.length;rdocument.createEvent("Event").timeStamp&&(fn=function(){return pn.now()})}function dn(){var t,e;for(ln=fn(),cn=!0,rn.sort(function(t,e){return t.id-e.id}),un=0;unun&&rn[n].id>t.id;)n--;rn.splice(n+1,0,t)}else rn.push(t);sn||(sn=!0,ne(dn))}}(this)},hn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||s(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){Vt(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},hn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},hn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},hn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var mn={enumerable:!0,configurable:!0,get:j,set:j};function yn(t,e,n){mn.get=function(){return this[e][n]},mn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,mn)}function gn(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},i=t.$options._propKeys=[],o=!t.$parent;o||kt(!1);var a=function(o){i.push(o);var a=Ft(o,e,n,t);St(r,o,a),o in t||yn(t,"_props",o)};for(var s in e)a(s);kt(!0)}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]="function"!=typeof e[n]?j:O(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;u(e=t._data="function"==typeof e?function(t,e){vt();try{return t.call(e,e)}catch(t){return Vt(t,e,"data()"),{}}finally{ht()}}(e,t):e||{})||(e={});var n=Object.keys(e),r=t.$options.props,i=(t.$options.methods,n.length);for(;i--;){var o=n[i];0,r&&b(r,o)||B(o)||yn(t,"_data",o)}Ot(e,!0)}(t):Ot(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=ot();for(var i in e){var o=e[i],a="function"==typeof o?o:o.get;0,r||(n[i]=new hn(t,a||j,j,_n)),i in t||bn(t,i,o)}}(t,e.computed),e.watch&&e.watch!==nt&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var i=0;i-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!l(t)&&t.test(e)}function En(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var s=Sn(a.componentOptions);s&&!e(s)&&jn(n,o,r,i)}}}function jn(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,g(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=Cn++,e._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Dt(kn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ge(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,r=t.$vnode=e._parentVnode,i=r&&r.context;t.$slots=de(e._renderChildren,i),t.$scopedSlots=n,t._c=function(e,n,r,i){return Be(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Be(t,e,n,r,i,!0)};var o=r&&r.data;St(t,"$attrs",o&&o.attrs||n,null,!0),St(t,"$listeners",e._parentListeners||n,null,!0)}(e),nn(e,"beforeCreate"),function(t){var e=pe(t.$options.inject,t);e&&(kt(!1),Object.keys(e).forEach(function(n){St(t,n,e[n])}),kt(!0))}(e),gn(e),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(e),nn(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(An),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=Tt,t.prototype.$delete=Et,t.prototype.$watch=function(t,e,n){if(u(e))return xn(this,t,e,n);(n=n||{}).user=!0;var r=new hn(this,t,e,n);if(n.immediate)try{e.call(this,r.value)}catch(t){Vt(t,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(An),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var r=this;if(Array.isArray(t))for(var i=0,o=t.length;i1?S(n):n;for(var r=S(arguments,1),i='event handler for "'+t+'"',o=0,a=n.length;oparseInt(this.max)&&jn(a,s[0],s,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return H}};Object.defineProperty(t,"config",e),t.util={warn:lt,extend:T,mergeOptions:Dt,defineReactive:St},t.set=Tt,t.delete=Et,t.nextTick=ne,t.observable=function(t){return Ot(t),t},t.options=Object.create(null),I.forEach(function(e){t.options[e+"s"]=Object.create(null)}),t.options._base=t,T(t.options.components,Ln),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=S(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Dt(this.options,t),this}}(t),On(t),function(t){I.forEach(function(e){t[e]=function(t,n){return n?("component"===e&&u(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}})}(t)}(An),Object.defineProperty(An.prototype,"$isServer",{get:ot}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Le}),An.version="2.6.12";var Nn=h("style,class"),Pn=h("input,textarea,option,select,progress"),Mn=function(t,e,n){return"value"===n&&Pn(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Dn=h("contenteditable,draggable,spellcheck"),In=h("events,caret,typing,plaintext-only"),Fn=function(t,e){return qn(e)||"false"===e?"false":"contenteditable"===t&&In(e)?e:"true"},Hn=h("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Un="http://www.w3.org/1999/xlink",Bn=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Vn=function(t){return Bn(t)?t.slice(6,t.length):""},qn=function(t){return null==t||!1===t};function zn(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Kn(r.data,e));for(;i(n=n.parent);)n&&n.data&&(e=Kn(e,n.data));return function(t,e){if(i(t)||i(e))return Jn(t,Wn(e));return""}(e.staticClass,e.class)}function Kn(t,e){return{staticClass:Jn(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function Jn(t,e){return t?e?t+" "+e:t:e||""}function Wn(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?_r(t,e,n):Hn(e)?qn(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Dn(e)?t.setAttribute(e,Fn(e,n)):Bn(e)?qn(n)?t.removeAttributeNS(Un,Vn(e)):t.setAttributeNS(Un,e,n):_r(t,e,n)}function _r(t,e,n){if(qn(n))t.removeAttribute(e);else{if(G&&!Y&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var br={create:yr,update:yr};function wr(t,e){var n=e.elm,o=e.data,a=t.data;if(!(r(o.staticClass)&&r(o.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var s=zn(e),c=n._transitionClasses;i(c)&&(s=Jn(s,Wn(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var $r,xr,Cr,kr,Ar,Or,Sr={create:wr,update:wr},Tr=/[\w).+\-_$\]]/;function Er(t){var e,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(h=t.charAt(v));v--);h&&Tr.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=t.slice(0,r).trim()):m();function m(){(o||(o=[])).push(t.slice(d,r).trim()),d=r+1}if(void 0===i?i=t.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:t.slice(0,kr),key:'"'+t.slice(kr+1)+'"'}:{exp:t,key:null};xr=t,kr=Ar=Or=0;for(;!Wr();)Xr(Cr=Jr())?Gr(Cr):91===Cr&&Zr(Cr);return{exp:t.slice(0,Ar),key:t.slice(Ar+1,Or)}}(t);return null===n.key?t+"="+e:"$set("+n.exp+", "+n.key+", "+e+")"}function Jr(){return xr.charCodeAt(++kr)}function Wr(){return kr>=$r}function Xr(t){return 34===t||39===t}function Zr(t){var e=1;for(Ar=kr;!Wr();)if(Xr(t=Jr()))Gr(t);else if(91===t&&e++,93===t&&e--,0===e){Or=kr;break}}function Gr(t){for(var e=t;!Wr()&&(t=Jr())!==e;);}var Yr,Qr="__r",ti="__c";function ei(t,e,n){var r=Yr;return function i(){null!==e.apply(null,arguments)&&ii(t,i,n,r)}}var ni=Wt&&!(et&&Number(et[1])<=53);function ri(t,e,n,r){if(ni){var i=ln,o=e;e=o._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=i||t.timeStamp<=0||t.target.ownerDocument!==document)return o.apply(this,arguments)}}Yr.addEventListener(t,e,rt?{capture:n,passive:r}:n)}function ii(t,e,n,r){(r||Yr).removeEventListener(t,e._wrapper||e,n)}function oi(t,e){if(!r(t.data.on)||!r(e.data.on)){var n=e.data.on||{},o=t.data.on||{};Yr=e.elm,function(t){if(i(t[Qr])){var e=G?"change":"input";t[e]=[].concat(t[Qr],t[e]||[]),delete t[Qr]}i(t[ti])&&(t.change=[].concat(t[ti],t.change||[]),delete t[ti])}(n),se(n,o,ri,ii,ei,e.context),Yr=void 0}}var ai,si={create:oi,update:oi};function ci(t,e){if(!r(t.data.domProps)||!r(e.data.domProps)){var n,o,a=e.elm,s=t.data.domProps||{},c=e.data.domProps||{};for(n in i(c.__ob__)&&(c=e.data.domProps=T({},c)),s)n in c||(a[n]="");for(n in c){if(o=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),o===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=o;var u=r(o)?"":String(o);ui(a,u)&&(a.value=u)}else if("innerHTML"===n&&Gn(a.tagName)&&r(a.innerHTML)){(ai=ai||document.createElement("div")).innerHTML=""+o+"";for(var l=ai.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[n])try{a[n]=o}catch(t){}}}}function ui(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return v(n)!==v(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var li={create:ci,update:ci},fi=w(function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach(function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e});function pi(t){var e=di(t.style);return t.staticStyle?T(t.staticStyle,e):e}function di(t){return Array.isArray(t)?E(t):"string"==typeof t?fi(t):t}var vi,hi=/^--/,mi=/\s*!important$/,yi=function(t,e,n){if(hi.test(e))t.style.setProperty(e,n);else if(mi.test(n))t.style.setProperty(A(e),n.replace(mi,""),"important");else{var r=_i(e);if(Array.isArray(n))for(var i=0,o=n.length;i-1?e.split($i).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Ci(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split($i).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function ki(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&T(e,Ai(t.name||"v")),T(e,t),e}return"string"==typeof t?Ai(t):void 0}}var Ai=w(function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}}),Oi=J&&!Y,Si="transition",Ti="animation",Ei="transition",ji="transitionend",Ri="animation",Li="animationend";Oi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ei="WebkitTransition",ji="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Ri="WebkitAnimation",Li="webkitAnimationEnd"));var Ni=J?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Pi(t){Ni(function(){Ni(t)})}function Mi(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),xi(t,e))}function Di(t,e){t._transitionClasses&&g(t._transitionClasses,e),Ci(t,e)}function Ii(t,e,n){var r=Hi(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Si?ji:Li,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout(function(){c0&&(n=Si,l=a,f=o.length):e===Ti?u>0&&(n=Ti,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Si:Ti:null)?n===Si?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Si&&Fi.test(r[Ei+"Property"])}}function Ui(t,e){for(;t.length1}function Ji(t,e){!0!==e.data.show&&Vi(e)}var Wi=function(t){var e,n,s={},c=t.modules,u=t.nodeOps;for(e=0;ev?_(t,r(n[y+1])?null:n[y+1].elm,n,d,y,o):d>y&&w(e,p,v)}(p,h,y,n,l):i(y)?(i(t.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,n)):i(h)?w(h,0,h.length-1):i(t.text)&&u.setTextContent(p,""):t.text!==e.text&&u.setTextContent(p,e.text),i(v)&&i(d=v.hook)&&i(d=d.postpatch)&&d(t,e)}}}function k(t,e,n){if(o(n)&&i(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==o&&(a.selected=o);else if(N(Qi(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));i||(t.selectedIndex=-1)}}function Yi(t,e){return e.every(function(e){return!N(e,t)})}function Qi(t){return"_value"in t?t._value:t.value}function to(t){t.target.composing=!0}function eo(t){t.target.composing&&(t.target.composing=!1,no(t.target,"input"))}function no(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function ro(t){return!t.componentInstance||t.data&&t.data.transition?t:ro(t.componentInstance._vnode)}var io={model:Xi,show:{bind:function(t,e,n){var r=e.value,i=(n=ro(n)).data&&n.data.transition,o=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&i?(n.data.show=!0,Vi(n,function(){t.style.display=o})):t.style.display=r?o:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=ro(n)).data&&n.data.transition?(n.data.show=!0,r?Vi(n,function(){t.style.display=t.__vOriginalDisplay}):qi(n,function(){t.style.display="none"})):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,i){i||(t.style.display=t.__vOriginalDisplay)}}},oo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ao(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?ao(Je(e.children)):t}function so(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[x(o)]=i[o];return e}function co(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var uo=function(t){return t.tag||Ke(t)},lo=function(t){return"show"===t.name},fo={name:"transition",props:oo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(uo)).length){0;var r=this.mode;0;var i=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return i;var o=ao(i);if(!o)return i;if(this._leaving)return co(t,i);var s="__transition-"+this._uid+"-";o.key=null==o.key?o.isComment?s+"comment":s+o.tag:a(o.key)?0===String(o.key).indexOf(s)?o.key:s+o.key:o.key;var c=(o.data||(o.data={})).transition=so(this),u=this._vnode,l=ao(u);if(o.data.directives&&o.data.directives.some(lo)&&(o.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(o,l)&&!Ke(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=T({},c);if("out-in"===r)return this._leaving=!0,ce(f,"afterLeave",function(){e._leaving=!1,e.$forceUpdate()}),co(t,i);if("in-out"===r){if(Ke(o))return u;var p,d=function(){p()};ce(c,"afterEnter",d),ce(c,"enterCancelled",d),ce(f,"delayLeave",function(t){p=t})}}return i}}},po=T({tag:String,moveClass:String},oo);function vo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function ho(t){t.data.newPos=t.elm.getBoundingClientRect()}function mo(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,i=e.top-n.top;if(r||i){t.data.moved=!0;var o=t.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete po.mode;var yo={Transition:fo,TransitionGroup:{props:po,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var i=Qe(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,i(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=so(this),s=0;s-1?tr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:tr[t]=/HTMLUnknownElement/.test(e.toString())},T(An.options.directives,io),T(An.options.components,yo),An.prototype.__patch__=J?Wi:j,An.prototype.$mount=function(t,e){return function(t,e,n){return t.$el=e,t.$options.render||(t.$options.render=gt),nn(t,"beforeMount"),new hn(t,function(){t._update(t._render(),n)},j,{before:function(){t._isMounted&&!t._isDestroyed&&nn(t,"beforeUpdate")}},!0),n=!1,null==t.$vnode&&(t._isMounted=!0,nn(t,"mounted")),t}(this,t=t&&J?nr(t):void 0,e)},J&&setTimeout(function(){H.devtools&&at&&at.emit("init",An)},0);var go=/\{\{((?:.|\r?\n)+?)\}\}/g,_o=/[-.*+?^${}()|[\]\/\\]/g,bo=w(function(t){var e=t[0].replace(_o,"\\$&"),n=t[1].replace(_o,"\\$&");return new RegExp(e+"((?:.|\\n)+?)"+n,"g")});function wo(t,e){var n=e?bo(e):go;if(n.test(t)){for(var r,i,o,a=[],s=[],c=n.lastIndex=0;r=n.exec(t);){(i=r.index)>c&&(s.push(o=t.slice(c,i)),a.push(JSON.stringify(o)));var u=Er(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Eo=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,jo="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+U.source+"]*",Ro="((?:"+jo+"\\:)?"+jo+")",Lo=new RegExp("^<"+Ro),No=/^\s*(\/?)>/,Po=new RegExp("^<\\/"+Ro+"[^>]*>"),Mo=/^]+>/i,Do=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Bo=/&(?:lt|gt|quot|amp|#39);/g,Vo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,qo=h("pre,textarea",!0),zo=function(t,e){return t&&qo(t)&&"\n"===e[0]};function Ko(t,e){var n=e?Vo:Bo;return t.replace(n,function(t){return Uo[t]})}var Jo,Wo,Xo,Zo,Go,Yo,Qo,ta,ea=/^@|^v-on:/,na=/^v-|^@|^:|^#/,ra=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,ia=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,oa=/^\(|\)$/g,aa=/^\[.*\]$/,sa=/:(.*)$/,ca=/^:|^\.|^v-bind:/,ua=/\.[^.\]]+(?=[^\]]*$)/g,la=/^v-slot(:|$)|^#/,fa=/[\r\n]/,pa=/\s+/g,da=w(ko),va="_empty_";function ha(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:function(t){for(var e={},n=0,r=t.length;n]*>)","i")),p=t.replace(f,function(t,n,r){return u=r.length,Fo(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),zo(l,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""});c+=t.length-p.length,t=p,A(l,c-u,c)}else{var d=t.indexOf("<");if(0===d){if(Do.test(t)){var v=t.indexOf("--\x3e");if(v>=0){e.shouldKeepComment&&e.comment(t.substring(4,v),c,c+v+3),x(v+3);continue}}if(Io.test(t)){var h=t.indexOf("]>");if(h>=0){x(h+2);continue}}var m=t.match(Mo);if(m){x(m[0].length);continue}var y=t.match(Po);if(y){var g=c;x(y[0].length),A(y[1],g,c);continue}var _=C();if(_){k(_),zo(_.tagName,t)&&x(1);continue}}var b=void 0,w=void 0,$=void 0;if(d>=0){for(w=t.slice(d);!(Po.test(w)||Lo.test(w)||Do.test(w)||Io.test(w)||($=w.indexOf("<",1))<0);)d+=$,w=t.slice(d);b=t.substring(0,d)}d<0&&(b=t),b&&x(b.length),e.chars&&b&&e.chars(b,c-b.length,c)}if(t===n){e.chars&&e.chars(t);break}}function x(e){c+=e,t=t.substring(e)}function C(){var e=t.match(Lo);if(e){var n,r,i={tagName:e[1],attrs:[],start:c};for(x(e[0].length);!(n=t.match(No))&&(r=t.match(Eo)||t.match(To));)r.start=c,x(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],x(n[0].length),i.end=c,i}}function k(t){var n=t.tagName,c=t.unarySlash;o&&("p"===r&&So(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=t.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)e.end&&e.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?e.start&&e.start(t,[],!0,n,o):"p"===s&&(e.start&&e.start(t,[],!1,n,o),e.end&&e.end(t,n,o))}A()}(t,{warn:Jo,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecodeNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,outputSourceRange:e.outputSourceRange,start:function(t,n,a,s,f){var p=i&&i.ns||ta(t);G&&"svg"===p&&(n=function(t){for(var e=[],n=0;n-1"+("true"===o?":("+e+")":":_q("+e+","+o+")")),Fr(t,"change","var $$a="+e+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Kr(e,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Kr(e,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Kr(e,"$$c")+"}",null,!0)}(t,r,i);else if("input"===o&&"radio"===a)!function(t,e,n){var r=n&&n.number,i=Ur(t,"value")||"null";Nr(t,"checked","_q("+e+","+(i=r?"_n("+i+")":i)+")"),Fr(t,"change",Kr(e,i),null,!0)}(t,r,i);else if("input"===o||"textarea"===o)!function(t,e,n){var r=t.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Qr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Kr(e,l);c&&(f="if($event.target.composing)return;"+f),Nr(t,"value","("+e+")"),Fr(t,u,f,null,!0),(s||a)&&Fr(t,"blur","$forceUpdate()")}(t,r,i);else if(!H.isReservedTag(o))return zr(t,r,i),!1;return!0},text:function(t,e){e.value&&Nr(t,"textContent","_s("+e.value+")",e)},html:function(t,e){e.value&&Nr(t,"innerHTML","_s("+e.value+")",e)}},isPreTag:function(t){return"pre"===t},isUnaryTag:Ao,mustUseProp:Mn,canBeLeftOpenTag:Oo,isReservedTag:Yn,getTagNamespace:Qn,staticKeys:function(t){return t.reduce(function(t,e){return t.concat(e.staticKeys||[])},[]).join(",")}(ka)},Ta=w(function(t){return h("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(t?","+t:""))});function Ea(t,e){t&&(Aa=Ta(e.staticKeys||""),Oa=e.isReservedTag||R,function t(e){e.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||m(t.tag)||!Oa(t.tag)||function(t){for(;t.parent;){if("template"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(Aa)))}(e);if(1===e.type){if(!Oa(e.tag)&&"slot"!==e.tag&&null==e.attrsMap["inline-template"])return;for(var n=0,r=e.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,Ra=/\([^)]*?\);*$/,La=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Na={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Pa={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ma=function(t){return"if("+t+")return null;"},Da={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ma("$event.target !== $event.currentTarget"),ctrl:Ma("!$event.ctrlKey"),shift:Ma("!$event.shiftKey"),alt:Ma("!$event.altKey"),meta:Ma("!$event.metaKey"),left:Ma("'button' in $event && $event.button !== 0"),middle:Ma("'button' in $event && $event.button !== 1"),right:Ma("'button' in $event && $event.button !== 2")};function Ia(t,e){var n=e?"nativeOn:":"on:",r="",i="";for(var o in t){var a=Fa(t[o]);t[o]&&t[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function Fa(t){if(!t)return"function(){}";if(Array.isArray(t))return"["+t.map(function(t){return Fa(t)}).join(",")+"]";var e=La.test(t.value),n=ja.test(t.value),r=La.test(t.value.replace(Ra,""));if(t.modifiers){var i="",o="",a=[];for(var s in t.modifiers)if(Da[s])o+=Da[s],Na[s]&&a.push(s);else if("exact"===s){var c=t.modifiers;o+=Ma(["ctrl","shift","alt","meta"].filter(function(t){return!c[t]}).map(function(t){return"$event."+t+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(t){return"if(!$event.type.indexOf('key')&&"+t.map(Ha).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(e?"return "+t.value+"($event)":n?"return ("+t.value+")($event)":r?"return "+t.value:t.value)+"}"}return e||n?t.value:"function($event){"+(r?"return "+t.value:t.value)+"}"}function Ha(t){var e=parseInt(t,10);if(e)return"$event.keyCode!=="+e;var n=Na[t],r=Pa[t];return"_k($event.keyCode,"+JSON.stringify(t)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Ua={on:function(t,e){t.wrapListeners=function(t){return"_g("+t+","+e.value+")"}},bind:function(t,e){t.wrapData=function(n){return"_b("+n+",'"+t.tag+"',"+e.value+","+(e.modifiers&&e.modifiers.prop?"true":"false")+(e.modifiers&&e.modifiers.sync?",true":"")+")"}},cloak:j},Ba=function(t){this.options=t,this.warn=t.warn||Rr,this.transforms=Lr(t.modules,"transformCode"),this.dataGenFns=Lr(t.modules,"genData"),this.directives=T(T({},Ua),t.directives);var e=t.isReservedTag||R;this.maybeComponent=function(t){return!!t.component||!e(t.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Va(t,e){var n=new Ba(e);return{render:"with(this){return "+(t?qa(t,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function qa(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&!t.staticProcessed)return za(t,e);if(t.once&&!t.onceProcessed)return Ka(t,e);if(t.for&&!t.forProcessed)return Wa(t,e);if(t.if&&!t.ifProcessed)return Ja(t,e);if("template"!==t.tag||t.slotTarget||e.pre){if("slot"===t.tag)return function(t,e){var n=t.slotName||'"default"',r=Ya(t,e),i="_t("+n+(r?","+r:""),o=t.attrs||t.dynamicAttrs?es((t.attrs||[]).concat(t.dynamicAttrs||[]).map(function(t){return{name:x(t.name),value:t.value,dynamic:t.dynamic}})):null,a=t.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(t,e);var n;if(t.component)n=function(t,e,n){var r=e.inlineTemplate?null:Ya(e,n,!0);return"_c("+t+","+Xa(e,n)+(r?","+r:"")+")"}(t.component,t,e);else{var r;(!t.plain||t.pre&&e.maybeComponent(t))&&(r=Xa(t,e));var i=t.inlineTemplate?null:Ya(t,e,!0);n="_c('"+t.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o>>0}(a):"")+")"}(t,t.scopedSlots,e)+","),t.model&&(n+="model:{value:"+t.model.value+",callback:"+t.model.callback+",expression:"+t.model.expression+"},"),t.inlineTemplate){var o=function(t,e){var n=t.children[0];0;if(n&&1===n.type){var r=Va(n,e.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(t){return"function(){"+t+"}"}).join(",")+"]}"}}(t,e);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",t.dynamicAttrs&&(n="_b("+n+',"'+t.tag+'",'+es(t.dynamicAttrs)+")"),t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function Za(t){return 1===t.type&&("slot"===t.tag||t.children.some(Za))}function Ga(t,e){var n=t.attrsMap["slot-scope"];if(t.if&&!t.ifProcessed&&!n)return Ja(t,e,Ga,"null");if(t.for&&!t.forProcessed)return Wa(t,e,Ga);var r=t.slotScope===va?"":String(t.slotScope),i="function("+r+"){return "+("template"===t.tag?t.if&&n?"("+t.if+")?"+(Ya(t,e)||"undefined")+":undefined":Ya(t,e)||"undefined":qa(t,e))+"}",o=r?"":",proxy:true";return"{key:"+(t.slotTarget||'"default"')+",fn:"+i+o+"}"}function Ya(t,e,n,r,i){var o=t.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?e.maybeComponent(a)?",1":",0":"";return""+(r||qa)(a,e)+s}var c=n?function(t,e){for(var n=0,r=0;r':'
',as.innerHTML.indexOf(" ")>0}var ls=!!J&&us(!1),fs=!!J&&us(!0),ps=w(function(t){var e=nr(t);return e&&e.innerHTML}),ds=An.prototype.$mount;An.prototype.$mount=function(t,e){if((t=t&&nr(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ps(r));else{if(!r.nodeType)return this;r=r.innerHTML}else t&&(r=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(r){0;var i=cs(r,{outputSourceRange:!1,shouldDecodeNewlines:ls,shouldDecodeNewlinesForHref:fs,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return ds.call(this,t,e)},An.compile=cs,e.a=An}).call(e,n("DuR2"))},DuR2:function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},"VU/8":function(t,e){t.exports=function(t,e,n,r,i,o){var a,s=t=t||{},c=typeof t.default;"object"!==c&&"function"!==c||(a=t,s=t.default);var u,l="function"==typeof s?s.options:s;if(e&&(l.render=e.render,l.staticRenderFns=e.staticRenderFns,l._compiled=!0),n&&(l.functional=!0),i&&(l._scopeId=i),o?(u=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),r&&r.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(o)},l._ssrRegister=u):r&&(u=r),u){var f=l.functional,p=f?l.render:l.beforeCreate;f?(l._injectStyles=u,l.render=function(t,e){return u.call(e),p(t,e)}):l.beforeCreate=p?[].concat(p,u):[u]}return{esModule:a,exports:s,options:l}}}}); +//# sourceMappingURL=vendor.1489dda13598d34ee312.js.map \ No newline at end of file diff --git a/api-demos/vue-api-demo/src/main/resources/static/static/js/vendor.1489dda13598d34ee312.js.map b/api-demos/vue-api-demo/src/main/resources/static/static/js/vendor.1489dda13598d34ee312.js.map new file mode 100644 index 0000000..e7feb8c --- /dev/null +++ b/api-demos/vue-api-demo/src/main/resources/static/static/js/vendor.1489dda13598d34ee312.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/vue-router/dist/vue-router.esm.js","webpack:///./node_modules/vue/dist/vue.esm.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/vue-loader/lib/component-normalizer.js"],"names":["warn","condition","message","extend","a","b","key","encodeReserveRE","encodeReserveReplacer","c","charCodeAt","toString","commaRE","encode","str","encodeURIComponent","replace","decode","decodeURIComponent","err","castQueryParamValue","value","String","parseQuery","query","res","trim","split","forEach","param","parts","shift","val","length","join","undefined","Array","isArray","push","stringifyQuery","obj","Object","keys","map","result","val2","filter","x","trailingSlashRE","createRoute","record","location","redirectedFrom","router","options","clone","e","route","name","meta","path","hash","params","fullPath","getFullPath","matched","unshift","parent","formatMatch","freeze","START","ref","_stringifyQuery","isSameRoute","isObjectEqual","aKeys","sort","bKeys","every","i","aVal","bVal","handleRouteEntered","instances","instance","cbs","enteredCbs","i$1","_isBeingDestroyed","View","functional","props","type","default","render","_","children","data","routerView","h","$createElement","$route","cache","_routerViewCache","depth","inactive","_routerRoot","vnodeData","$vnode","keepAlive","_directInactive","_inactive","$parent","routerViewDepth","cachedData","cachedComponent","component","configProps","fillPropsinData","components","registerRouteInstance","vm","current","hook","prepatch","vnode","componentInstance","init","propsToPass","config","resolveProps","attrs","resolvePath","relative","base","append","firstChar","charAt","stack","pop","segments","segment","cleanPath","isarray","arr","prototype","call","pathToRegexp_1","pathToRegexp","parse_1","parse","compile_1","tokensToFunction","tokensToFunction_1","tokensToRegExp_1","tokensToRegExp","PATH_REGEXP","RegExp","tokens","index","defaultDelimiter","delimiter","exec","m","escaped","offset","slice","next","prefix","capture","group","modifier","asterisk","partial","repeat","optional","pattern","escapeGroup","escapeString","substr","encodeURIComponentPretty","encodeURI","toUpperCase","matches","flags","opts","pretty","token","TypeError","JSON","stringify","j","test","attachKeys","re","sensitive","strict","end","endsWithDelimiter","groups","source","match","regexpToRegexp","arrayToRegexp","stringToRegexp","compile","regexpCompileCache","create","fillParams","routeMsg","filler","pathMatch","normalizeLocation","raw","_normalized","params$1","rawPath","parsedPath","hashIndex","indexOf","queryIndex","parsePath","basePath","extraQuery","_parseQuery","parsedQuery","resolveQuery","_Vue","toTypes","eventTypes","noop","Link","to","required","tag","exact","Boolean","activeClass","exactActiveClass","ariaCurrentValue","event","this$1","this","$router","resolve","href","classes","globalActiveClass","linkActiveClass","globalExactActiveClass","linkExactActiveClass","activeClassFallback","exactActiveClassFallback","compareTarget","target","queryIncludes","isIncludedRoute","handler","guardEvent","on","click","class","scopedSlot","$scopedSlots","$hasNormal","navigate","isActive","isExactActive","aria-current","findAnchor","child","$slots","isStatic","aData","handler$1","event$1","aAttrs","metaKey","altKey","ctrlKey","shiftKey","defaultPrevented","button","currentTarget","getAttribute","preventDefault","install","Vue","installed","isDef","v","registerInstance","callVal","$options","_parentVnode","mixin","beforeCreate","_router","util","defineReactive","history","destroyed","defineProperty","get","_route","strats","optionMergeStrategies","beforeRouteEnter","beforeRouteLeave","beforeRouteUpdate","created","inBrowser","window","createRouteMap","routes","oldPathList","oldPathMap","oldNameMap","pathList","pathMap","nameMap","addRouteRecord","matchAs","pathToRegexpOptions","normalizedPath","normalizePath","caseSensitive","regex","compileRouteRegex","redirect","beforeEnter","childMatchAs","alias","aliases","aliasRoute","l","splice","createMatcher","currentRoute","_createRoute","paramNames","record$1","matchRoute","originalRedirect","hasOwnProperty","resolveRecordPath","aliasedMatch","aliasedRecord","addRoutes","len","Time","performance","now","Date","genStateKey","toFixed","_key","getStateKey","setStateKey","positionStore","setupScroll","scrollRestoration","protocolAndPath","protocol","host","absolutePath","stateCopy","state","replaceState","addEventListener","handlePopState","removeEventListener","handleScroll","from","isPop","app","behavior","scrollBehavior","$nextTick","position","getScrollPosition","shouldScroll","then","scrollToPosition","catch","saveScrollPosition","pageXOffset","y","pageYOffset","isValidPosition","isNumber","normalizePosition","hashStartsWithNumberRE","isObject","selector","el","document","getElementById","querySelector","docRect","documentElement","getBoundingClientRect","elRect","left","top","getElementPosition","style","scrollTo","ua","supportsPushState","navigator","userAgent","pushState","url","runQueue","queue","fn","cb","step","NavigationFailureType","redirected","aborted","cancelled","duplicated","createNavigationRedirectedError","createRouterError","propertiesToLog","createNavigationCancelledError","error","Error","_isRouter","isError","isNavigationFailure","errorType","resolveAsyncComponents","hasAsync","pending","flatMapComponents","def","cid","once","resolvedDef","__esModule","hasSymbol","Symbol","toStringTag","resolved","reject","reason","msg","comp","flatten","concat","apply","called","args","arguments","History","baseEl","normalizeBase","ready","readyCbs","readyErrorCbs","errorCbs","listeners","extractGuards","records","bind","reverse","guards","guard","extractGuard","bindGuard","listen","onReady","errorCb","onError","transitionTo","onComplete","onAbort","prev","confirmTransition","updateRoute","ensureURL","afterHooks","abort","console","lastRouteIndex","lastCurrentIndex","max","Math","updated","activated","deactivated","resolveQueue","iterator","createNavigationAbortedError","extractLeaveGuards","beforeHooks","extractUpdateHooks","bindEnterGuard","extractEnterGuards","resolveHooks","setupListeners","teardown","cleanupListener","HTML5History","_startLocation","getLocation","__proto__","constructor","expectScroll","supportsScroll","handleRoutingEvent","go","n","fromRoute","getCurrentLocation","pathname","toLowerCase","search","HashHistory","fallback","checkFallback","ensureSlash","getHash","replaceHash","eventType","pushHash","getUrl","AbstractHistory","targetIndex","VueRouter","apps","matcher","mode","prototypeAccessors","configurable","registerHook","list","$once","routeOrError","handleInitialScroll","beforeEach","beforeResolve","afterEach","Promise","back","forward","getMatchedComponents","createHref","normalizedTo","defineProperties","version","use","__webpack_exports__","global","emptyObject","isUndef","isTrue","isPrimitive","_toString","isPlainObject","isRegExp","isValidArrayIndex","parseFloat","floor","isFinite","isPromise","toNumber","isNaN","makeMap","expectsLowerCase","isBuiltInTag","isReservedAttribute","remove","item","hasOwn","cached","camelizeRE","camelize","capitalize","hyphenateRE","hyphenate","Function","ctx","boundFn","_length","toArray","start","ret","_from","toObject","no","identity","looseEqual","isObjectA","isObjectB","isArrayA","isArrayB","getTime","keysA","keysB","looseIndexOf","SSR_ATTR","ASSET_TYPES","LIFECYCLE_HOOKS","silent","productionTip","devtools","errorHandler","warnHandler","ignoredElements","keyCodes","isReservedTag","isReservedAttr","isUnknownElement","getTagNamespace","parsePlatformTagName","mustUseProp","async","_lifecycleHooks","unicodeRegExp","isReserved","enumerable","writable","bailRE","_isServer","hasProto","inWeex","WXEnvironment","platform","weexPlatform","UA","isIE","isIE9","isEdge","isIOS","isFF","nativeWatch","watch","supportsPassive","isServerRendering","env","VUE_ENV","__VUE_DEVTOOLS_GLOBAL_HOOK__","isNative","Ctor","_Set","Reflect","ownKeys","Set","set","has","add","clear","uid","Dep","id","subs","addSub","sub","removeSub","depend","addDep","notify","update","targetStack","pushTarget","popTarget","VNode","text","elm","context","componentOptions","asyncFactory","ns","fnContext","fnOptions","fnScopeId","isRootInsert","isComment","isCloned","isOnce","asyncMeta","isAsyncPlaceholder","createEmptyVNode","node","createTextVNode","cloneVNode","cloned","arrayProto","arrayMethods","method","original","inserted","ob","__ob__","observeArray","dep","arrayKeys","getOwnPropertyNames","shouldObserve","toggleObserving","Observer","src","vmCount","copyAugment","walk","observe","asRootData","isExtensible","_isVue","defineReactive$$1","customSetter","shallow","property","getOwnPropertyDescriptor","getter","setter","childOb","dependArray","newVal","del","items","mergeData","toVal","fromVal","mergeDataOrFn","parentVal","childVal","instanceData","defaultData","mergeHook","hooks","dedupeHooks","mergeAssets","key$1","methods","inject","computed","provide","defaultStrat","mergeOptions","normalizeProps","normalized","normalizeInject","dirs","directives","def$$1","normalizeDirectives","_base","extends","mixins","mergeField","strat","resolveAsset","warnMissing","assets","camelizedId","PascalCaseId","validateProp","propOptions","propsData","prop","absent","booleanIndex","getTypeIndex","stringIndex","_props","getType","getPropDefaultValue","prevShouldObserve","isSameType","expectedTypes","handleError","info","cur","errorCaptured","globalHandleError","invokeWithErrorHandling","_handled","logError","timerFunc","isUsingMicroTask","callbacks","flushCallbacks","copies","p","setTimeout","MutationObserver","setImmediate","counter","observer","textNode","createTextNode","characterData","nextTick","_resolve","seenObjects","traverse","_traverse","seen","isA","isFrozen","depId","normalizeEvent","passive","once$$1","createFnInvoker","fns","invoker","arguments$1","updateListeners","oldOn","remove$$1","createOnceHandler","old","mergeVNodeHook","hookKey","oldHook","wrappedHook","merged","checkProp","preserve","normalizeChildren","normalizeArrayChildren","nestedIndex","lastIndex","last","isTextNode","_isVList","resolveInject","provideKey","_provided","provideDefault","resolveSlots","slots","slot","name$1","isWhitespace","normalizeScopedSlots","normalSlots","prevSlots","hasNormalSlots","isStable","$stable","$key","normalizeScopedSlot","key$2","proxyNormalSlot","proxy","renderList","done","renderSlot","bindObject","nodes","scopedSlotFn","resolveFilter","isKeyNotMatch","expect","actual","checkKeyCodes","eventKeyCode","builtInKeyCode","eventKeyName","builtInKeyName","mappedKeyCode","bindObjectProps","asProp","isSync","loop","domProps","camelizedKey","hyphenatedKey","$event","renderStatic","isInFor","_staticTrees","tree","markStatic","staticRenderFns","_renderProxy","markOnce","markStaticNode","bindObjectListeners","existing","ours","resolveScopedSlots","hasDynamicKeys","contentHashKey","bindDynamicKeys","baseObj","values","prependModifier","symbol","installRenderHelpers","_o","_n","_s","_l","_t","_q","_i","_m","_f","_k","_b","_v","_e","_u","_g","_d","_p","FunctionalRenderContext","contextVm","_original","isCompiled","_compiled","needNormalization","injections","scopedSlots","_scopeId","_c","d","createElement","cloneAndMarkFunctionalResult","renderContext","mergeProps","componentVNodeHooks","hydrating","_isDestroyed","mountedNode","_isComponent","inlineTemplate","createComponentInstanceForVnode","activeInstance","$mount","oldVnode","parentVnode","renderChildren","newScopedSlots","oldScopedSlots","hasDynamicScopedSlot","needsForceUpdate","_renderChildren","_vnode","$attrs","$listeners","propKeys","_propKeys","oldListeners","_parentListeners","updateComponentListeners","$forceUpdate","updateChildComponent","insert","_isMounted","callHook","activatedChildren","activateChildComponent","destroy","deactivateChildComponent","direct","isInInactiveTree","$children","$destroy","hooksToMerge","createComponent","baseCtor","factory","errorComp","owner","currentRenderingInstance","owners","loading","loadingComp","sync","timerLoading","timerTimeout","$on","forceRender","renderCompleted","clearTimeout","ensureCtor","delay","timeout","resolveAsyncComponent","createAsyncPlaceholder","resolveConstructorOptions","model","callback","transformModel","extractPropsFromVNodeData","vnodes","createFunctionalComponent","nativeOn","abstract","toMerge","_merged","mergeHook$1","installComponentHooks","f1","f2","SIMPLE_NORMALIZE","ALWAYS_NORMALIZE","normalizationType","alwaysNormalize","is","simpleNormalizeChildren","pre","applyNS","force","registerDeepBindings","_createElement","getFirstComponentChild","remove$1","$off","_target","onceHandler","setActiveInstance","prevActiveInstance","handlers","_hasHookEvent","$emit","waiting","flushing","currentFlushTimestamp","getNow","createEvent","timeStamp","flushSchedulerQueue","watcher","before","run","activatedQueue","updatedQueue","callActivatedHooks","_watcher","callUpdatedHooks","emit","uid$2","Watcher","expOrFn","isRenderWatcher","_watchers","deep","user","lazy","active","dirty","deps","newDeps","depIds","newDepIds","expression","cleanupDeps","tmp","queueWatcher","oldValue","evaluate","sharedPropertyDefinition","sourceKey","initState","propsOptions","isRoot","initProps","initMethods","_data","getData","initData","watchers","_computedWatchers","isSSR","userDef","computedWatcherOptions","defineComputed","initComputed","createWatcher","initWatch","shouldCache","createComputedGetter","createGetterInvoker","$watch","uid$3","super","superOptions","modifiedOptions","modified","latest","sealed","sealedOptions","resolveModifiedOptions","extendOptions","_init","initExtend","Super","SuperId","cachedCtors","_Ctor","Sub","Comp","initProps$1","initComputed$1","getComponentName","pruneCache","keepAliveInstance","cachedNode","pruneCacheEntry","cached$$1","_uid","vnodeComponentOptions","_componentTag","initInternalComponent","_self","$root","$refs","initLifecycle","_events","initEvents","parentData","initRender","initInjections","initProvide","initMixin","dataDef","propsDef","$set","$delete","immediate","stateMixin","hookRE","eventsMixin","_update","prevEl","$el","prevVnode","restoreActiveInstance","__patch__","__vue__","lifecycleMixin","_render","renderMixin","patternTypes","builtInComponents","KeepAlive","include","exclude","Number","mounted","parseInt","configDef","delete","observable","plugin","installedPlugins","_installedPlugins","initUse","initMixin$1","definition","initAssetRegisters","initGlobalAPI","ssrContext","acceptValue","attr","isEnumeratedAttr","isValidContentEditableValue","convertEnumeratedValue","isFalsyAttrValue","isBooleanAttr","xlinkNS","isXlink","getXlinkProp","genClassForVnode","parentNode","childNode","mergeClassData","staticClass","dynamicClass","stringifyClass","renderClass","stringified","stringifyArray","stringifyObject","namespaceMap","svg","math","isHTMLTag","isSVG","unknownElementCache","isTextInputType","selected","nodeOps","tagName","multiple","setAttribute","createElementNS","namespace","createComment","insertBefore","newNode","referenceNode","removeChild","appendChild","nextSibling","setTextContent","textContent","setStyleScope","scopeId","registerRef","isRemoval","refs","refInFor","emptyNode","sameVnode","typeA","typeB","sameInputType","createKeyToOldIdx","beginIdx","endIdx","updateDirectives","oldDir","dir","isCreate","isDestroy","oldDirs","normalizeDirectives$1","newDirs","dirsWithInsert","dirsWithPostpatch","oldArg","arg","callHook$1","componentUpdated","callInsert","emptyModifiers","modifiers","getRawDirName","rawName","baseModules","updateAttrs","inheritAttrs","oldAttrs","setAttr","removeAttributeNS","removeAttribute","baseSetAttr","setAttributeNS","__ieph","blocker","stopImmediatePropagation","updateClass","oldData","cls","transitionClass","_transitionClasses","_prevClass","chr","index$1","expressionPos","expressionEndPos","klass","validDivisionCharRE","parseFilters","exp","filters","inSingle","inDouble","inTemplateString","inRegex","curly","square","paren","lastFilterIndex","pushFilter","wrapFilter","baseWarn","range","pluckModuleFunction","modules","addProp","dynamic","rangeSetItem","plain","addAttr","dynamicAttrs","addRawAttr","attrsMap","attrsList","addDirective","isDynamicArg","prependModifierMarker","addHandler","important","events","right","middle","native","nativeEvents","newHandler","getRawBindingAttr","rawAttrsMap","getBindingAttr","getStatic","dynamicValue","getAndRemoveAttr","staticValue","removeFromMap","getAndRemoveAttrByRegex","genComponentModel","number","valueExpression","assignment","genAssignmentCode","lastIndexOf","eof","isStringStart","parseString","parseBracket","parseModel","inBracket","stringQuote","target$1","RANGE_TOKEN","CHECKBOX_RADIO_TOKEN","createOnceHandler$1","remove$2","useMicrotaskFix","add$1","attachedTimestamp","_wrapper","ownerDocument","updateDOMListeners","change","normalizeEvents","svgContainer","updateDOMProps","oldProps","childNodes","_value","strCur","shouldUpdateValue","innerHTML","firstChild","checkVal","composing","notInFocus","activeElement","isNotInFocusAndDirty","_vModifiers","isDirtyWithModifiers","parseStyleText","cssText","propertyDelimiter","normalizeStyleData","normalizeStyleBinding","staticStyle","bindingStyle","emptyStyle","cssVarRE","importantRE","setProp","setProperty","normalizedName","normalize","vendorNames","capName","updateStyle","oldStaticStyle","oldStyleBinding","normalizedStyle","oldStyle","newStyle","checkChild","styleData","getStyle","whitespaceRE","addClass","classList","removeClass","tar","resolveTransition","css","autoCssTransition","enterClass","enterToClass","enterActiveClass","leaveClass","leaveToClass","leaveActiveClass","hasTransition","TRANSITION","ANIMATION","transitionProp","transitionEndEvent","animationProp","animationEndEvent","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","raf","requestAnimationFrame","nextFrame","addTransitionClass","transitionClasses","removeTransitionClass","whenTransitionEnds","expectedType","getTransitionInfo","propCount","ended","onEnd","transformRE","styles","getComputedStyle","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","durations","toMs","s","enter","toggleDisplay","_leaveCb","transition","_enterCb","nodeType","appearClass","appearToClass","appearActiveClass","afterEnter","enterCancelled","beforeAppear","appear","afterAppear","appearCancelled","duration","transitionNode","isAppear","startClass","toClass","beforeEnterHook","enterHook","afterEnterHook","enterCancelledHook","explicitEnterDuration","expectsCSS","userWantsControl","getHookArgumentsLength","show","pendingNode","_pending","isValidDuration","leave","rm","beforeLeave","afterLeave","leaveCancelled","delayLeave","explicitLeaveDuration","performLeave","invokerFns","_enter","patch","backend","removeNode","createElm","insertedVnodeQueue","parentElm","refElm","nested","ownerArray","isReactivated","initComponent","innerNode","activate","reactivateComponent","setScope","createChildren","invokeCreateHooks","pendingInsert","isPatchable","ref$$1","ancestor","addVnodes","startIdx","invokeDestroyHook","removeVnodes","ch","removeAndInvokeRemoveHook","childElm","createRmCb","findIdxInOld","oldCh","patchVnode","removeOnly","hydrate","newCh","oldKeyToIdx","idxInOld","vnodeToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","canMove","updateChildren","postpatch","invokeInsertHook","initial","isRenderedModule","inVPre","hasChildNodes","childrenMatch","fullInvoke","isInitialPatch","isRealElement","hasAttribute","oldElm","patchable","i$2","createPatchFunction","vmodel","trigger","directive","binding","_vOptions","setSelected","getValue","onCompositionStart","onCompositionEnd","prevOptions","curOptions","some","o","hasNoMatchingOption","actuallySetSelected","isMultiple","option","selectedIndex","initEvent","dispatchEvent","locateNode","platformDirectives","transition$$1","originalDisplay","__vOriginalDisplay","display","unbind","transitionProps","getRealChild","compOptions","extractTransitionData","placeholder","rawChild","isNotTextNode","isVShowDirective","Transition","hasParentTransition","_leaving","oldRawChild","oldChild","isSameChild","delayedLeave","moveClass","callPendingCbs","_moveCb","recordPosition","newPos","applyTranslation","oldPos","pos","dx","dy","moved","transform","WebkitTransform","transitionDuration","platformComponents","TransitionGroup","beforeMount","kept","prevChildren","rawChildren","transitionData","removed","c$1","hasMove","_reflow","body","offsetHeight","propertyName","_hasMove","cloneNode","HTMLUnknownElement","HTMLElement","mountComponent","defaultTagRE","regexEscapeRE","buildRegex","delimiters","open","close","parseText","tagRE","tokenValue","rawTokens","@binding","klass$1","staticKeys","transformNode","classBinding","genData","decoder","style$1","styleBinding","he","html","isUnaryTag","canBeLeftOpenTag","isNonPhrasingTag","attribute","dynamicArgAttribute","ncname","qnameCapture","startTagOpen","startTagClose","endTag","doctype","comment","conditionalComment","isPlainTextElement","reCache","decodingMap","<",">",""","&"," "," ","'","encodedAttr","encodedAttrWithNewLines","isIgnoreNewlineTag","shouldIgnoreFirstNewline","decodeAttr","shouldDecodeNewlines","warn$2","transforms","preTransforms","postTransforms","platformIsPreTag","platformMustUseProp","platformGetTagNamespace","onRE","dirRE","forAliasRE","forIteratorRE","stripParensRE","dynamicArgRE","argRE","bindRE","modifierRE","slotRE","lineBreakRE","whitespaceRE$1","decodeHTMLCached","emptySlotScopeToken","createASTElement","makeAttrsMap","template","isPreTag","root","currentParent","preserveWhitespace","whitespaceOption","whitespace","inPre","closeElement","element","trimEndingWhitespace","processed","processElement","if","elseif","else","addIfCondition","block","forbidden","findPrevElement","slotScope","slotTarget","lastNode","lastTag","expectHTML","isUnaryTag$$1","canBeLeftOpenTag$$1","endTagLength","stackedTag","reStackedTag","rest$1","all","chars","parseEndTag","textEnd","commentEnd","shouldKeepComment","substring","advance","conditionalEnd","doctypeMatch","endTagMatch","curIndex","startTagMatch","parseStartTag","handleStartTag","rest","unarySlash","unary","shouldDecodeNewlinesForHref","lowerCasedTag","lowerCasedTagName","parseHTML","comments","outputSourceRange","start$1","ieNSBug","ieNSPrefix","guardIESVGBug","processPre","processRawAttrs","processFor","processIf","processOnce","end$1","processKey","for","checkInFor","slotTargetDynamic","slotBinding","getSlotName","slotBinding$1","ref$1","dynamic$1","slotContainer","processSlotContent","slotName","processSlotOutlet","processComponent","syncGen","isDynamic","hasBindings","parseModifiers","camel","argMatch","processAttrs","inMatch","iteratorMatch","iterator1","iterator2","parseFor","ifConditions","cloneASTElement","modules$1","preTransformNode","typeBinding","ifCondition","ifConditionExtra","hasElse","elseIfCondition","branch0","branch1","branch2","isStaticKey","isPlatformReservedTag","baseOptions","_warn","code","genSelect","valueBinding","trueValueBinding","falseValueBinding","genCheckboxModel","genRadioModel","needCompositionGuard","genDefaultModel","reduce","genStaticKeys","genStaticKeysCached","optimize","markStatic$1","static","isDirectChildOfTemplateFor","l$1","markStaticRoots","staticInFor","staticRoot","fnExpRE","fnInvokeRE","simplePathRE","esc","tab","space","up","down","keyNames","genGuard","modifierCode","stop","prevent","self","ctrl","alt","genHandlers","staticHandlers","dynamicHandlers","handlerCode","genHandler","isMethodPath","isFunctionExpression","isFunctionInvocation","genModifierCode","keyModifier","genFilterCode","genKeyFilter","keyVal","keyCode","keyName","baseDirectives","wrapListeners","wrapData","cloak","CodegenState","dataGenFns","maybeComponent","onceId","generate","ast","genElement","staticProcessed","genStatic","onceProcessed","genOnce","forProcessed","genFor","ifProcessed","genIf","genChildren","genProps","bind$$1","genSlot","componentName","genData$2","genComponent","originalPreState","altGen","altEmpty","genIfConditions","conditions","genTernaryExp","altHelper","needRuntime","hasRuntime","gen","genDirectives","containsSlotChild","needsKey","generatedSlots","genScopedSlot","inlineRenderFns","genInlineTemplate","isLegacySyntax","reverseProxy","checkSkip","altGenElement","altGenNode","el$1","normalizationType$1","needsNormalization","getNormalizationType","genNode","transformSpecialNewlines","staticProps","dynamicProps","createFunction","errors","createCompileToFunctionFn","compiled","fnGenErrors","baseCompile","div","finalOptions","tips","tip","compileToFunctions","getShouldDecode","idToTemplate","mount","outerHTML","container","getOuterHTML","g","eval","module","exports","rawScriptExports","compiledTemplate","functionalTemplate","injectStyles","moduleIdentifier","esModule","scriptExports","__VUE_SSR_CONTEXT__","_registeredComponents","_ssrRegister","_injectStyles"],"mappings":"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","file":"static/js/vendor.1489dda13598d34ee312.js","sourcesContent":["/*!\n * vue-router v3.4.9\n * (c) 2020 Evan You\n * @license MIT\n */\n/* */\n\nfunction assert (condition, message) {\n if (!condition) {\n throw new Error((\"[vue-router] \" + message))\n }\n}\n\nfunction warn (condition, message) {\n if (process.env.NODE_ENV !== 'production' && !condition) {\n typeof console !== 'undefined' && console.warn((\"[vue-router] \" + message));\n }\n}\n\nfunction extend (a, b) {\n for (var key in b) {\n a[key] = b[key];\n }\n return a\n}\n\n/* */\n\nvar encodeReserveRE = /[!'()*]/g;\nvar encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); };\nvar commaRE = /%2C/g;\n\n// fixed encodeURIComponent which is more conformant to RFC3986:\n// - escapes [!'()*]\n// - preserve commas\nvar encode = function (str) { return encodeURIComponent(str)\n .replace(encodeReserveRE, encodeReserveReplacer)\n .replace(commaRE, ','); };\n\nfunction decode (str) {\n try {\n return decodeURIComponent(str)\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n warn(false, (\"Error decoding \\\"\" + str + \"\\\". Leaving it intact.\"));\n }\n }\n return str\n}\n\nfunction resolveQuery (\n query,\n extraQuery,\n _parseQuery\n) {\n if ( extraQuery === void 0 ) extraQuery = {};\n\n var parse = _parseQuery || parseQuery;\n var parsedQuery;\n try {\n parsedQuery = parse(query || '');\n } catch (e) {\n process.env.NODE_ENV !== 'production' && warn(false, e.message);\n parsedQuery = {};\n }\n for (var key in extraQuery) {\n var value = extraQuery[key];\n parsedQuery[key] = Array.isArray(value)\n ? value.map(castQueryParamValue)\n : castQueryParamValue(value);\n }\n return parsedQuery\n}\n\nvar castQueryParamValue = function (value) { return (value == null || typeof value === 'object' ? value : String(value)); };\n\nfunction parseQuery (query) {\n var res = {};\n\n query = query.trim().replace(/^(\\?|#|&)/, '');\n\n if (!query) {\n return res\n }\n\n query.split('&').forEach(function (param) {\n var parts = param.replace(/\\+/g, ' ').split('=');\n var key = decode(parts.shift());\n var val = parts.length > 0 ? decode(parts.join('=')) : null;\n\n if (res[key] === undefined) {\n res[key] = val;\n } else if (Array.isArray(res[key])) {\n res[key].push(val);\n } else {\n res[key] = [res[key], val];\n }\n });\n\n return res\n}\n\nfunction stringifyQuery (obj) {\n var res = obj\n ? Object.keys(obj)\n .map(function (key) {\n var val = obj[key];\n\n if (val === undefined) {\n return ''\n }\n\n if (val === null) {\n return encode(key)\n }\n\n if (Array.isArray(val)) {\n var result = [];\n val.forEach(function (val2) {\n if (val2 === undefined) {\n return\n }\n if (val2 === null) {\n result.push(encode(key));\n } else {\n result.push(encode(key) + '=' + encode(val2));\n }\n });\n return result.join('&')\n }\n\n return encode(key) + '=' + encode(val)\n })\n .filter(function (x) { return x.length > 0; })\n .join('&')\n : null;\n return res ? (\"?\" + res) : ''\n}\n\n/* */\n\nvar trailingSlashRE = /\\/?$/;\n\nfunction createRoute (\n record,\n location,\n redirectedFrom,\n router\n) {\n var stringifyQuery = router && router.options.stringifyQuery;\n\n var query = location.query || {};\n try {\n query = clone(query);\n } catch (e) {}\n\n var route = {\n name: location.name || (record && record.name),\n meta: (record && record.meta) || {},\n path: location.path || '/',\n hash: location.hash || '',\n query: query,\n params: location.params || {},\n fullPath: getFullPath(location, stringifyQuery),\n matched: record ? formatMatch(record) : []\n };\n if (redirectedFrom) {\n route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery);\n }\n return Object.freeze(route)\n}\n\nfunction clone (value) {\n if (Array.isArray(value)) {\n return value.map(clone)\n } else if (value && typeof value === 'object') {\n var res = {};\n for (var key in value) {\n res[key] = clone(value[key]);\n }\n return res\n } else {\n return value\n }\n}\n\n// the starting route that represents the initial state\nvar START = createRoute(null, {\n path: '/'\n});\n\nfunction formatMatch (record) {\n var res = [];\n while (record) {\n res.unshift(record);\n record = record.parent;\n }\n return res\n}\n\nfunction getFullPath (\n ref,\n _stringifyQuery\n) {\n var path = ref.path;\n var query = ref.query; if ( query === void 0 ) query = {};\n var hash = ref.hash; if ( hash === void 0 ) hash = '';\n\n var stringify = _stringifyQuery || stringifyQuery;\n return (path || '/') + stringify(query) + hash\n}\n\nfunction isSameRoute (a, b) {\n if (b === START) {\n return a === b\n } else if (!b) {\n return false\n } else if (a.path && b.path) {\n return (\n a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') &&\n a.hash === b.hash &&\n isObjectEqual(a.query, b.query)\n )\n } else if (a.name && b.name) {\n return (\n a.name === b.name &&\n a.hash === b.hash &&\n isObjectEqual(a.query, b.query) &&\n isObjectEqual(a.params, b.params)\n )\n } else {\n return false\n }\n}\n\nfunction isObjectEqual (a, b) {\n if ( a === void 0 ) a = {};\n if ( b === void 0 ) b = {};\n\n // handle null value #1566\n if (!a || !b) { return a === b }\n var aKeys = Object.keys(a).sort();\n var bKeys = Object.keys(b).sort();\n if (aKeys.length !== bKeys.length) {\n return false\n }\n return aKeys.every(function (key, i) {\n var aVal = a[key];\n var bKey = bKeys[i];\n if (bKey !== key) { return false }\n var bVal = b[key];\n // query values can be null and undefined\n if (aVal == null || bVal == null) { return aVal === bVal }\n // check nested equality\n if (typeof aVal === 'object' && typeof bVal === 'object') {\n return isObjectEqual(aVal, bVal)\n }\n return String(aVal) === String(bVal)\n })\n}\n\nfunction isIncludedRoute (current, target) {\n return (\n current.path.replace(trailingSlashRE, '/').indexOf(\n target.path.replace(trailingSlashRE, '/')\n ) === 0 &&\n (!target.hash || current.hash === target.hash) &&\n queryIncludes(current.query, target.query)\n )\n}\n\nfunction queryIncludes (current, target) {\n for (var key in target) {\n if (!(key in current)) {\n return false\n }\n }\n return true\n}\n\nfunction handleRouteEntered (route) {\n for (var i = 0; i < route.matched.length; i++) {\n var record = route.matched[i];\n for (var name in record.instances) {\n var instance = record.instances[name];\n var cbs = record.enteredCbs[name];\n if (!instance || !cbs) { continue }\n delete record.enteredCbs[name];\n for (var i$1 = 0; i$1 < cbs.length; i$1++) {\n if (!instance._isBeingDestroyed) { cbs[i$1](instance); }\n }\n }\n }\n}\n\nvar View = {\n name: 'RouterView',\n functional: true,\n props: {\n name: {\n type: String,\n default: 'default'\n }\n },\n render: function render (_, ref) {\n var props = ref.props;\n var children = ref.children;\n var parent = ref.parent;\n var data = ref.data;\n\n // used by devtools to display a router-view badge\n data.routerView = true;\n\n // directly use parent context's createElement() function\n // so that components rendered by router-view can resolve named slots\n var h = parent.$createElement;\n var name = props.name;\n var route = parent.$route;\n var cache = parent._routerViewCache || (parent._routerViewCache = {});\n\n // determine current view depth, also check to see if the tree\n // has been toggled inactive but kept-alive.\n var depth = 0;\n var inactive = false;\n while (parent && parent._routerRoot !== parent) {\n var vnodeData = parent.$vnode ? parent.$vnode.data : {};\n if (vnodeData.routerView) {\n depth++;\n }\n if (vnodeData.keepAlive && parent._directInactive && parent._inactive) {\n inactive = true;\n }\n parent = parent.$parent;\n }\n data.routerViewDepth = depth;\n\n // render previous view if the tree is inactive and kept-alive\n if (inactive) {\n var cachedData = cache[name];\n var cachedComponent = cachedData && cachedData.component;\n if (cachedComponent) {\n // #2301\n // pass props\n if (cachedData.configProps) {\n fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps);\n }\n return h(cachedComponent, data, children)\n } else {\n // render previous empty view\n return h()\n }\n }\n\n var matched = route.matched[depth];\n var component = matched && matched.components[name];\n\n // render empty node if no matched route or no config component\n if (!matched || !component) {\n cache[name] = null;\n return h()\n }\n\n // cache component\n cache[name] = { component: component };\n\n // attach instance registration hook\n // this will be called in the instance's injected lifecycle hooks\n data.registerRouteInstance = function (vm, val) {\n // val could be undefined for unregistration\n var current = matched.instances[name];\n if (\n (val && current !== vm) ||\n (!val && current === vm)\n ) {\n matched.instances[name] = val;\n }\n }\n\n // also register instance in prepatch hook\n // in case the same component instance is reused across different routes\n ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) {\n matched.instances[name] = vnode.componentInstance;\n };\n\n // register instance in init hook\n // in case kept-alive component be actived when routes changed\n data.hook.init = function (vnode) {\n if (vnode.data.keepAlive &&\n vnode.componentInstance &&\n vnode.componentInstance !== matched.instances[name]\n ) {\n matched.instances[name] = vnode.componentInstance;\n }\n\n // if the route transition has already been confirmed then we weren't\n // able to call the cbs during confirmation as the component was not\n // registered yet, so we call it here.\n handleRouteEntered(route);\n };\n\n var configProps = matched.props && matched.props[name];\n // save route and configProps in cache\n if (configProps) {\n extend(cache[name], {\n route: route,\n configProps: configProps\n });\n fillPropsinData(component, data, route, configProps);\n }\n\n return h(component, data, children)\n }\n};\n\nfunction fillPropsinData (component, data, route, configProps) {\n // resolve props\n var propsToPass = data.props = resolveProps(route, configProps);\n if (propsToPass) {\n // clone to prevent mutation\n propsToPass = data.props = extend({}, propsToPass);\n // pass non-declared props as attrs\n var attrs = data.attrs = data.attrs || {};\n for (var key in propsToPass) {\n if (!component.props || !(key in component.props)) {\n attrs[key] = propsToPass[key];\n delete propsToPass[key];\n }\n }\n }\n}\n\nfunction resolveProps (route, config) {\n switch (typeof config) {\n case 'undefined':\n return\n case 'object':\n return config\n case 'function':\n return config(route)\n case 'boolean':\n return config ? route.params : undefined\n default:\n if (process.env.NODE_ENV !== 'production') {\n warn(\n false,\n \"props in \\\"\" + (route.path) + \"\\\" is a \" + (typeof config) + \", \" +\n \"expecting an object, function or boolean.\"\n );\n }\n }\n}\n\n/* */\n\nfunction resolvePath (\n relative,\n base,\n append\n) {\n var firstChar = relative.charAt(0);\n if (firstChar === '/') {\n return relative\n }\n\n if (firstChar === '?' || firstChar === '#') {\n return base + relative\n }\n\n var stack = base.split('/');\n\n // remove trailing segment if:\n // - not appending\n // - appending to trailing slash (last segment is empty)\n if (!append || !stack[stack.length - 1]) {\n stack.pop();\n }\n\n // resolve relative path\n var segments = relative.replace(/^\\//, '').split('/');\n for (var i = 0; i < segments.length; i++) {\n var segment = segments[i];\n if (segment === '..') {\n stack.pop();\n } else if (segment !== '.') {\n stack.push(segment);\n }\n }\n\n // ensure leading slash\n if (stack[0] !== '') {\n stack.unshift('');\n }\n\n return stack.join('/')\n}\n\nfunction parsePath (path) {\n var hash = '';\n var query = '';\n\n var hashIndex = path.indexOf('#');\n if (hashIndex >= 0) {\n hash = path.slice(hashIndex);\n path = path.slice(0, hashIndex);\n }\n\n var queryIndex = path.indexOf('?');\n if (queryIndex >= 0) {\n query = path.slice(queryIndex + 1);\n path = path.slice(0, queryIndex);\n }\n\n return {\n path: path,\n query: query,\n hash: hash\n }\n}\n\nfunction cleanPath (path) {\n return path.replace(/\\/\\//g, '/')\n}\n\nvar isarray = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n/**\n * Expose `pathToRegexp`.\n */\nvar pathToRegexp_1 = pathToRegexp;\nvar parse_1 = parse;\nvar compile_1 = compile;\nvar tokensToFunction_1 = tokensToFunction;\nvar tokensToRegExp_1 = tokensToRegExp;\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g');\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = [];\n var key = 0;\n var index = 0;\n var path = '';\n var defaultDelimiter = options && options.delimiter || '/';\n var res;\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0];\n var escaped = res[1];\n var offset = res.index;\n path += str.slice(index, offset);\n index = offset + m.length;\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1];\n continue\n }\n\n var next = str[index];\n var prefix = res[2];\n var name = res[3];\n var capture = res[4];\n var group = res[5];\n var modifier = res[6];\n var asterisk = res[7];\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path);\n path = '';\n }\n\n var partial = prefix != null && next != null && next !== prefix;\n var repeat = modifier === '+' || modifier === '*';\n var optional = modifier === '?' || modifier === '*';\n var delimiter = res[2] || defaultDelimiter;\n var pattern = capture || group;\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n });\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index);\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path);\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length);\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options));\n }\n }\n\n return function (obj, opts) {\n var path = '';\n var data = obj || {};\n var options = opts || {};\n var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n path += token;\n\n continue\n }\n\n var value = data[token.name];\n var segment;\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix;\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j]);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment;\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment;\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys;\n return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {!Array} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g);\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n asterisk: false,\n pattern: null\n });\n }\n }\n\n return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = [];\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source);\n }\n\n var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));\n\n return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {!Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options);\n keys = [];\n }\n\n options = options || {};\n\n var strict = options.strict;\n var end = options.end !== false;\n var route = '';\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n route += escapeString(token);\n } else {\n var prefix = escapeString(token.prefix);\n var capture = '(?:' + token.pattern + ')';\n\n keys.push(token);\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*';\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?';\n } else {\n capture = prefix + '(' + capture + ')?';\n }\n } else {\n capture = prefix + '(' + capture + ')';\n }\n\n route += capture;\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/');\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';\n }\n\n if (end) {\n route += '$';\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options);\n keys = [];\n }\n\n options = options || {};\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\npathToRegexp_1.parse = parse_1;\npathToRegexp_1.compile = compile_1;\npathToRegexp_1.tokensToFunction = tokensToFunction_1;\npathToRegexp_1.tokensToRegExp = tokensToRegExp_1;\n\n/* */\n\n// $flow-disable-line\nvar regexpCompileCache = Object.create(null);\n\nfunction fillParams (\n path,\n params,\n routeMsg\n) {\n params = params || {};\n try {\n var filler =\n regexpCompileCache[path] ||\n (regexpCompileCache[path] = pathToRegexp_1.compile(path));\n\n // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }}\n // and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string\n if (typeof params.pathMatch === 'string') { params[0] = params.pathMatch; }\n\n return filler(params, { pretty: true })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n // Fix #3072 no warn if `pathMatch` is string\n warn(typeof params.pathMatch === 'string', (\"missing param for \" + routeMsg + \": \" + (e.message)));\n }\n return ''\n } finally {\n // delete the 0 if it was added\n delete params[0];\n }\n}\n\n/* */\n\nfunction normalizeLocation (\n raw,\n current,\n append,\n router\n) {\n var next = typeof raw === 'string' ? { path: raw } : raw;\n // named target\n if (next._normalized) {\n return next\n } else if (next.name) {\n next = extend({}, raw);\n var params = next.params;\n if (params && typeof params === 'object') {\n next.params = extend({}, params);\n }\n return next\n }\n\n // relative params\n if (!next.path && next.params && current) {\n next = extend({}, next);\n next._normalized = true;\n var params$1 = extend(extend({}, current.params), next.params);\n if (current.name) {\n next.name = current.name;\n next.params = params$1;\n } else if (current.matched.length) {\n var rawPath = current.matched[current.matched.length - 1].path;\n next.path = fillParams(rawPath, params$1, (\"path \" + (current.path)));\n } else if (process.env.NODE_ENV !== 'production') {\n warn(false, \"relative params navigation requires a current route.\");\n }\n return next\n }\n\n var parsedPath = parsePath(next.path || '');\n var basePath = (current && current.path) || '/';\n var path = parsedPath.path\n ? resolvePath(parsedPath.path, basePath, append || next.append)\n : basePath;\n\n var query = resolveQuery(\n parsedPath.query,\n next.query,\n router && router.options.parseQuery\n );\n\n var hash = next.hash || parsedPath.hash;\n if (hash && hash.charAt(0) !== '#') {\n hash = \"#\" + hash;\n }\n\n return {\n _normalized: true,\n path: path,\n query: query,\n hash: hash\n }\n}\n\n/* */\n\n// work around weird flow bug\nvar toTypes = [String, Object];\nvar eventTypes = [String, Array];\n\nvar noop = function () {};\n\nvar Link = {\n name: 'RouterLink',\n props: {\n to: {\n type: toTypes,\n required: true\n },\n tag: {\n type: String,\n default: 'a'\n },\n exact: Boolean,\n append: Boolean,\n replace: Boolean,\n activeClass: String,\n exactActiveClass: String,\n ariaCurrentValue: {\n type: String,\n default: 'page'\n },\n event: {\n type: eventTypes,\n default: 'click'\n }\n },\n render: function render (h) {\n var this$1 = this;\n\n var router = this.$router;\n var current = this.$route;\n var ref = router.resolve(\n this.to,\n current,\n this.append\n );\n var location = ref.location;\n var route = ref.route;\n var href = ref.href;\n\n var classes = {};\n var globalActiveClass = router.options.linkActiveClass;\n var globalExactActiveClass = router.options.linkExactActiveClass;\n // Support global empty active class\n var activeClassFallback =\n globalActiveClass == null ? 'router-link-active' : globalActiveClass;\n var exactActiveClassFallback =\n globalExactActiveClass == null\n ? 'router-link-exact-active'\n : globalExactActiveClass;\n var activeClass =\n this.activeClass == null ? activeClassFallback : this.activeClass;\n var exactActiveClass =\n this.exactActiveClass == null\n ? exactActiveClassFallback\n : this.exactActiveClass;\n\n var compareTarget = route.redirectedFrom\n ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router)\n : route;\n\n classes[exactActiveClass] = isSameRoute(current, compareTarget);\n classes[activeClass] = this.exact\n ? classes[exactActiveClass]\n : isIncludedRoute(current, compareTarget);\n\n var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null;\n\n var handler = function (e) {\n if (guardEvent(e)) {\n if (this$1.replace) {\n router.replace(location, noop);\n } else {\n router.push(location, noop);\n }\n }\n };\n\n var on = { click: guardEvent };\n if (Array.isArray(this.event)) {\n this.event.forEach(function (e) {\n on[e] = handler;\n });\n } else {\n on[this.event] = handler;\n }\n\n var data = { class: classes };\n\n var scopedSlot =\n !this.$scopedSlots.$hasNormal &&\n this.$scopedSlots.default &&\n this.$scopedSlots.default({\n href: href,\n route: route,\n navigate: handler,\n isActive: classes[activeClass],\n isExactActive: classes[exactActiveClass]\n });\n\n if (scopedSlot) {\n if (scopedSlot.length === 1) {\n return scopedSlot[0]\n } else if (scopedSlot.length > 1 || !scopedSlot.length) {\n if (process.env.NODE_ENV !== 'production') {\n warn(\n false,\n (\"RouterLink with to=\\\"\" + (this.to) + \"\\\" is trying to use a scoped slot but it didn't provide exactly one child. Wrapping the content with a span element.\")\n );\n }\n return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot)\n }\n }\n\n if (this.tag === 'a') {\n data.on = on;\n data.attrs = { href: href, 'aria-current': ariaCurrentValue };\n } else {\n // find the first child and apply listener and href\n var a = findAnchor(this.$slots.default);\n if (a) {\n // in case the is a static node\n a.isStatic = false;\n var aData = (a.data = extend({}, a.data));\n aData.on = aData.on || {};\n // transform existing events in both objects into arrays so we can push later\n for (var event in aData.on) {\n var handler$1 = aData.on[event];\n if (event in on) {\n aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1];\n }\n }\n // append new listeners for router-link\n for (var event$1 in on) {\n if (event$1 in aData.on) {\n // on[event] is always a function\n aData.on[event$1].push(on[event$1]);\n } else {\n aData.on[event$1] = handler;\n }\n }\n\n var aAttrs = (a.data.attrs = extend({}, a.data.attrs));\n aAttrs.href = href;\n aAttrs['aria-current'] = ariaCurrentValue;\n } else {\n // doesn't have child, apply listener to self\n data.on = on;\n }\n }\n\n return h(this.tag, data, this.$slots.default)\n }\n};\n\nfunction guardEvent (e) {\n // don't redirect with control keys\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return }\n // don't redirect when preventDefault called\n if (e.defaultPrevented) { return }\n // don't redirect on right click\n if (e.button !== undefined && e.button !== 0) { return }\n // don't redirect if `target=\"_blank\"`\n if (e.currentTarget && e.currentTarget.getAttribute) {\n var target = e.currentTarget.getAttribute('target');\n if (/\\b_blank\\b/i.test(target)) { return }\n }\n // this may be a Weex event which doesn't have this method\n if (e.preventDefault) {\n e.preventDefault();\n }\n return true\n}\n\nfunction findAnchor (children) {\n if (children) {\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.tag === 'a') {\n return child\n }\n if (child.children && (child = findAnchor(child.children))) {\n return child\n }\n }\n }\n}\n\nvar _Vue;\n\nfunction install (Vue) {\n if (install.installed && _Vue === Vue) { return }\n install.installed = true;\n\n _Vue = Vue;\n\n var isDef = function (v) { return v !== undefined; };\n\n var registerInstance = function (vm, callVal) {\n var i = vm.$options._parentVnode;\n if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {\n i(vm, callVal);\n }\n };\n\n Vue.mixin({\n beforeCreate: function beforeCreate () {\n if (isDef(this.$options.router)) {\n this._routerRoot = this;\n this._router = this.$options.router;\n this._router.init(this);\n Vue.util.defineReactive(this, '_route', this._router.history.current);\n } else {\n this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;\n }\n registerInstance(this, this);\n },\n destroyed: function destroyed () {\n registerInstance(this);\n }\n });\n\n Object.defineProperty(Vue.prototype, '$router', {\n get: function get () { return this._routerRoot._router }\n });\n\n Object.defineProperty(Vue.prototype, '$route', {\n get: function get () { return this._routerRoot._route }\n });\n\n Vue.component('RouterView', View);\n Vue.component('RouterLink', Link);\n\n var strats = Vue.config.optionMergeStrategies;\n // use the same hook merging strategy for route hooks\n strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created;\n}\n\n/* */\n\nvar inBrowser = typeof window !== 'undefined';\n\n/* */\n\nfunction createRouteMap (\n routes,\n oldPathList,\n oldPathMap,\n oldNameMap\n) {\n // the path list is used to control path matching priority\n var pathList = oldPathList || [];\n // $flow-disable-line\n var pathMap = oldPathMap || Object.create(null);\n // $flow-disable-line\n var nameMap = oldNameMap || Object.create(null);\n\n routes.forEach(function (route) {\n addRouteRecord(pathList, pathMap, nameMap, route);\n });\n\n // ensure wildcard routes are always at the end\n for (var i = 0, l = pathList.length; i < l; i++) {\n if (pathList[i] === '*') {\n pathList.push(pathList.splice(i, 1)[0]);\n l--;\n i--;\n }\n }\n\n if (process.env.NODE_ENV === 'development') {\n // warn if routes do not include leading slashes\n var found = pathList\n // check for missing leading slash\n .filter(function (path) { return path && path.charAt(0) !== '*' && path.charAt(0) !== '/'; });\n\n if (found.length > 0) {\n var pathNames = found.map(function (path) { return (\"- \" + path); }).join('\\n');\n warn(false, (\"Non-nested routes must include a leading slash character. Fix the following routes: \\n\" + pathNames));\n }\n }\n\n return {\n pathList: pathList,\n pathMap: pathMap,\n nameMap: nameMap\n }\n}\n\nfunction addRouteRecord (\n pathList,\n pathMap,\n nameMap,\n route,\n parent,\n matchAs\n) {\n var path = route.path;\n var name = route.name;\n if (process.env.NODE_ENV !== 'production') {\n assert(path != null, \"\\\"path\\\" is required in a route configuration.\");\n assert(\n typeof route.component !== 'string',\n \"route config \\\"component\\\" for path: \" + (String(\n path || name\n )) + \" cannot be a \" + \"string id. Use an actual component instead.\"\n );\n\n warn(\n // eslint-disable-next-line no-control-regex\n !/[^\\u0000-\\u007F]+/.test(path),\n \"Route with path \\\"\" + path + \"\\\" contains unencoded characters, make sure \" +\n \"your path is correctly encoded before passing it to the router. Use \" +\n \"encodeURI to encode static segments of your path.\"\n );\n }\n\n var pathToRegexpOptions =\n route.pathToRegexpOptions || {};\n var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict);\n\n if (typeof route.caseSensitive === 'boolean') {\n pathToRegexpOptions.sensitive = route.caseSensitive;\n }\n\n var record = {\n path: normalizedPath,\n regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),\n components: route.components || { default: route.component },\n instances: {},\n enteredCbs: {},\n name: name,\n parent: parent,\n matchAs: matchAs,\n redirect: route.redirect,\n beforeEnter: route.beforeEnter,\n meta: route.meta || {},\n props:\n route.props == null\n ? {}\n : route.components\n ? route.props\n : { default: route.props }\n };\n\n if (route.children) {\n // Warn if route is named, does not redirect and has a default child route.\n // If users navigate to this route by name, the default child will\n // not be rendered (GH Issue #629)\n if (process.env.NODE_ENV !== 'production') {\n if (\n route.name &&\n !route.redirect &&\n route.children.some(function (child) { return /^\\/?$/.test(child.path); })\n ) {\n warn(\n false,\n \"Named Route '\" + (route.name) + \"' has a default child route. \" +\n \"When navigating to this named route (:to=\\\"{name: '\" + (route.name) + \"'\\\"), \" +\n \"the default child route will not be rendered. Remove the name from \" +\n \"this route and use the name of the default child route for named \" +\n \"links instead.\"\n );\n }\n }\n route.children.forEach(function (child) {\n var childMatchAs = matchAs\n ? cleanPath((matchAs + \"/\" + (child.path)))\n : undefined;\n addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs);\n });\n }\n\n if (!pathMap[record.path]) {\n pathList.push(record.path);\n pathMap[record.path] = record;\n }\n\n if (route.alias !== undefined) {\n var aliases = Array.isArray(route.alias) ? route.alias : [route.alias];\n for (var i = 0; i < aliases.length; ++i) {\n var alias = aliases[i];\n if (process.env.NODE_ENV !== 'production' && alias === path) {\n warn(\n false,\n (\"Found an alias with the same value as the path: \\\"\" + path + \"\\\". You have to remove that alias. It will be ignored in development.\")\n );\n // skip in dev to make it work\n continue\n }\n\n var aliasRoute = {\n path: alias,\n children: route.children\n };\n addRouteRecord(\n pathList,\n pathMap,\n nameMap,\n aliasRoute,\n parent,\n record.path || '/' // matchAs\n );\n }\n }\n\n if (name) {\n if (!nameMap[name]) {\n nameMap[name] = record;\n } else if (process.env.NODE_ENV !== 'production' && !matchAs) {\n warn(\n false,\n \"Duplicate named routes definition: \" +\n \"{ name: \\\"\" + name + \"\\\", path: \\\"\" + (record.path) + \"\\\" }\"\n );\n }\n }\n}\n\nfunction compileRouteRegex (\n path,\n pathToRegexpOptions\n) {\n var regex = pathToRegexp_1(path, [], pathToRegexpOptions);\n if (process.env.NODE_ENV !== 'production') {\n var keys = Object.create(null);\n regex.keys.forEach(function (key) {\n warn(\n !keys[key.name],\n (\"Duplicate param keys in route with path: \\\"\" + path + \"\\\"\")\n );\n keys[key.name] = true;\n });\n }\n return regex\n}\n\nfunction normalizePath (\n path,\n parent,\n strict\n) {\n if (!strict) { path = path.replace(/\\/$/, ''); }\n if (path[0] === '/') { return path }\n if (parent == null) { return path }\n return cleanPath(((parent.path) + \"/\" + path))\n}\n\n/* */\n\n\n\nfunction createMatcher (\n routes,\n router\n) {\n var ref = createRouteMap(routes);\n var pathList = ref.pathList;\n var pathMap = ref.pathMap;\n var nameMap = ref.nameMap;\n\n function addRoutes (routes) {\n createRouteMap(routes, pathList, pathMap, nameMap);\n }\n\n function match (\n raw,\n currentRoute,\n redirectedFrom\n ) {\n var location = normalizeLocation(raw, currentRoute, false, router);\n var name = location.name;\n\n if (name) {\n var record = nameMap[name];\n if (process.env.NODE_ENV !== 'production') {\n warn(record, (\"Route with name '\" + name + \"' does not exist\"));\n }\n if (!record) { return _createRoute(null, location) }\n var paramNames = record.regex.keys\n .filter(function (key) { return !key.optional; })\n .map(function (key) { return key.name; });\n\n if (typeof location.params !== 'object') {\n location.params = {};\n }\n\n if (currentRoute && typeof currentRoute.params === 'object') {\n for (var key in currentRoute.params) {\n if (!(key in location.params) && paramNames.indexOf(key) > -1) {\n location.params[key] = currentRoute.params[key];\n }\n }\n }\n\n location.path = fillParams(record.path, location.params, (\"named route \\\"\" + name + \"\\\"\"));\n return _createRoute(record, location, redirectedFrom)\n } else if (location.path) {\n location.params = {};\n for (var i = 0; i < pathList.length; i++) {\n var path = pathList[i];\n var record$1 = pathMap[path];\n if (matchRoute(record$1.regex, location.path, location.params)) {\n return _createRoute(record$1, location, redirectedFrom)\n }\n }\n }\n // no match\n return _createRoute(null, location)\n }\n\n function redirect (\n record,\n location\n ) {\n var originalRedirect = record.redirect;\n var redirect = typeof originalRedirect === 'function'\n ? originalRedirect(createRoute(record, location, null, router))\n : originalRedirect;\n\n if (typeof redirect === 'string') {\n redirect = { path: redirect };\n }\n\n if (!redirect || typeof redirect !== 'object') {\n if (process.env.NODE_ENV !== 'production') {\n warn(\n false, (\"invalid redirect option: \" + (JSON.stringify(redirect)))\n );\n }\n return _createRoute(null, location)\n }\n\n var re = redirect;\n var name = re.name;\n var path = re.path;\n var query = location.query;\n var hash = location.hash;\n var params = location.params;\n query = re.hasOwnProperty('query') ? re.query : query;\n hash = re.hasOwnProperty('hash') ? re.hash : hash;\n params = re.hasOwnProperty('params') ? re.params : params;\n\n if (name) {\n // resolved named direct\n var targetRecord = nameMap[name];\n if (process.env.NODE_ENV !== 'production') {\n assert(targetRecord, (\"redirect failed: named route \\\"\" + name + \"\\\" not found.\"));\n }\n return match({\n _normalized: true,\n name: name,\n query: query,\n hash: hash,\n params: params\n }, undefined, location)\n } else if (path) {\n // 1. resolve relative redirect\n var rawPath = resolveRecordPath(path, record);\n // 2. resolve params\n var resolvedPath = fillParams(rawPath, params, (\"redirect route with path \\\"\" + rawPath + \"\\\"\"));\n // 3. rematch with existing query and hash\n return match({\n _normalized: true,\n path: resolvedPath,\n query: query,\n hash: hash\n }, undefined, location)\n } else {\n if (process.env.NODE_ENV !== 'production') {\n warn(false, (\"invalid redirect option: \" + (JSON.stringify(redirect))));\n }\n return _createRoute(null, location)\n }\n }\n\n function alias (\n record,\n location,\n matchAs\n ) {\n var aliasedPath = fillParams(matchAs, location.params, (\"aliased route with path \\\"\" + matchAs + \"\\\"\"));\n var aliasedMatch = match({\n _normalized: true,\n path: aliasedPath\n });\n if (aliasedMatch) {\n var matched = aliasedMatch.matched;\n var aliasedRecord = matched[matched.length - 1];\n location.params = aliasedMatch.params;\n return _createRoute(aliasedRecord, location)\n }\n return _createRoute(null, location)\n }\n\n function _createRoute (\n record,\n location,\n redirectedFrom\n ) {\n if (record && record.redirect) {\n return redirect(record, redirectedFrom || location)\n }\n if (record && record.matchAs) {\n return alias(record, location, record.matchAs)\n }\n return createRoute(record, location, redirectedFrom, router)\n }\n\n return {\n match: match,\n addRoutes: addRoutes\n }\n}\n\nfunction matchRoute (\n regex,\n path,\n params\n) {\n var m = path.match(regex);\n\n if (!m) {\n return false\n } else if (!params) {\n return true\n }\n\n for (var i = 1, len = m.length; i < len; ++i) {\n var key = regex.keys[i - 1];\n if (key) {\n // Fix #1994: using * with props: true generates a param named 0\n params[key.name || 'pathMatch'] = typeof m[i] === 'string' ? decode(m[i]) : m[i];\n }\n }\n\n return true\n}\n\nfunction resolveRecordPath (path, record) {\n return resolvePath(path, record.parent ? record.parent.path : '/', true)\n}\n\n/* */\n\n// use User Timing api (if present) for more accurate key precision\nvar Time =\n inBrowser && window.performance && window.performance.now\n ? window.performance\n : Date;\n\nfunction genStateKey () {\n return Time.now().toFixed(3)\n}\n\nvar _key = genStateKey();\n\nfunction getStateKey () {\n return _key\n}\n\nfunction setStateKey (key) {\n return (_key = key)\n}\n\n/* */\n\nvar positionStore = Object.create(null);\n\nfunction setupScroll () {\n // Prevent browser scroll behavior on History popstate\n if ('scrollRestoration' in window.history) {\n window.history.scrollRestoration = 'manual';\n }\n // Fix for #1585 for Firefox\n // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678\n // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with\n // window.location.protocol + '//' + window.location.host\n // location.host contains the port and location.hostname doesn't\n var protocolAndPath = window.location.protocol + '//' + window.location.host;\n var absolutePath = window.location.href.replace(protocolAndPath, '');\n // preserve existing history state as it could be overriden by the user\n var stateCopy = extend({}, window.history.state);\n stateCopy.key = getStateKey();\n window.history.replaceState(stateCopy, '', absolutePath);\n window.addEventListener('popstate', handlePopState);\n return function () {\n window.removeEventListener('popstate', handlePopState);\n }\n}\n\nfunction handleScroll (\n router,\n to,\n from,\n isPop\n) {\n if (!router.app) {\n return\n }\n\n var behavior = router.options.scrollBehavior;\n if (!behavior) {\n return\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert(typeof behavior === 'function', \"scrollBehavior must be a function\");\n }\n\n // wait until re-render finishes before scrolling\n router.app.$nextTick(function () {\n var position = getScrollPosition();\n var shouldScroll = behavior.call(\n router,\n to,\n from,\n isPop ? position : null\n );\n\n if (!shouldScroll) {\n return\n }\n\n if (typeof shouldScroll.then === 'function') {\n shouldScroll\n .then(function (shouldScroll) {\n scrollToPosition((shouldScroll), position);\n })\n .catch(function (err) {\n if (process.env.NODE_ENV !== 'production') {\n assert(false, err.toString());\n }\n });\n } else {\n scrollToPosition(shouldScroll, position);\n }\n });\n}\n\nfunction saveScrollPosition () {\n var key = getStateKey();\n if (key) {\n positionStore[key] = {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n }\n}\n\nfunction handlePopState (e) {\n saveScrollPosition();\n if (e.state && e.state.key) {\n setStateKey(e.state.key);\n }\n}\n\nfunction getScrollPosition () {\n var key = getStateKey();\n if (key) {\n return positionStore[key]\n }\n}\n\nfunction getElementPosition (el, offset) {\n var docEl = document.documentElement;\n var docRect = docEl.getBoundingClientRect();\n var elRect = el.getBoundingClientRect();\n return {\n x: elRect.left - docRect.left - offset.x,\n y: elRect.top - docRect.top - offset.y\n }\n}\n\nfunction isValidPosition (obj) {\n return isNumber(obj.x) || isNumber(obj.y)\n}\n\nfunction normalizePosition (obj) {\n return {\n x: isNumber(obj.x) ? obj.x : window.pageXOffset,\n y: isNumber(obj.y) ? obj.y : window.pageYOffset\n }\n}\n\nfunction normalizeOffset (obj) {\n return {\n x: isNumber(obj.x) ? obj.x : 0,\n y: isNumber(obj.y) ? obj.y : 0\n }\n}\n\nfunction isNumber (v) {\n return typeof v === 'number'\n}\n\nvar hashStartsWithNumberRE = /^#\\d/;\n\nfunction scrollToPosition (shouldScroll, position) {\n var isObject = typeof shouldScroll === 'object';\n if (isObject && typeof shouldScroll.selector === 'string') {\n // getElementById would still fail if the selector contains a more complicated query like #main[data-attr]\n // but at the same time, it doesn't make much sense to select an element with an id and an extra selector\n var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line\n ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line\n : document.querySelector(shouldScroll.selector);\n\n if (el) {\n var offset =\n shouldScroll.offset && typeof shouldScroll.offset === 'object'\n ? shouldScroll.offset\n : {};\n offset = normalizeOffset(offset);\n position = getElementPosition(el, offset);\n } else if (isValidPosition(shouldScroll)) {\n position = normalizePosition(shouldScroll);\n }\n } else if (isObject && isValidPosition(shouldScroll)) {\n position = normalizePosition(shouldScroll);\n }\n\n if (position) {\n // $flow-disable-line\n if ('scrollBehavior' in document.documentElement.style) {\n window.scrollTo({\n left: position.x,\n top: position.y,\n // $flow-disable-line\n behavior: shouldScroll.behavior\n });\n } else {\n window.scrollTo(position.x, position.y);\n }\n }\n}\n\n/* */\n\nvar supportsPushState =\n inBrowser &&\n (function () {\n var ua = window.navigator.userAgent;\n\n if (\n (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&\n ua.indexOf('Mobile Safari') !== -1 &&\n ua.indexOf('Chrome') === -1 &&\n ua.indexOf('Windows Phone') === -1\n ) {\n return false\n }\n\n return window.history && typeof window.history.pushState === 'function'\n })();\n\nfunction pushState (url, replace) {\n saveScrollPosition();\n // try...catch the pushState call to get around Safari\n // DOM Exception 18 where it limits to 100 pushState calls\n var history = window.history;\n try {\n if (replace) {\n // preserve existing history state as it could be overriden by the user\n var stateCopy = extend({}, history.state);\n stateCopy.key = getStateKey();\n history.replaceState(stateCopy, '', url);\n } else {\n history.pushState({ key: setStateKey(genStateKey()) }, '', url);\n }\n } catch (e) {\n window.location[replace ? 'replace' : 'assign'](url);\n }\n}\n\nfunction replaceState (url) {\n pushState(url, true);\n}\n\n/* */\n\nfunction runQueue (queue, fn, cb) {\n var step = function (index) {\n if (index >= queue.length) {\n cb();\n } else {\n if (queue[index]) {\n fn(queue[index], function () {\n step(index + 1);\n });\n } else {\n step(index + 1);\n }\n }\n };\n step(0);\n}\n\n// When changing thing, also edit router.d.ts\nvar NavigationFailureType = {\n redirected: 2,\n aborted: 4,\n cancelled: 8,\n duplicated: 16\n};\n\nfunction createNavigationRedirectedError (from, to) {\n return createRouterError(\n from,\n to,\n NavigationFailureType.redirected,\n (\"Redirected when going from \\\"\" + (from.fullPath) + \"\\\" to \\\"\" + (stringifyRoute(\n to\n )) + \"\\\" via a navigation guard.\")\n )\n}\n\nfunction createNavigationDuplicatedError (from, to) {\n var error = createRouterError(\n from,\n to,\n NavigationFailureType.duplicated,\n (\"Avoided redundant navigation to current location: \\\"\" + (from.fullPath) + \"\\\".\")\n );\n // backwards compatible with the first introduction of Errors\n error.name = 'NavigationDuplicated';\n return error\n}\n\nfunction createNavigationCancelledError (from, to) {\n return createRouterError(\n from,\n to,\n NavigationFailureType.cancelled,\n (\"Navigation cancelled from \\\"\" + (from.fullPath) + \"\\\" to \\\"\" + (to.fullPath) + \"\\\" with a new navigation.\")\n )\n}\n\nfunction createNavigationAbortedError (from, to) {\n return createRouterError(\n from,\n to,\n NavigationFailureType.aborted,\n (\"Navigation aborted from \\\"\" + (from.fullPath) + \"\\\" to \\\"\" + (to.fullPath) + \"\\\" via a navigation guard.\")\n )\n}\n\nfunction createRouterError (from, to, type, message) {\n var error = new Error(message);\n error._isRouter = true;\n error.from = from;\n error.to = to;\n error.type = type;\n\n return error\n}\n\nvar propertiesToLog = ['params', 'query', 'hash'];\n\nfunction stringifyRoute (to) {\n if (typeof to === 'string') { return to }\n if ('path' in to) { return to.path }\n var location = {};\n propertiesToLog.forEach(function (key) {\n if (key in to) { location[key] = to[key]; }\n });\n return JSON.stringify(location, null, 2)\n}\n\nfunction isError (err) {\n return Object.prototype.toString.call(err).indexOf('Error') > -1\n}\n\nfunction isNavigationFailure (err, errorType) {\n return (\n isError(err) &&\n err._isRouter &&\n (errorType == null || err.type === errorType)\n )\n}\n\n/* */\n\nfunction resolveAsyncComponents (matched) {\n return function (to, from, next) {\n var hasAsync = false;\n var pending = 0;\n var error = null;\n\n flatMapComponents(matched, function (def, _, match, key) {\n // if it's a function and doesn't have cid attached,\n // assume it's an async component resolve function.\n // we are not using Vue's default async resolving mechanism because\n // we want to halt the navigation until the incoming component has been\n // resolved.\n if (typeof def === 'function' && def.cid === undefined) {\n hasAsync = true;\n pending++;\n\n var resolve = once(function (resolvedDef) {\n if (isESModule(resolvedDef)) {\n resolvedDef = resolvedDef.default;\n }\n // save resolved on async factory in case it's used elsewhere\n def.resolved = typeof resolvedDef === 'function'\n ? resolvedDef\n : _Vue.extend(resolvedDef);\n match.components[key] = resolvedDef;\n pending--;\n if (pending <= 0) {\n next();\n }\n });\n\n var reject = once(function (reason) {\n var msg = \"Failed to resolve async component \" + key + \": \" + reason;\n process.env.NODE_ENV !== 'production' && warn(false, msg);\n if (!error) {\n error = isError(reason)\n ? reason\n : new Error(msg);\n next(error);\n }\n });\n\n var res;\n try {\n res = def(resolve, reject);\n } catch (e) {\n reject(e);\n }\n if (res) {\n if (typeof res.then === 'function') {\n res.then(resolve, reject);\n } else {\n // new syntax in Vue 2.3\n var comp = res.component;\n if (comp && typeof comp.then === 'function') {\n comp.then(resolve, reject);\n }\n }\n }\n }\n });\n\n if (!hasAsync) { next(); }\n }\n}\n\nfunction flatMapComponents (\n matched,\n fn\n) {\n return flatten(matched.map(function (m) {\n return Object.keys(m.components).map(function (key) { return fn(\n m.components[key],\n m.instances[key],\n m, key\n ); })\n }))\n}\n\nfunction flatten (arr) {\n return Array.prototype.concat.apply([], arr)\n}\n\nvar hasSymbol =\n typeof Symbol === 'function' &&\n typeof Symbol.toStringTag === 'symbol';\n\nfunction isESModule (obj) {\n return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module')\n}\n\n// in Webpack 2, require.ensure now also returns a Promise\n// so the resolve/reject functions may get called an extra time\n// if the user uses an arrow function shorthand that happens to\n// return that Promise.\nfunction once (fn) {\n var called = false;\n return function () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n if (called) { return }\n called = true;\n return fn.apply(this, args)\n }\n}\n\n/* */\n\nvar History = function History (router, base) {\n this.router = router;\n this.base = normalizeBase(base);\n // start with a route object that stands for \"nowhere\"\n this.current = START;\n this.pending = null;\n this.ready = false;\n this.readyCbs = [];\n this.readyErrorCbs = [];\n this.errorCbs = [];\n this.listeners = [];\n};\n\nHistory.prototype.listen = function listen (cb) {\n this.cb = cb;\n};\n\nHistory.prototype.onReady = function onReady (cb, errorCb) {\n if (this.ready) {\n cb();\n } else {\n this.readyCbs.push(cb);\n if (errorCb) {\n this.readyErrorCbs.push(errorCb);\n }\n }\n};\n\nHistory.prototype.onError = function onError (errorCb) {\n this.errorCbs.push(errorCb);\n};\n\nHistory.prototype.transitionTo = function transitionTo (\n location,\n onComplete,\n onAbort\n) {\n var this$1 = this;\n\n var route;\n // catch redirect option https://github.com/vuejs/vue-router/issues/3201\n try {\n route = this.router.match(location, this.current);\n } catch (e) {\n this.errorCbs.forEach(function (cb) {\n cb(e);\n });\n // Exception should still be thrown\n throw e\n }\n var prev = this.current;\n this.confirmTransition(\n route,\n function () {\n this$1.updateRoute(route);\n onComplete && onComplete(route);\n this$1.ensureURL();\n this$1.router.afterHooks.forEach(function (hook) {\n hook && hook(route, prev);\n });\n\n // fire ready cbs once\n if (!this$1.ready) {\n this$1.ready = true;\n this$1.readyCbs.forEach(function (cb) {\n cb(route);\n });\n }\n },\n function (err) {\n if (onAbort) {\n onAbort(err);\n }\n if (err && !this$1.ready) {\n // Initial redirection should not mark the history as ready yet\n // because it's triggered by the redirection instead\n // https://github.com/vuejs/vue-router/issues/3225\n // https://github.com/vuejs/vue-router/issues/3331\n if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) {\n this$1.ready = true;\n this$1.readyErrorCbs.forEach(function (cb) {\n cb(err);\n });\n }\n }\n }\n );\n};\n\nHistory.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) {\n var this$1 = this;\n\n var current = this.current;\n this.pending = route;\n var abort = function (err) {\n // changed after adding errors with\n // https://github.com/vuejs/vue-router/pull/3047 before that change,\n // redirect and aborted navigation would produce an err == null\n if (!isNavigationFailure(err) && isError(err)) {\n if (this$1.errorCbs.length) {\n this$1.errorCbs.forEach(function (cb) {\n cb(err);\n });\n } else {\n warn(false, 'uncaught error during route navigation:');\n console.error(err);\n }\n }\n onAbort && onAbort(err);\n };\n var lastRouteIndex = route.matched.length - 1;\n var lastCurrentIndex = current.matched.length - 1;\n if (\n isSameRoute(route, current) &&\n // in the case the route map has been dynamically appended to\n lastRouteIndex === lastCurrentIndex &&\n route.matched[lastRouteIndex] === current.matched[lastCurrentIndex]\n ) {\n this.ensureURL();\n return abort(createNavigationDuplicatedError(current, route))\n }\n\n var ref = resolveQueue(\n this.current.matched,\n route.matched\n );\n var updated = ref.updated;\n var deactivated = ref.deactivated;\n var activated = ref.activated;\n\n var queue = [].concat(\n // in-component leave guards\n extractLeaveGuards(deactivated),\n // global before hooks\n this.router.beforeHooks,\n // in-component update hooks\n extractUpdateHooks(updated),\n // in-config enter guards\n activated.map(function (m) { return m.beforeEnter; }),\n // async components\n resolveAsyncComponents(activated)\n );\n\n var iterator = function (hook, next) {\n if (this$1.pending !== route) {\n return abort(createNavigationCancelledError(current, route))\n }\n try {\n hook(route, current, function (to) {\n if (to === false) {\n // next(false) -> abort navigation, ensure current URL\n this$1.ensureURL(true);\n abort(createNavigationAbortedError(current, route));\n } else if (isError(to)) {\n this$1.ensureURL(true);\n abort(to);\n } else if (\n typeof to === 'string' ||\n (typeof to === 'object' &&\n (typeof to.path === 'string' || typeof to.name === 'string'))\n ) {\n // next('/') or next({ path: '/' }) -> redirect\n abort(createNavigationRedirectedError(current, route));\n if (typeof to === 'object' && to.replace) {\n this$1.replace(to);\n } else {\n this$1.push(to);\n }\n } else {\n // confirm transition and pass on the value\n next(to);\n }\n });\n } catch (e) {\n abort(e);\n }\n };\n\n runQueue(queue, iterator, function () {\n // wait until async components are resolved before\n // extracting in-component enter guards\n var enterGuards = extractEnterGuards(activated);\n var queue = enterGuards.concat(this$1.router.resolveHooks);\n runQueue(queue, iterator, function () {\n if (this$1.pending !== route) {\n return abort(createNavigationCancelledError(current, route))\n }\n this$1.pending = null;\n onComplete(route);\n if (this$1.router.app) {\n this$1.router.app.$nextTick(function () {\n handleRouteEntered(route);\n });\n }\n });\n });\n};\n\nHistory.prototype.updateRoute = function updateRoute (route) {\n this.current = route;\n this.cb && this.cb(route);\n};\n\nHistory.prototype.setupListeners = function setupListeners () {\n // Default implementation is empty\n};\n\nHistory.prototype.teardown = function teardown () {\n // clean up event listeners\n // https://github.com/vuejs/vue-router/issues/2341\n this.listeners.forEach(function (cleanupListener) {\n cleanupListener();\n });\n this.listeners = [];\n\n // reset current history route\n // https://github.com/vuejs/vue-router/issues/3294\n this.current = START;\n this.pending = null;\n};\n\nfunction normalizeBase (base) {\n if (!base) {\n if (inBrowser) {\n // respect tag\n var baseEl = document.querySelector('base');\n base = (baseEl && baseEl.getAttribute('href')) || '/';\n // strip full URL origin\n base = base.replace(/^https?:\\/\\/[^\\/]+/, '');\n } else {\n base = '/';\n }\n }\n // make sure there's the starting slash\n if (base.charAt(0) !== '/') {\n base = '/' + base;\n }\n // remove trailing slash\n return base.replace(/\\/$/, '')\n}\n\nfunction resolveQueue (\n current,\n next\n) {\n var i;\n var max = Math.max(current.length, next.length);\n for (i = 0; i < max; i++) {\n if (current[i] !== next[i]) {\n break\n }\n }\n return {\n updated: next.slice(0, i),\n activated: next.slice(i),\n deactivated: current.slice(i)\n }\n}\n\nfunction extractGuards (\n records,\n name,\n bind,\n reverse\n) {\n var guards = flatMapComponents(records, function (def, instance, match, key) {\n var guard = extractGuard(def, name);\n if (guard) {\n return Array.isArray(guard)\n ? guard.map(function (guard) { return bind(guard, instance, match, key); })\n : bind(guard, instance, match, key)\n }\n });\n return flatten(reverse ? guards.reverse() : guards)\n}\n\nfunction extractGuard (\n def,\n key\n) {\n if (typeof def !== 'function') {\n // extend now so that global mixins are applied.\n def = _Vue.extend(def);\n }\n return def.options[key]\n}\n\nfunction extractLeaveGuards (deactivated) {\n return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true)\n}\n\nfunction extractUpdateHooks (updated) {\n return extractGuards(updated, 'beforeRouteUpdate', bindGuard)\n}\n\nfunction bindGuard (guard, instance) {\n if (instance) {\n return function boundRouteGuard () {\n return guard.apply(instance, arguments)\n }\n }\n}\n\nfunction extractEnterGuards (\n activated\n) {\n return extractGuards(\n activated,\n 'beforeRouteEnter',\n function (guard, _, match, key) {\n return bindEnterGuard(guard, match, key)\n }\n )\n}\n\nfunction bindEnterGuard (\n guard,\n match,\n key\n) {\n return function routeEnterGuard (to, from, next) {\n return guard(to, from, function (cb) {\n if (typeof cb === 'function') {\n if (!match.enteredCbs[key]) {\n match.enteredCbs[key] = [];\n }\n match.enteredCbs[key].push(cb);\n }\n next(cb);\n })\n }\n}\n\n/* */\n\nvar HTML5History = /*@__PURE__*/(function (History) {\n function HTML5History (router, base) {\n History.call(this, router, base);\n\n this._startLocation = getLocation(this.base);\n }\n\n if ( History ) HTML5History.__proto__ = History;\n HTML5History.prototype = Object.create( History && History.prototype );\n HTML5History.prototype.constructor = HTML5History;\n\n HTML5History.prototype.setupListeners = function setupListeners () {\n var this$1 = this;\n\n if (this.listeners.length > 0) {\n return\n }\n\n var router = this.router;\n var expectScroll = router.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll) {\n this.listeners.push(setupScroll());\n }\n\n var handleRoutingEvent = function () {\n var current = this$1.current;\n\n // Avoiding first `popstate` event dispatched in some browsers but first\n // history route not updated since async guard at the same time.\n var location = getLocation(this$1.base);\n if (this$1.current === START && location === this$1._startLocation) {\n return\n }\n\n this$1.transitionTo(location, function (route) {\n if (supportsScroll) {\n handleScroll(router, route, current, true);\n }\n });\n };\n window.addEventListener('popstate', handleRoutingEvent);\n this.listeners.push(function () {\n window.removeEventListener('popstate', handleRoutingEvent);\n });\n };\n\n HTML5History.prototype.go = function go (n) {\n window.history.go(n);\n };\n\n HTML5History.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(location, function (route) {\n pushState(cleanPath(this$1.base + route.fullPath));\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n }, onAbort);\n };\n\n HTML5History.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(location, function (route) {\n replaceState(cleanPath(this$1.base + route.fullPath));\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n }, onAbort);\n };\n\n HTML5History.prototype.ensureURL = function ensureURL (push) {\n if (getLocation(this.base) !== this.current.fullPath) {\n var current = cleanPath(this.base + this.current.fullPath);\n push ? pushState(current) : replaceState(current);\n }\n };\n\n HTML5History.prototype.getCurrentLocation = function getCurrentLocation () {\n return getLocation(this.base)\n };\n\n return HTML5History;\n}(History));\n\nfunction getLocation (base) {\n var path = window.location.pathname;\n if (base && path.toLowerCase().indexOf(base.toLowerCase()) === 0) {\n path = path.slice(base.length);\n }\n return (path || '/') + window.location.search + window.location.hash\n}\n\n/* */\n\nvar HashHistory = /*@__PURE__*/(function (History) {\n function HashHistory (router, base, fallback) {\n History.call(this, router, base);\n // check history fallback deeplinking\n if (fallback && checkFallback(this.base)) {\n return\n }\n ensureSlash();\n }\n\n if ( History ) HashHistory.__proto__ = History;\n HashHistory.prototype = Object.create( History && History.prototype );\n HashHistory.prototype.constructor = HashHistory;\n\n // this is delayed until the app mounts\n // to avoid the hashchange listener being fired too early\n HashHistory.prototype.setupListeners = function setupListeners () {\n var this$1 = this;\n\n if (this.listeners.length > 0) {\n return\n }\n\n var router = this.router;\n var expectScroll = router.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll) {\n this.listeners.push(setupScroll());\n }\n\n var handleRoutingEvent = function () {\n var current = this$1.current;\n if (!ensureSlash()) {\n return\n }\n this$1.transitionTo(getHash(), function (route) {\n if (supportsScroll) {\n handleScroll(this$1.router, route, current, true);\n }\n if (!supportsPushState) {\n replaceHash(route.fullPath);\n }\n });\n };\n var eventType = supportsPushState ? 'popstate' : 'hashchange';\n window.addEventListener(\n eventType,\n handleRoutingEvent\n );\n this.listeners.push(function () {\n window.removeEventListener(eventType, handleRoutingEvent);\n });\n };\n\n HashHistory.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(\n location,\n function (route) {\n pushHash(route.fullPath);\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n HashHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(\n location,\n function (route) {\n replaceHash(route.fullPath);\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n HashHistory.prototype.go = function go (n) {\n window.history.go(n);\n };\n\n HashHistory.prototype.ensureURL = function ensureURL (push) {\n var current = this.current.fullPath;\n if (getHash() !== current) {\n push ? pushHash(current) : replaceHash(current);\n }\n };\n\n HashHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n return getHash()\n };\n\n return HashHistory;\n}(History));\n\nfunction checkFallback (base) {\n var location = getLocation(base);\n if (!/^\\/#/.test(location)) {\n window.location.replace(cleanPath(base + '/#' + location));\n return true\n }\n}\n\nfunction ensureSlash () {\n var path = getHash();\n if (path.charAt(0) === '/') {\n return true\n }\n replaceHash('/' + path);\n return false\n}\n\nfunction getHash () {\n // We can't use window.location.hash here because it's not\n // consistent across browsers - Firefox will pre-decode it!\n var href = window.location.href;\n var index = href.indexOf('#');\n // empty path\n if (index < 0) { return '' }\n\n href = href.slice(index + 1);\n\n return href\n}\n\nfunction getUrl (path) {\n var href = window.location.href;\n var i = href.indexOf('#');\n var base = i >= 0 ? href.slice(0, i) : href;\n return (base + \"#\" + path)\n}\n\nfunction pushHash (path) {\n if (supportsPushState) {\n pushState(getUrl(path));\n } else {\n window.location.hash = path;\n }\n}\n\nfunction replaceHash (path) {\n if (supportsPushState) {\n replaceState(getUrl(path));\n } else {\n window.location.replace(getUrl(path));\n }\n}\n\n/* */\n\nvar AbstractHistory = /*@__PURE__*/(function (History) {\n function AbstractHistory (router, base) {\n History.call(this, router, base);\n this.stack = [];\n this.index = -1;\n }\n\n if ( History ) AbstractHistory.__proto__ = History;\n AbstractHistory.prototype = Object.create( History && History.prototype );\n AbstractHistory.prototype.constructor = AbstractHistory;\n\n AbstractHistory.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n this.transitionTo(\n location,\n function (route) {\n this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route);\n this$1.index++;\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n this.transitionTo(\n location,\n function (route) {\n this$1.stack = this$1.stack.slice(0, this$1.index).concat(route);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n AbstractHistory.prototype.go = function go (n) {\n var this$1 = this;\n\n var targetIndex = this.index + n;\n if (targetIndex < 0 || targetIndex >= this.stack.length) {\n return\n }\n var route = this.stack[targetIndex];\n this.confirmTransition(\n route,\n function () {\n var prev = this$1.current;\n this$1.index = targetIndex;\n this$1.updateRoute(route);\n this$1.router.afterHooks.forEach(function (hook) {\n hook && hook(route, prev);\n });\n },\n function (err) {\n if (isNavigationFailure(err, NavigationFailureType.duplicated)) {\n this$1.index = targetIndex;\n }\n }\n );\n };\n\n AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n var current = this.stack[this.stack.length - 1];\n return current ? current.fullPath : '/'\n };\n\n AbstractHistory.prototype.ensureURL = function ensureURL () {\n // noop\n };\n\n return AbstractHistory;\n}(History));\n\n/* */\n\nvar VueRouter = function VueRouter (options) {\n if ( options === void 0 ) options = {};\n\n this.app = null;\n this.apps = [];\n this.options = options;\n this.beforeHooks = [];\n this.resolveHooks = [];\n this.afterHooks = [];\n this.matcher = createMatcher(options.routes || [], this);\n\n var mode = options.mode || 'hash';\n this.fallback =\n mode === 'history' && !supportsPushState && options.fallback !== false;\n if (this.fallback) {\n mode = 'hash';\n }\n if (!inBrowser) {\n mode = 'abstract';\n }\n this.mode = mode;\n\n switch (mode) {\n case 'history':\n this.history = new HTML5History(this, options.base);\n break\n case 'hash':\n this.history = new HashHistory(this, options.base, this.fallback);\n break\n case 'abstract':\n this.history = new AbstractHistory(this, options.base);\n break\n default:\n if (process.env.NODE_ENV !== 'production') {\n assert(false, (\"invalid mode: \" + mode));\n }\n }\n};\n\nvar prototypeAccessors = { currentRoute: { configurable: true } };\n\nVueRouter.prototype.match = function match (raw, current, redirectedFrom) {\n return this.matcher.match(raw, current, redirectedFrom)\n};\n\nprototypeAccessors.currentRoute.get = function () {\n return this.history && this.history.current\n};\n\nVueRouter.prototype.init = function init (app /* Vue component instance */) {\n var this$1 = this;\n\n process.env.NODE_ENV !== 'production' &&\n assert(\n install.installed,\n \"not installed. Make sure to call `Vue.use(VueRouter)` \" +\n \"before creating root instance.\"\n );\n\n this.apps.push(app);\n\n // set up app destroyed handler\n // https://github.com/vuejs/vue-router/issues/2639\n app.$once('hook:destroyed', function () {\n // clean out app from this.apps array once destroyed\n var index = this$1.apps.indexOf(app);\n if (index > -1) { this$1.apps.splice(index, 1); }\n // ensure we still have a main app or null if no apps\n // we do not release the router so it can be reused\n if (this$1.app === app) { this$1.app = this$1.apps[0] || null; }\n\n if (!this$1.app) { this$1.history.teardown(); }\n });\n\n // main app previously initialized\n // return as we don't need to set up new history listener\n if (this.app) {\n return\n }\n\n this.app = app;\n\n var history = this.history;\n\n if (history instanceof HTML5History || history instanceof HashHistory) {\n var handleInitialScroll = function (routeOrError) {\n var from = history.current;\n var expectScroll = this$1.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll && 'fullPath' in routeOrError) {\n handleScroll(this$1, routeOrError, from, false);\n }\n };\n var setupListeners = function (routeOrError) {\n history.setupListeners();\n handleInitialScroll(routeOrError);\n };\n history.transitionTo(\n history.getCurrentLocation(),\n setupListeners,\n setupListeners\n );\n }\n\n history.listen(function (route) {\n this$1.apps.forEach(function (app) {\n app._route = route;\n });\n });\n};\n\nVueRouter.prototype.beforeEach = function beforeEach (fn) {\n return registerHook(this.beforeHooks, fn)\n};\n\nVueRouter.prototype.beforeResolve = function beforeResolve (fn) {\n return registerHook(this.resolveHooks, fn)\n};\n\nVueRouter.prototype.afterEach = function afterEach (fn) {\n return registerHook(this.afterHooks, fn)\n};\n\nVueRouter.prototype.onReady = function onReady (cb, errorCb) {\n this.history.onReady(cb, errorCb);\n};\n\nVueRouter.prototype.onError = function onError (errorCb) {\n this.history.onError(errorCb);\n};\n\nVueRouter.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n // $flow-disable-line\n if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n this$1.history.push(location, resolve, reject);\n })\n } else {\n this.history.push(location, onComplete, onAbort);\n }\n};\n\nVueRouter.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n // $flow-disable-line\n if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n this$1.history.replace(location, resolve, reject);\n })\n } else {\n this.history.replace(location, onComplete, onAbort);\n }\n};\n\nVueRouter.prototype.go = function go (n) {\n this.history.go(n);\n};\n\nVueRouter.prototype.back = function back () {\n this.go(-1);\n};\n\nVueRouter.prototype.forward = function forward () {\n this.go(1);\n};\n\nVueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) {\n var route = to\n ? to.matched\n ? to\n : this.resolve(to).route\n : this.currentRoute;\n if (!route) {\n return []\n }\n return [].concat.apply(\n [],\n route.matched.map(function (m) {\n return Object.keys(m.components).map(function (key) {\n return m.components[key]\n })\n })\n )\n};\n\nVueRouter.prototype.resolve = function resolve (\n to,\n current,\n append\n) {\n current = current || this.history.current;\n var location = normalizeLocation(to, current, append, this);\n var route = this.match(location, current);\n var fullPath = route.redirectedFrom || route.fullPath;\n var base = this.history.base;\n var href = createHref(base, fullPath, this.mode);\n return {\n location: location,\n route: route,\n href: href,\n // for backwards compat\n normalizedTo: location,\n resolved: route\n }\n};\n\nVueRouter.prototype.addRoutes = function addRoutes (routes) {\n this.matcher.addRoutes(routes);\n if (this.history.current !== START) {\n this.history.transitionTo(this.history.getCurrentLocation());\n }\n};\n\nObject.defineProperties( VueRouter.prototype, prototypeAccessors );\n\nfunction registerHook (list, fn) {\n list.push(fn);\n return function () {\n var i = list.indexOf(fn);\n if (i > -1) { list.splice(i, 1); }\n }\n}\n\nfunction createHref (base, fullPath, mode) {\n var path = mode === 'hash' ? '#' + fullPath : fullPath;\n return base ? cleanPath(base + '/' + path) : path\n}\n\nVueRouter.install = install;\nVueRouter.version = '3.4.9';\nVueRouter.isNavigationFailure = isNavigationFailure;\nVueRouter.NavigationFailureType = NavigationFailureType;\n\nif (inBrowser && window.Vue) {\n window.Vue.use(VueRouter);\n}\n\nexport default VueRouter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-router/dist/vue-router.esm.js\n// module id = /ocq\n// module chunks = 0","/*!\n * Vue.js v2.6.12\n * (c) 2014-2020 Evan You\n * Released under the MIT License.\n */\n/* */\n\nvar emptyObject = Object.freeze({});\n\n// These helpers produce better VM code in JS engines due to their\n// explicitness and function inlining.\nfunction isUndef (v) {\n return v === undefined || v === null\n}\n\nfunction isDef (v) {\n return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n return v === true\n}\n\nfunction isFalse (v) {\n return v === false\n}\n\n/**\n * Check if value is primitive.\n */\nfunction isPrimitive (value) {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n // $flow-disable-line\n typeof value === 'symbol' ||\n typeof value === 'boolean'\n )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value, e.g., [object Object].\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n var n = parseFloat(String(val));\n return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\nfunction isPromise (val) {\n return (\n isDef(val) &&\n typeof val.then === 'function' &&\n typeof val.catch === 'function'\n )\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n return val == null\n ? ''\n : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)\n ? JSON.stringify(val, null, 2)\n : String(val)\n}\n\n/**\n * Convert an input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n var n = parseFloat(val);\n return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n str,\n expectsLowerCase\n) {\n var map = Object.create(null);\n var list = str.split(',');\n for (var i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase\n ? function (val) { return map[val.toLowerCase()]; }\n : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if an attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array.\n */\nfunction remove (arr, item) {\n if (arr.length) {\n var index = arr.indexOf(item);\n if (index > -1) {\n return arr.splice(index, 1)\n }\n }\n}\n\n/**\n * Check whether an object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n var cache = Object.create(null);\n return (function cachedFn (str) {\n var hit = cache[str];\n return hit || (cache[str] = fn(str))\n })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it,\n * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n * since native bind is now performant enough in most browsers.\n * But removing it would mean breaking code that was able to run in\n * PhantomJS 1.x, so this must be kept for backward compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n function boundFn (a) {\n var l = arguments.length;\n return l\n ? l > 1\n ? fn.apply(ctx, arguments)\n : fn.call(ctx, a)\n : fn.call(ctx)\n }\n\n boundFn._length = fn.length;\n return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n ? nativeBind\n : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n start = start || 0;\n var i = list.length - start;\n var ret = new Array(i);\n while (i--) {\n ret[i] = list[i + start];\n }\n return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n for (var key in _from) {\n to[key] = _from[key];\n }\n return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n var res = {};\n for (var i = 0; i < arr.length; i++) {\n if (arr[i]) {\n extend(res, arr[i]);\n }\n }\n return res\n}\n\n/* eslint-disable no-unused-vars */\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/* eslint-enable no-unused-vars */\n\n/**\n * Return the same value.\n */\nvar identity = function (_) { return _; };\n\n/**\n * Generate a string containing static keys from compiler modules.\n */\nfunction genStaticKeys (modules) {\n return modules.reduce(function (keys, m) {\n return keys.concat(m.staticKeys || [])\n }, []).join(',')\n}\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n if (a === b) { return true }\n var isObjectA = isObject(a);\n var isObjectB = isObject(b);\n if (isObjectA && isObjectB) {\n try {\n var isArrayA = Array.isArray(a);\n var isArrayB = Array.isArray(b);\n if (isArrayA && isArrayB) {\n return a.length === b.length && a.every(function (e, i) {\n return looseEqual(e, b[i])\n })\n } else if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n } else if (!isArrayA && !isArrayB) {\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n return keysA.length === keysB.length && keysA.every(function (key) {\n return looseEqual(a[key], b[key])\n })\n } else {\n /* istanbul ignore next */\n return false\n }\n } catch (e) {\n /* istanbul ignore next */\n return false\n }\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b)\n } else {\n return false\n }\n}\n\n/**\n * Return the first index at which a loosely equal value can be\n * found in the array (if value is a plain object, the array must\n * contain an object of the same shape), or -1 if it is not present.\n */\nfunction looseIndexOf (arr, val) {\n for (var i = 0; i < arr.length; i++) {\n if (looseEqual(arr[i], val)) { return i }\n }\n return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n var called = false;\n return function () {\n if (!called) {\n called = true;\n fn.apply(this, arguments);\n }\n }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n 'component',\n 'directive',\n 'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeUpdate',\n 'updated',\n 'beforeDestroy',\n 'destroyed',\n 'activated',\n 'deactivated',\n 'errorCaptured',\n 'serverPrefetch'\n];\n\n/* */\n\n\n\nvar config = ({\n /**\n * Option merge strategies (used in core/util/options)\n */\n // $flow-disable-line\n optionMergeStrategies: Object.create(null),\n\n /**\n * Whether to suppress warnings.\n */\n silent: false,\n\n /**\n * Show production mode tip message on boot?\n */\n productionTip: process.env.NODE_ENV !== 'production',\n\n /**\n * Whether to enable devtools\n */\n devtools: process.env.NODE_ENV !== 'production',\n\n /**\n * Whether to record perf\n */\n performance: false,\n\n /**\n * Error handler for watcher errors\n */\n errorHandler: null,\n\n /**\n * Warn handler for watcher warns\n */\n warnHandler: null,\n\n /**\n * Ignore certain custom elements\n */\n ignoredElements: [],\n\n /**\n * Custom user key aliases for v-on\n */\n // $flow-disable-line\n keyCodes: Object.create(null),\n\n /**\n * Check if a tag is reserved so that it cannot be registered as a\n * component. This is platform-dependent and may be overwritten.\n */\n isReservedTag: no,\n\n /**\n * Check if an attribute is reserved so that it cannot be used as a component\n * prop. This is platform-dependent and may be overwritten.\n */\n isReservedAttr: no,\n\n /**\n * Check if a tag is an unknown element.\n * Platform-dependent.\n */\n isUnknownElement: no,\n\n /**\n * Get the namespace of an element\n */\n getTagNamespace: noop,\n\n /**\n * Parse the real tag name for the specific platform.\n */\n parsePlatformTagName: identity,\n\n /**\n * Check if an attribute must be bound using property, e.g. value\n * Platform-dependent.\n */\n mustUseProp: no,\n\n /**\n * Perform updates asynchronously. Intended to be used by Vue Test Utils\n * This will significantly reduce performance if set to false.\n */\n async: true,\n\n /**\n * Exposed for legacy reasons\n */\n _lifecycleHooks: LIFECYCLE_HOOKS\n});\n\n/* */\n\n/**\n * unicode letters used for parsing html tags, component names and property paths.\n * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n */\nvar unicodeRegExp = /a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n var c = (str + '').charCodeAt(0);\n return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = new RegExp((\"[^\" + (unicodeRegExp.source) + \".$_\\\\d]\"));\nfunction parsePath (path) {\n if (bailRE.test(path)) {\n return\n }\n var segments = path.split('.');\n return function (obj) {\n for (var i = 0; i < segments.length; i++) {\n if (!obj) { return }\n obj = obj[segments[i]];\n }\n return obj\n }\n}\n\n/* */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\nvar isPhantomJS = UA && /phantomjs/.test(UA);\nvar isFF = UA && UA.match(/firefox\\/(\\d+)/);\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n try {\n var opts = {};\n Object.defineProperty(opts, 'passive', ({\n get: function get () {\n /* istanbul ignore next */\n supportsPassive = true;\n }\n })); // https://github.com/facebook/flow/issues/285\n window.addEventListener('test-passive', null, opts);\n } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n if (_isServer === undefined) {\n /* istanbul ignore if */\n if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n // detect presence of vue-server-renderer and avoid\n // Webpack shimming the process\n _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';\n } else {\n _isServer = false;\n }\n }\n return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n typeof Symbol !== 'undefined' && isNative(Symbol) &&\n typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n // use native Set when available.\n _Set = Set;\n} else {\n // a non-standard Set polyfill that only works with primitive keys.\n _Set = /*@__PURE__*/(function () {\n function Set () {\n this.set = Object.create(null);\n }\n Set.prototype.has = function has (key) {\n return this.set[key] === true\n };\n Set.prototype.add = function add (key) {\n this.set[key] = true;\n };\n Set.prototype.clear = function clear () {\n this.set = Object.create(null);\n };\n\n return Set;\n }());\n}\n\n/* */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (process.env.NODE_ENV !== 'production') {\n var hasConsole = typeof console !== 'undefined';\n var classifyRE = /(?:^|[-_])(\\w)/g;\n var classify = function (str) { return str\n .replace(classifyRE, function (c) { return c.toUpperCase(); })\n .replace(/[-_]/g, ''); };\n\n warn = function (msg, vm) {\n var trace = vm ? generateComponentTrace(vm) : '';\n\n if (config.warnHandler) {\n config.warnHandler.call(null, msg, vm, trace);\n } else if (hasConsole && (!config.silent)) {\n console.error((\"[Vue warn]: \" + msg + trace));\n }\n };\n\n tip = function (msg, vm) {\n if (hasConsole && (!config.silent)) {\n console.warn(\"[Vue tip]: \" + msg + (\n vm ? generateComponentTrace(vm) : ''\n ));\n }\n };\n\n formatComponentName = function (vm, includeFile) {\n if (vm.$root === vm) {\n return ''\n }\n var options = typeof vm === 'function' && vm.cid != null\n ? vm.options\n : vm._isVue\n ? vm.$options || vm.constructor.options\n : vm;\n var name = options.name || options._componentTag;\n var file = options.__file;\n if (!name && file) {\n var match = file.match(/([^/\\\\]+)\\.vue$/);\n name = match && match[1];\n }\n\n return (\n (name ? (\"<\" + (classify(name)) + \">\") : \"\") +\n (file && includeFile !== false ? (\" at \" + file) : '')\n )\n };\n\n var repeat = function (str, n) {\n var res = '';\n while (n) {\n if (n % 2 === 1) { res += str; }\n if (n > 1) { str += str; }\n n >>= 1;\n }\n return res\n };\n\n generateComponentTrace = function (vm) {\n if (vm._isVue && vm.$parent) {\n var tree = [];\n var currentRecursiveSequence = 0;\n while (vm) {\n if (tree.length > 0) {\n var last = tree[tree.length - 1];\n if (last.constructor === vm.constructor) {\n currentRecursiveSequence++;\n vm = vm.$parent;\n continue\n } else if (currentRecursiveSequence > 0) {\n tree[tree.length - 1] = [last, currentRecursiveSequence];\n currentRecursiveSequence = 0;\n }\n }\n tree.push(vm);\n vm = vm.$parent;\n }\n return '\\n\\nfound in\\n\\n' + tree\n .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n : formatComponentName(vm))); })\n .join('\\n')\n } else {\n return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n }\n };\n}\n\n/* */\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n this.id = uid++;\n this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n if (Dep.target) {\n Dep.target.addDep(this);\n }\n};\n\nDep.prototype.notify = function notify () {\n // stabilize the subscriber list first\n var subs = this.subs.slice();\n if (process.env.NODE_ENV !== 'production' && !config.async) {\n // subs aren't sorted in scheduler if not running async\n // we need to sort them now to make sure they fire in correct\n // order\n subs.sort(function (a, b) { return a.id - b.id; });\n }\n for (var i = 0, l = subs.length; i < l; i++) {\n subs[i].update();\n }\n};\n\n// The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (target) {\n targetStack.push(target);\n Dep.target = target;\n}\n\nfunction popTarget () {\n targetStack.pop();\n Dep.target = targetStack[targetStack.length - 1];\n}\n\n/* */\n\nvar VNode = function VNode (\n tag,\n data,\n children,\n text,\n elm,\n context,\n componentOptions,\n asyncFactory\n) {\n this.tag = tag;\n this.data = data;\n this.children = children;\n this.text = text;\n this.elm = elm;\n this.ns = undefined;\n this.context = context;\n this.fnContext = undefined;\n this.fnOptions = undefined;\n this.fnScopeId = undefined;\n this.key = data && data.key;\n this.componentOptions = componentOptions;\n this.componentInstance = undefined;\n this.parent = undefined;\n this.raw = false;\n this.isStatic = false;\n this.isRootInsert = true;\n this.isComment = false;\n this.isCloned = false;\n this.isOnce = false;\n this.asyncFactory = asyncFactory;\n this.asyncMeta = undefined;\n this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n if ( text === void 0 ) text = '';\n\n var node = new VNode();\n node.text = text;\n node.isComment = true;\n return node\n};\n\nfunction createTextVNode (val) {\n return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n var cloned = new VNode(\n vnode.tag,\n vnode.data,\n // #7975\n // clone children array to avoid mutating original in case of cloning\n // a child.\n vnode.children && vnode.children.slice(),\n vnode.text,\n vnode.elm,\n vnode.context,\n vnode.componentOptions,\n vnode.asyncFactory\n );\n cloned.ns = vnode.ns;\n cloned.isStatic = vnode.isStatic;\n cloned.key = vnode.key;\n cloned.isComment = vnode.isComment;\n cloned.fnContext = vnode.fnContext;\n cloned.fnOptions = vnode.fnOptions;\n cloned.fnScopeId = vnode.fnScopeId;\n cloned.asyncMeta = vnode.asyncMeta;\n cloned.isCloned = true;\n return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n // cache original method\n var original = arrayProto[method];\n def(arrayMethods, method, function mutator () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var result = original.apply(this, args);\n var ob = this.__ob__;\n var inserted;\n switch (method) {\n case 'push':\n case 'unshift':\n inserted = args;\n break\n case 'splice':\n inserted = args.slice(2);\n break\n }\n if (inserted) { ob.observeArray(inserted); }\n // notify change\n ob.dep.notify();\n return result\n });\n});\n\n/* */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n this.value = value;\n this.dep = new Dep();\n this.vmCount = 0;\n def(value, '__ob__', this);\n if (Array.isArray(value)) {\n if (hasProto) {\n protoAugment(value, arrayMethods);\n } else {\n copyAugment(value, arrayMethods, arrayKeys);\n }\n this.observeArray(value);\n } else {\n this.walk(value);\n }\n};\n\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n defineReactive$$1(obj, keys[i]);\n }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n for (var i = 0, l = items.length; i < l; i++) {\n observe(items[i]);\n }\n};\n\n// helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src) {\n /* eslint-disable no-proto */\n target.__proto__ = src;\n /* eslint-enable no-proto */\n}\n\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n def(target, key, src[key]);\n }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n if (!isObject(value) || value instanceof VNode) {\n return\n }\n var ob;\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n ob = value.__ob__;\n } else if (\n shouldObserve &&\n !isServerRendering() &&\n (Array.isArray(value) || isPlainObject(value)) &&\n Object.isExtensible(value) &&\n !value._isVue\n ) {\n ob = new Observer(value);\n }\n if (asRootData && ob) {\n ob.vmCount++;\n }\n return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive$$1 (\n obj,\n key,\n val,\n customSetter,\n shallow\n) {\n var dep = new Dep();\n\n var property = Object.getOwnPropertyDescriptor(obj, key);\n if (property && property.configurable === false) {\n return\n }\n\n // cater for pre-defined getter/setters\n var getter = property && property.get;\n var setter = property && property.set;\n if ((!getter || setter) && arguments.length === 2) {\n val = obj[key];\n }\n\n var childOb = !shallow && observe(val);\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n var value = getter ? getter.call(obj) : val;\n if (Dep.target) {\n dep.depend();\n if (childOb) {\n childOb.dep.depend();\n if (Array.isArray(value)) {\n dependArray(value);\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n var value = getter ? getter.call(obj) : val;\n /* eslint-disable no-self-compare */\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n /* eslint-enable no-self-compare */\n if (process.env.NODE_ENV !== 'production' && customSetter) {\n customSetter();\n }\n // #7981: for accessor properties without setter\n if (getter && !setter) { return }\n if (setter) {\n setter.call(obj, newVal);\n } else {\n val = newVal;\n }\n childOb = !shallow && observe(newVal);\n dep.notify();\n }\n });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n if (process.env.NODE_ENV !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.length = Math.max(target.length, key);\n target.splice(key, 1, val);\n return val\n }\n if (key in target && !(key in Object.prototype)) {\n target[key] = val;\n return val\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'Avoid adding reactive properties to a Vue instance or its root $data ' +\n 'at runtime - declare it upfront in the data option.'\n );\n return val\n }\n if (!ob) {\n target[key] = val;\n return val\n }\n defineReactive$$1(ob.value, key, val);\n ob.dep.notify();\n return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n if (process.env.NODE_ENV !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.splice(key, 1);\n return\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'Avoid deleting properties on a Vue instance or its root $data ' +\n '- just set it to null.'\n );\n return\n }\n if (!hasOwn(target, key)) {\n return\n }\n delete target[key];\n if (!ob) {\n return\n }\n ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n e = value[i];\n e && e.__ob__ && e.__ob__.dep.depend();\n if (Array.isArray(e)) {\n dependArray(e);\n }\n }\n}\n\n/* */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (process.env.NODE_ENV !== 'production') {\n strats.el = strats.propsData = function (parent, child, vm, key) {\n if (!vm) {\n warn(\n \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n 'creation with the `new` keyword.'\n );\n }\n return defaultStrat(parent, child)\n };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n if (!from) { return to }\n var key, toVal, fromVal;\n\n var keys = hasSymbol\n ? Reflect.ownKeys(from)\n : Object.keys(from);\n\n for (var i = 0; i < keys.length; i++) {\n key = keys[i];\n // in case the object is already observed...\n if (key === '__ob__') { continue }\n toVal = to[key];\n fromVal = from[key];\n if (!hasOwn(to, key)) {\n set(to, key, fromVal);\n } else if (\n toVal !== fromVal &&\n isPlainObject(toVal) &&\n isPlainObject(fromVal)\n ) {\n mergeData(toVal, fromVal);\n }\n }\n return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n // in a Vue.extend merge, both should be functions\n if (!childVal) {\n return parentVal\n }\n if (!parentVal) {\n return childVal\n }\n // when parentVal & childVal are both present,\n // we need to return a function that returns the\n // merged result of both functions... no need to\n // check if parentVal is a function here because\n // it has to be a function to pass previous merges.\n return function mergedDataFn () {\n return mergeData(\n typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n )\n }\n } else {\n return function mergedInstanceDataFn () {\n // instance merge\n var instanceData = typeof childVal === 'function'\n ? childVal.call(vm, vm)\n : childVal;\n var defaultData = typeof parentVal === 'function'\n ? parentVal.call(vm, vm)\n : parentVal;\n if (instanceData) {\n return mergeData(instanceData, defaultData)\n } else {\n return defaultData\n }\n }\n }\n}\n\nstrats.data = function (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n if (childVal && typeof childVal !== 'function') {\n process.env.NODE_ENV !== 'production' && warn(\n 'The \"data\" option should be a function ' +\n 'that returns a per-instance value in component ' +\n 'definitions.',\n vm\n );\n\n return parentVal\n }\n return mergeDataOrFn(parentVal, childVal)\n }\n\n return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n parentVal,\n childVal\n) {\n var res = childVal\n ? parentVal\n ? parentVal.concat(childVal)\n : Array.isArray(childVal)\n ? childVal\n : [childVal]\n : parentVal;\n return res\n ? dedupeHooks(res)\n : res\n}\n\nfunction dedupeHooks (hooks) {\n var res = [];\n for (var i = 0; i < hooks.length; i++) {\n if (res.indexOf(hooks[i]) === -1) {\n res.push(hooks[i]);\n }\n }\n return res\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n parentVal,\n childVal,\n vm,\n key\n) {\n var res = Object.create(parentVal || null);\n if (childVal) {\n process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);\n return extend(res, childVal)\n } else {\n return res\n }\n}\n\nASSET_TYPES.forEach(function (type) {\n strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n // work around Firefox's Object.prototype.watch...\n if (parentVal === nativeWatch) { parentVal = undefined; }\n if (childVal === nativeWatch) { childVal = undefined; }\n /* istanbul ignore if */\n if (!childVal) { return Object.create(parentVal || null) }\n if (process.env.NODE_ENV !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = {};\n extend(ret, parentVal);\n for (var key$1 in childVal) {\n var parent = ret[key$1];\n var child = childVal[key$1];\n if (parent && !Array.isArray(parent)) {\n parent = [parent];\n }\n ret[key$1] = parent\n ? parent.concat(child)\n : Array.isArray(child) ? child : [child];\n }\n return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n if (childVal && process.env.NODE_ENV !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = Object.create(null);\n extend(ret, parentVal);\n if (childVal) { extend(ret, childVal); }\n return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n return childVal === undefined\n ? parentVal\n : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n for (var key in options.components) {\n validateComponentName(key);\n }\n}\n\nfunction validateComponentName (name) {\n if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + (unicodeRegExp.source) + \"]*$\")).test(name)) {\n warn(\n 'Invalid component name: \"' + name + '\". Component names ' +\n 'should conform to valid custom element name in html5 specification.'\n );\n }\n if (isBuiltInTag(name) || config.isReservedTag(name)) {\n warn(\n 'Do not use built-in or reserved HTML elements as component ' +\n 'id: ' + name\n );\n }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n var props = options.props;\n if (!props) { return }\n var res = {};\n var i, val, name;\n if (Array.isArray(props)) {\n i = props.length;\n while (i--) {\n val = props[i];\n if (typeof val === 'string') {\n name = camelize(val);\n res[name] = { type: null };\n } else if (process.env.NODE_ENV !== 'production') {\n warn('props must be strings when using array syntax.');\n }\n }\n } else if (isPlainObject(props)) {\n for (var key in props) {\n val = props[key];\n name = camelize(key);\n res[name] = isPlainObject(val)\n ? val\n : { type: val };\n }\n } else if (process.env.NODE_ENV !== 'production') {\n warn(\n \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(props)) + \".\",\n vm\n );\n }\n options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n var inject = options.inject;\n if (!inject) { return }\n var normalized = options.inject = {};\n if (Array.isArray(inject)) {\n for (var i = 0; i < inject.length; i++) {\n normalized[inject[i]] = { from: inject[i] };\n }\n } else if (isPlainObject(inject)) {\n for (var key in inject) {\n var val = inject[key];\n normalized[key] = isPlainObject(val)\n ? extend({ from: key }, val)\n : { from: val };\n }\n } else if (process.env.NODE_ENV !== 'production') {\n warn(\n \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(inject)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n var dirs = options.directives;\n if (dirs) {\n for (var key in dirs) {\n var def$$1 = dirs[key];\n if (typeof def$$1 === 'function') {\n dirs[key] = { bind: def$$1, update: def$$1 };\n }\n }\n }\n}\n\nfunction assertObjectType (name, value, vm) {\n if (!isPlainObject(value)) {\n warn(\n \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n \"but got \" + (toRawType(value)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n parent,\n child,\n vm\n) {\n if (process.env.NODE_ENV !== 'production') {\n checkComponents(child);\n }\n\n if (typeof child === 'function') {\n child = child.options;\n }\n\n normalizeProps(child, vm);\n normalizeInject(child, vm);\n normalizeDirectives(child);\n\n // Apply extends and mixins on the child options,\n // but only if it is a raw options object that isn't\n // the result of another mergeOptions call.\n // Only merged options has the _base property.\n if (!child._base) {\n if (child.extends) {\n parent = mergeOptions(parent, child.extends, vm);\n }\n if (child.mixins) {\n for (var i = 0, l = child.mixins.length; i < l; i++) {\n parent = mergeOptions(parent, child.mixins[i], vm);\n }\n }\n }\n\n var options = {};\n var key;\n for (key in parent) {\n mergeField(key);\n }\n for (key in child) {\n if (!hasOwn(parent, key)) {\n mergeField(key);\n }\n }\n function mergeField (key) {\n var strat = strats[key] || defaultStrat;\n options[key] = strat(parent[key], child[key], vm, key);\n }\n return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n options,\n type,\n id,\n warnMissing\n) {\n /* istanbul ignore if */\n if (typeof id !== 'string') {\n return\n }\n var assets = options[type];\n // check local registration variations first\n if (hasOwn(assets, id)) { return assets[id] }\n var camelizedId = camelize(id);\n if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n var PascalCaseId = capitalize(camelizedId);\n if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n // fallback to prototype chain\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {\n warn(\n 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n options\n );\n }\n return res\n}\n\n/* */\n\n\n\nfunction validateProp (\n key,\n propOptions,\n propsData,\n vm\n) {\n var prop = propOptions[key];\n var absent = !hasOwn(propsData, key);\n var value = propsData[key];\n // boolean casting\n var booleanIndex = getTypeIndex(Boolean, prop.type);\n if (booleanIndex > -1) {\n if (absent && !hasOwn(prop, 'default')) {\n value = false;\n } else if (value === '' || value === hyphenate(key)) {\n // only cast empty string / same name to boolean if\n // boolean has higher priority\n var stringIndex = getTypeIndex(String, prop.type);\n if (stringIndex < 0 || booleanIndex < stringIndex) {\n value = true;\n }\n }\n }\n // check default value\n if (value === undefined) {\n value = getPropDefaultValue(vm, prop, key);\n // since the default value is a fresh copy,\n // make sure to observe it.\n var prevShouldObserve = shouldObserve;\n toggleObserving(true);\n observe(value);\n toggleObserving(prevShouldObserve);\n }\n if (\n process.env.NODE_ENV !== 'production' &&\n // skip validation for weex recycle-list child component props\n !(false)\n ) {\n assertProp(prop, key, value, vm, absent);\n }\n return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n // no default, return undefined\n if (!hasOwn(prop, 'default')) {\n return undefined\n }\n var def = prop.default;\n // warn against non-factory defaults for Object & Array\n if (process.env.NODE_ENV !== 'production' && isObject(def)) {\n warn(\n 'Invalid default value for prop \"' + key + '\": ' +\n 'Props with type Object/Array must use a factory function ' +\n 'to return the default value.',\n vm\n );\n }\n // the raw prop value was also undefined from previous render,\n // return previous default value to avoid unnecessary watcher trigger\n if (vm && vm.$options.propsData &&\n vm.$options.propsData[key] === undefined &&\n vm._props[key] !== undefined\n ) {\n return vm._props[key]\n }\n // call factory function for non-Function types\n // a value is Function if its prototype is function even across different execution context\n return typeof def === 'function' && getType(prop.type) !== 'Function'\n ? def.call(vm)\n : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n prop,\n name,\n value,\n vm,\n absent\n) {\n if (prop.required && absent) {\n warn(\n 'Missing required prop: \"' + name + '\"',\n vm\n );\n return\n }\n if (value == null && !prop.required) {\n return\n }\n var type = prop.type;\n var valid = !type || type === true;\n var expectedTypes = [];\n if (type) {\n if (!Array.isArray(type)) {\n type = [type];\n }\n for (var i = 0; i < type.length && !valid; i++) {\n var assertedType = assertType(value, type[i]);\n expectedTypes.push(assertedType.expectedType || '');\n valid = assertedType.valid;\n }\n }\n\n if (!valid) {\n warn(\n getInvalidTypeMessage(name, value, expectedTypes),\n vm\n );\n return\n }\n var validator = prop.validator;\n if (validator) {\n if (!validator(value)) {\n warn(\n 'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n vm\n );\n }\n }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType (value, type) {\n var valid;\n var expectedType = getType(type);\n if (simpleCheckRE.test(expectedType)) {\n var t = typeof value;\n valid = t === expectedType.toLowerCase();\n // for primitive wrapper objects\n if (!valid && t === 'object') {\n valid = value instanceof type;\n }\n } else if (expectedType === 'Object') {\n valid = isPlainObject(value);\n } else if (expectedType === 'Array') {\n valid = Array.isArray(value);\n } else {\n valid = value instanceof type;\n }\n return {\n valid: valid,\n expectedType: expectedType\n }\n}\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n if (!Array.isArray(expectedTypes)) {\n return isSameType(expectedTypes, type) ? 0 : -1\n }\n for (var i = 0, len = expectedTypes.length; i < len; i++) {\n if (isSameType(expectedTypes[i], type)) {\n return i\n }\n }\n return -1\n}\n\nfunction getInvalidTypeMessage (name, value, expectedTypes) {\n var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n var expectedType = expectedTypes[0];\n var receivedType = toRawType(value);\n var expectedValue = styleValue(value, expectedType);\n var receivedValue = styleValue(value, receivedType);\n // check if we need to specify expected value\n if (expectedTypes.length === 1 &&\n isExplicable(expectedType) &&\n !isBoolean(expectedType, receivedType)) {\n message += \" with value \" + expectedValue;\n }\n message += \", got \" + receivedType + \" \";\n // check if we need to specify received value\n if (isExplicable(receivedType)) {\n message += \"with value \" + receivedValue + \".\";\n }\n return message\n}\n\nfunction styleValue (value, type) {\n if (type === 'String') {\n return (\"\\\"\" + value + \"\\\"\")\n } else if (type === 'Number') {\n return (\"\" + (Number(value)))\n } else {\n return (\"\" + value)\n }\n}\n\nfunction isExplicable (value) {\n var explicitTypes = ['string', 'number', 'boolean'];\n return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })\n}\n\nfunction isBoolean () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n}\n\n/* */\n\nfunction handleError (err, vm, info) {\n // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n // See: https://github.com/vuejs/vuex/issues/1505\n pushTarget();\n try {\n if (vm) {\n var cur = vm;\n while ((cur = cur.$parent)) {\n var hooks = cur.$options.errorCaptured;\n if (hooks) {\n for (var i = 0; i < hooks.length; i++) {\n try {\n var capture = hooks[i].call(cur, err, vm, info) === false;\n if (capture) { return }\n } catch (e) {\n globalHandleError(e, cur, 'errorCaptured hook');\n }\n }\n }\n }\n }\n globalHandleError(err, vm, info);\n } finally {\n popTarget();\n }\n}\n\nfunction invokeWithErrorHandling (\n handler,\n context,\n args,\n vm,\n info\n) {\n var res;\n try {\n res = args ? handler.apply(context, args) : handler.call(context);\n if (res && !res._isVue && isPromise(res) && !res._handled) {\n res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n // issue #9511\n // avoid catch triggering multiple times when nested calls\n res._handled = true;\n }\n } catch (e) {\n handleError(e, vm, info);\n }\n return res\n}\n\nfunction globalHandleError (err, vm, info) {\n if (config.errorHandler) {\n try {\n return config.errorHandler.call(null, err, vm, info)\n } catch (e) {\n // if the user intentionally throws the original error in the handler,\n // do not log it twice\n if (e !== err) {\n logError(e, null, 'config.errorHandler');\n }\n }\n }\n logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n if (process.env.NODE_ENV !== 'production') {\n warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n }\n /* istanbul ignore else */\n if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n console.error(err);\n } else {\n throw err\n }\n}\n\n/* */\n\nvar isUsingMicroTask = false;\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n pending = false;\n var copies = callbacks.slice(0);\n callbacks.length = 0;\n for (var i = 0; i < copies.length; i++) {\n copies[i]();\n }\n}\n\n// Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\nvar timerFunc;\n\n// The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n var p = Promise.resolve();\n timerFunc = function () {\n p.then(flushCallbacks);\n // In problematic UIWebViews, Promise.then doesn't completely break, but\n // it can get stuck in a weird state where callbacks are pushed into the\n // microtask queue but the queue isn't being flushed, until the browser\n // needs to do some other work, e.g. handle a timer. Therefore we can\n // \"force\" the microtask queue to be flushed by adding an empty timer.\n if (isIOS) { setTimeout(noop); }\n };\n isUsingMicroTask = true;\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (\n isNative(MutationObserver) ||\n // PhantomJS and iOS 7.x\n MutationObserver.toString() === '[object MutationObserverConstructor]'\n)) {\n // Use MutationObserver where native Promise is not available,\n // e.g. PhantomJS, iOS7, Android 4.4\n // (#6466 MutationObserver is unreliable in IE11)\n var counter = 1;\n var observer = new MutationObserver(flushCallbacks);\n var textNode = document.createTextNode(String(counter));\n observer.observe(textNode, {\n characterData: true\n });\n timerFunc = function () {\n counter = (counter + 1) % 2;\n textNode.data = String(counter);\n };\n isUsingMicroTask = true;\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n // Fallback to setImmediate.\n // Technically it leverages the (macro) task queue,\n // but it is still a better choice than setTimeout.\n timerFunc = function () {\n setImmediate(flushCallbacks);\n };\n} else {\n // Fallback to setTimeout.\n timerFunc = function () {\n setTimeout(flushCallbacks, 0);\n };\n}\n\nfunction nextTick (cb, ctx) {\n var _resolve;\n callbacks.push(function () {\n if (cb) {\n try {\n cb.call(ctx);\n } catch (e) {\n handleError(e, ctx, 'nextTick');\n }\n } else if (_resolve) {\n _resolve(ctx);\n }\n });\n if (!pending) {\n pending = true;\n timerFunc();\n }\n // $flow-disable-line\n if (!cb && typeof Promise !== 'undefined') {\n return new Promise(function (resolve) {\n _resolve = resolve;\n })\n }\n}\n\n/* */\n\nvar mark;\nvar measure;\n\nif (process.env.NODE_ENV !== 'production') {\n var perf = inBrowser && window.performance;\n /* istanbul ignore if */\n if (\n perf &&\n perf.mark &&\n perf.measure &&\n perf.clearMarks &&\n perf.clearMeasures\n ) {\n mark = function (tag) { return perf.mark(tag); };\n measure = function (name, startTag, endTag) {\n perf.measure(name, startTag, endTag);\n perf.clearMarks(startTag);\n perf.clearMarks(endTag);\n // perf.clearMeasures(name)\n };\n }\n}\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (process.env.NODE_ENV !== 'production') {\n var allowedGlobals = makeMap(\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n 'require' // for Webpack/Browserify\n );\n\n var warnNonPresent = function (target, key) {\n warn(\n \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n 'referenced during render. Make sure that this property is reactive, ' +\n 'either in the data option, or for class-based components, by ' +\n 'initializing the property. ' +\n 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n target\n );\n };\n\n var warnReservedPrefix = function (target, key) {\n warn(\n \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n 'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n 'prevent conflicts with Vue internals. ' +\n 'See: https://vuejs.org/v2/api/#data',\n target\n );\n };\n\n var hasProxy =\n typeof Proxy !== 'undefined' && isNative(Proxy);\n\n if (hasProxy) {\n var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n config.keyCodes = new Proxy(config.keyCodes, {\n set: function set (target, key, value) {\n if (isBuiltInModifier(key)) {\n warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n return false\n } else {\n target[key] = value;\n return true\n }\n }\n });\n }\n\n var hasHandler = {\n has: function has (target, key) {\n var has = key in target;\n var isAllowed = allowedGlobals(key) ||\n (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n if (!has && !isAllowed) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return has || !isAllowed\n }\n };\n\n var getHandler = {\n get: function get (target, key) {\n if (typeof key === 'string' && !(key in target)) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return target[key]\n }\n };\n\n initProxy = function initProxy (vm) {\n if (hasProxy) {\n // determine which proxy handler to use\n var options = vm.$options;\n var handlers = options.render && options.render._withStripped\n ? getHandler\n : hasHandler;\n vm._renderProxy = new Proxy(vm, handlers);\n } else {\n vm._renderProxy = vm;\n }\n };\n}\n\n/* */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n _traverse(val, seenObjects);\n seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n var i, keys;\n var isA = Array.isArray(val);\n if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n return\n }\n if (val.__ob__) {\n var depId = val.__ob__.dep.id;\n if (seen.has(depId)) {\n return\n }\n seen.add(depId);\n }\n if (isA) {\n i = val.length;\n while (i--) { _traverse(val[i], seen); }\n } else {\n keys = Object.keys(val);\n i = keys.length;\n while (i--) { _traverse(val[keys[i]], seen); }\n }\n}\n\n/* */\n\nvar normalizeEvent = cached(function (name) {\n var passive = name.charAt(0) === '&';\n name = passive ? name.slice(1) : name;\n var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n name = once$$1 ? name.slice(1) : name;\n var capture = name.charAt(0) === '!';\n name = capture ? name.slice(1) : name;\n return {\n name: name,\n once: once$$1,\n capture: capture,\n passive: passive\n }\n});\n\nfunction createFnInvoker (fns, vm) {\n function invoker () {\n var arguments$1 = arguments;\n\n var fns = invoker.fns;\n if (Array.isArray(fns)) {\n var cloned = fns.slice();\n for (var i = 0; i < cloned.length; i++) {\n invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n }\n } else {\n // return handler return value for single handlers\n return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n }\n }\n invoker.fns = fns;\n return invoker\n}\n\nfunction updateListeners (\n on,\n oldOn,\n add,\n remove$$1,\n createOnceHandler,\n vm\n) {\n var name, def$$1, cur, old, event;\n for (name in on) {\n def$$1 = cur = on[name];\n old = oldOn[name];\n event = normalizeEvent(name);\n if (isUndef(cur)) {\n process.env.NODE_ENV !== 'production' && warn(\n \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n vm\n );\n } else if (isUndef(old)) {\n if (isUndef(cur.fns)) {\n cur = on[name] = createFnInvoker(cur, vm);\n }\n if (isTrue(event.once)) {\n cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n }\n add(event.name, cur, event.capture, event.passive, event.params);\n } else if (cur !== old) {\n old.fns = cur;\n on[name] = old;\n }\n }\n for (name in oldOn) {\n if (isUndef(on[name])) {\n event = normalizeEvent(name);\n remove$$1(event.name, oldOn[name], event.capture);\n }\n }\n}\n\n/* */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n if (def instanceof VNode) {\n def = def.data.hook || (def.data.hook = {});\n }\n var invoker;\n var oldHook = def[hookKey];\n\n function wrappedHook () {\n hook.apply(this, arguments);\n // important: remove merged hook to ensure it's called only once\n // and prevent memory leak\n remove(invoker.fns, wrappedHook);\n }\n\n if (isUndef(oldHook)) {\n // no existing hook\n invoker = createFnInvoker([wrappedHook]);\n } else {\n /* istanbul ignore if */\n if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n // already a merged invoker\n invoker = oldHook;\n invoker.fns.push(wrappedHook);\n } else {\n // existing plain hook\n invoker = createFnInvoker([oldHook, wrappedHook]);\n }\n }\n\n invoker.merged = true;\n def[hookKey] = invoker;\n}\n\n/* */\n\nfunction extractPropsFromVNodeData (\n data,\n Ctor,\n tag\n) {\n // we are only extracting raw values here.\n // validation and default values are handled in the child\n // component itself.\n var propOptions = Ctor.options.props;\n if (isUndef(propOptions)) {\n return\n }\n var res = {};\n var attrs = data.attrs;\n var props = data.props;\n if (isDef(attrs) || isDef(props)) {\n for (var key in propOptions) {\n var altKey = hyphenate(key);\n if (process.env.NODE_ENV !== 'production') {\n var keyInLowerCase = key.toLowerCase();\n if (\n key !== keyInLowerCase &&\n attrs && hasOwn(attrs, keyInLowerCase)\n ) {\n tip(\n \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n \" \\\"\" + key + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and camelCased \" +\n \"props need to use their kebab-case equivalents when using in-DOM \" +\n \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n );\n }\n }\n checkProp(res, props, key, altKey, true) ||\n checkProp(res, attrs, key, altKey, false);\n }\n }\n return res\n}\n\nfunction checkProp (\n res,\n hash,\n key,\n altKey,\n preserve\n) {\n if (isDef(hash)) {\n if (hasOwn(hash, key)) {\n res[key] = hash[key];\n if (!preserve) {\n delete hash[key];\n }\n return true\n } else if (hasOwn(hash, altKey)) {\n res[key] = hash[altKey];\n if (!preserve) {\n delete hash[altKey];\n }\n return true\n }\n }\n return false\n}\n\n/* */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n for (var i = 0; i < children.length; i++) {\n if (Array.isArray(children[i])) {\n return Array.prototype.concat.apply([], children)\n }\n }\n return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g.