diff --git a/build.gradle b/build.gradle index c84982bf8..65e532215 100644 --- a/build.gradle +++ b/build.gradle @@ -94,17 +94,17 @@ subprojects { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/'} maven { url "https://repo.spring.io/plugins-release/" } maven { url "https://repo.spring.io/milestone" } - mavenCentral() - jcenter() - maven { url "https://repo1.maven.org/maven2/" } + maven { url "https://repo1.maven.org/maven2/" } maven { url "https://build.shibboleth.net/nexus/content/repositories/releases/" } - maven { url "https://mvnrepository.com/repos/central/" } + maven { url "https://mvnrepository.com/repos/central/" } maven { url "http://jcenter.bintray.com" } maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases"} maven { url "https://plugins.gradle.org/m2/" } maven { url "https://oss.sonatype.org/content/repositories/releases/" } maven { url "https://maven.repository.redhat.com/ga/" } maven { url "https://repository.apache.org/content/repositories/releases/" } + mavenCentral() + jcenter() } //all dependencies @@ -213,6 +213,10 @@ subprojects { //spring-session compile group: 'org.springframework.session', name: 'spring-session-core', version: "${springSessionVersion}" compile group: 'org.springframework.session', name: 'spring-session-data-redis', version: "${springSessionVersion}" + + compile group: 'org.springframework.plugin', name: 'spring-plugin-core', version: '2.0.0.RELEASE' + compile group: 'org.springframework.plugin', name: 'spring-plugin-metadata', version: '2.0.0.RELEASE' + //saml compile group: 'org.opensaml', name: 'opensaml', version: '2.6.6' compile group: 'org.opensaml', name: 'openws', version: '1.5.6' @@ -256,6 +260,10 @@ subprojects { compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jacksonVersion}" compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${jacksonVersion}" compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: "${jacksonVersion}" + compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: "${jacksonVersion}" + compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: "${jacksonVersion}" + compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: "${jacksonVersion}" + compile group: 'com.fasterxml', name: 'classmate', version: '1.5.0' compile group: 'com.alibaba', name: 'fastjson', version: '1.2.74' //reactive @@ -296,7 +304,38 @@ subprojects { compile group: 'org.ogce', name: 'xpp3', version: '1.1.6' compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.10' compile group: 'org.passay', name: 'passay', version: '1.6.0' - + + //docs + compile group: 'org.mapstruct', name: 'mapstruct', version: '1.4.1.Final' + compile group: 'io.swagger', name: 'swagger-annotations', version: "${swaggerVersion}" + compile group: 'io.swagger', name: 'swagger-models', version: "${swaggerVersion}" + compile group: 'io.swagger.core.v3', name: 'swagger-annotations', version: "${swaggerV3Version}" + compile group: 'io.swagger.core.v3', name: 'swagger-core', version: "${swaggerV3Version}" + compile group: 'io.swagger.core.v3', name: 'swagger-integration', version: "${swaggerV3Version}" + compile group: 'io.swagger.core.v3', name: 'swagger-models', version: "${swaggerV3Version}" + //springfox + compile group: 'io.springfox', name: 'springfox-bean-validators', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-core', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-data-rest', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-spi', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-oas', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-schema', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-swagger2', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-swagger-ui', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-swagger-common', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-spring-webmvc', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-spring-web', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-spring-webflux', version: "${springfoxVersion}" + compile group: 'io.springfox', name: 'springfox-boot-starter', version: "${springfoxVersion}" + //knife4j + compile group: 'com.github.xiaoymin', name: 'knife4j-annotations', version: "${knife4jVersion}" + compile group: 'com.github.xiaoymin', name: 'knife4j-core', version: "${knife4jVersion}" + compile group: 'com.github.xiaoymin', name: 'knife4j-spring-mvc', version: "${knife4jVersion}" + compile group: 'com.github.xiaoymin', name: 'knife4j-spring', version: "${knife4jVersion}" + compile group: 'com.github.xiaoymin', name: 'knife4j-spring-ui', version: "${knife4jVersion}" + compile group: 'com.github.xiaoymin', name: 'knife4j-spring-boot-starter', version: "${knife4jVersion}" + compile group: 'com.github.xiaoymin', name: 'knife4j-spring-boot-autoconfigure', version: "${knife4jVersion}" + //local jars compile fileTree(dir: "${rootDir}/maxkey-lib/", include: '*.jar') //阿里云 diff --git a/gradle.properties b/gradle.properties index 3743c8175..4533cb364 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,3 +16,7 @@ bouncycastleVersion =1.64 httpcomponentsVersion =4.5.12 poiVersion =4.1.2 jibGradlePluginVersion =2.7.0 +swaggerVersion =1.6.2 +swaggerV3Version =2.1.6 +springfoxVersion =3.0.0 +knife4jVersion =3.0.2 \ No newline at end of file diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/signature/DsaSigner.java b/maxkey-core/src/main/java/org/maxkey/crypto/signature/DsaSigner.java index 0e8234bc7..fef6b7132 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/signature/DsaSigner.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/signature/DsaSigner.java @@ -37,7 +37,7 @@ import org.maxkey.crypto.KeyPairType; * @author Crystal.Sea * */ -public final class DsaSigner implements Signer { +public final class DsaSigner implements ISigner { // ����ǩ����Կ�㷨 public static final KeyPairType KEY_ALGORITHM = KeyPairType.DSA; diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/signature/Signer.java b/maxkey-core/src/main/java/org/maxkey/crypto/signature/ISigner.java similarity index 97% rename from maxkey-core/src/main/java/org/maxkey/crypto/signature/Signer.java rename to maxkey-core/src/main/java/org/maxkey/crypto/signature/ISigner.java index e0f9fe32e..4aef073b6 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/signature/Signer.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/signature/ISigner.java @@ -34,7 +34,7 @@ package org.maxkey.crypto.signature; * @author Crystal.Sea * */ -public interface Signer { +public interface ISigner { public byte[] sign(byte[] data,byte[] privateKey)throws Exception; diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/signature/RsaSigner.java b/maxkey-core/src/main/java/org/maxkey/crypto/signature/RsaSigner.java index 14a8d160a..df255dc9a 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/signature/RsaSigner.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/signature/RsaSigner.java @@ -39,7 +39,7 @@ import org.maxkey.crypto.KeyPairType; * */ -public final class RsaSigner implements Signer { +public final class RsaSigner implements ISigner { public static final KeyPairType KEY_ALGORTHM = KeyPairType.RSA; diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java index b10e0787a..d6c3b3811 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java @@ -34,10 +34,14 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + /** * @author Crystal.Sea * https://apereo.github.io/cas/6.2.x/protocol/CAS-Protocol-Specification.html */ +@Api(tags = "CAS API文档模块") @Controller public class Cas10AuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ @@ -77,6 +81,7 @@ renew [OPTIONAL] - if this parameter is set, ticket validation will only succeed no */ + @ApiOperation(value = "CAS 1.0 ticket验证接口", notes = "通过ticket获取当前登录用户信息",httpMethod="POST") @RequestMapping("/authz/cas/validate") @ResponseBody public String validate( diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java b/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java index db1732049..ddb8a8e05 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java @@ -72,6 +72,14 @@ public class MaxKeyMvcConfig implements WebMvcConfigurer { .addResourceLocations("classpath:/static/"); registry.addResourceHandler("/templates/**") .addResourceLocations("classpath:/templates/"); + + registry.addResourceHandler("swagger-ui.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); _logger.debug("add addResourceHandler"); } diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/SwaggerConfig.java b/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/SwaggerConfig.java new file mode 100644 index 000000000..1a0b4cfbb --- /dev/null +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/SwaggerConfig.java @@ -0,0 +1,73 @@ +package org.maxkey.autoconfigure; + +import java.util.ArrayList; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.oas.annotations.EnableOpenApi; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@EnableOpenApi +@EnableKnife4j +@MapperScan(basePackages = {"org.maxkey"}) +public class SwaggerConfig { + + @Value("${maxkey.swagger.title}") + String title; + + @Value("${maxkey.swagger.description}") + String description; + + @Value("${maxkey.swagger.version}") + String version; + + @Value("${maxkey.swagger.enable}") + boolean enable; + + @Bean + public Docket docket(){ + if(enable) { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("org.maxkey") + .and(RequestHandlerSelectors.withClassAnnotation(Api.class)) + .and(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))) + .paths(PathSelectors.any()) + .build(); + }else { + return null; + } + + } + + // 配置swagger信息 + private ApiInfo apiInfo() { + Contact contact = new Contact( + "MaxKey.top", + "https://www.maxkey.top/", + "maxkeysupport@163.com"); + + return new ApiInfo( + title, + description, + version, + "https://www.maxkey.top/", + contact, + "Apache License, Version 2.0", + "http://www.apache.org/licenses/LICENSE-2.0", + new ArrayList()); + } +} diff --git a/maxkey-web-maxkey/src/main/resources/META-INF/spring.factories b/maxkey-web-maxkey/src/main/resources/META-INF/spring.factories index 64a35b634..d2d4f76c2 100644 --- a/maxkey-web-maxkey/src/main/resources/META-INF/spring.factories +++ b/maxkey-web-maxkey/src/main/resources/META-INF/spring.factories @@ -8,4 +8,7 @@ org.maxkey.autoconfigure.CasAutoConfiguration,\ org.maxkey.autoconfigure.Oauth20AutoConfiguration,\ org.maxkey.autoconfigure.Saml20AutoConfiguration,\ org.maxkey.autoconfigure.SocialSignOnAutoConfiguration,\ +org.maxkey.autoconfigure.SwaggerConfig,\ org.maxkey.MaxKeyMvcConfig + + diff --git a/maxkey-web-maxkey/src/main/resources/application.properties b/maxkey-web-maxkey/src/main/resources/application.properties index 71397932e..1316de960 100644 --- a/maxkey-web-maxkey/src/main/resources/application.properties +++ b/maxkey-web-maxkey/src/main/resources/application.properties @@ -109,3 +109,10 @@ spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.Strin spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer # \u81ea\u5b9a\u4e49\u5206\u533a\u5668 # spring.kafka.producer.properties.partitioner.class=com.felix.kafka.producer.CustomizePartitioner + +#springfox.documentation.swagger.v2.path=/api-docs +#Swagger Configure Properties +maxkey.swagger.enable=true +maxkey.swagger.title=MaxKey\u5355\u70b9\u767b\u5f55\u8ba4\u8bc1\u7cfb\u7edfapi\u6587\u6863 +maxkey.swagger.description=MaxKey\u5355\u70b9\u767b\u5f55\u8ba4\u8bc1\u7cfb\u7edfapi\u6587\u6863 +maxkey.swagger.version=${application.formatted-version} \ No newline at end of file