diff --git a/common/mall-spring-boot-starter-swagger/pom.xml b/common/mall-spring-boot-starter-swagger/pom.xml deleted file mode 100644 index ef018146..00000000 --- a/common/mall-spring-boot-starter-swagger/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - common - cn.iocoder.mall - 1.0-SNAPSHOT - - 4.0.0 - - mall-spring-boot-starter-swagger - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - - com.github.xiaoymin - knife4j-spring-boot-starter - - - - diff --git a/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/config/SwaggerAutoConfiguration.java b/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/config/SwaggerAutoConfiguration.java deleted file mode 100644 index fc7c887a..00000000 --- a/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/config/SwaggerAutoConfiguration.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.iocoder.mall.swagger.config; - -import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - * 简单的 Swagger2 自动配置类 - * - * 较为完善的,可以了解 https://mvnrepository.com/artifact/com.spring4all/spring-boot-starter-swagger - */ -@Configuration -@EnableSwagger2 -@EnableKnife4j -@ConditionalOnClass({Docket.class, ApiInfoBuilder.class}) -@ConditionalOnProperty(prefix = "swagger", value = "enable", matchIfMissing = true) // 允许使用 swagger.enable=false 禁用 Swagger -@EnableConfigurationProperties(SwaggerProperties.class) -public class SwaggerAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public SwaggerProperties swaggerProperties() { - return new SwaggerProperties(); - } - - @Bean - public Docket createRestApi() { - SwaggerProperties properties = swaggerProperties(); - // 创建 Docket 对象 - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo(properties)) - .select() - .apis(RequestHandlerSelectors.basePackage(properties.getBasePackage())) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo(SwaggerProperties properties) { - return new ApiInfoBuilder() - .title(properties.getTitle()) - .description(properties.getDescription()) - .version(properties.getVersion()) - .build(); - } - -} diff --git a/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/config/SwaggerProperties.java b/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/config/SwaggerProperties.java deleted file mode 100644 index 3c7c5739..00000000 --- a/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/config/SwaggerProperties.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.mall.swagger.config; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties("swagger") -public class SwaggerProperties { - - private String title; - private String description; - private String version; - private String basePackage; - - public String getTitle() { - return title; - } - - public SwaggerProperties setTitle(String title) { - this.title = title; - return this; - } - - public String getDescription() { - return description; - } - - public SwaggerProperties setDescription(String description) { - this.description = description; - return this; - } - - public String getVersion() { - return version; - } - - public SwaggerProperties setVersion(String version) { - this.version = version; - return this; - } - - public String getBasePackage() { - return basePackage; - } - - public SwaggerProperties setBasePackage(String basePackage) { - this.basePackage = basePackage; - return this; - } -} diff --git a/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/package-info.java b/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/package-info.java deleted file mode 100644 index e30eadec..00000000 --- a/common/mall-spring-boot-starter-swagger/src/main/java/cn/iocoder/mall/swagger/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 无情的占位类 - */ -package cn.iocoder.mall.swagger; diff --git a/common/mall-spring-boot-starter-swagger/src/main/resources/META-INF/spring.factories b/common/mall-spring-boot-starter-swagger/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 28fc2dc2..00000000 --- a/common/mall-spring-boot-starter-swagger/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - cn.iocoder.mall.swagger.config.SwaggerAutoConfiguration diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java index e61bdfc6..e9045c76 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.security.core.handler.AuthenticationEntryPoint import cn.iocoder.yudao.framework.security.core.service.SecurityFrameworkService; import cn.iocoder.yudao.framework.security.core.service.SecurityFrameworkServiceImpl; import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; -import cn.iocoder.yudao.module.system.api.auth.OAuth2TokenApi; +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; import cn.iocoder.yudao.module.system.api.permission.PermissionApi; import org.springframework.beans.factory.config.MethodInvokingFactoryBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java index e5932400..11b82a12 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java @@ -10,8 +10,8 @@ import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; -import cn.iocoder.yudao.module.system.api.auth.OAuth2TokenApi; -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenCheckRespDTO; +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; import lombok.RequiredArgsConstructor; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.filter.OncePerRequestFilter; @@ -69,7 +69,10 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { private LoginUser buildLoginUserByToken(String token, Integer userType) { try { - OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); + // 校验访问令牌 + CommonResult accessTokenResult = oauth2TokenApi.checkAccessToken(token); + accessTokenResult.checkError(); + OAuth2AccessTokenCheckRespDTO accessToken = accessTokenResult.getData(); if (accessToken == null) { return null; } diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java index 514ed738..8b0815b7 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java @@ -22,6 +22,8 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.Collections; import java.util.List; +import static springfox.documentation.builders.RequestHandlerSelectors.basePackage; + /** * Swagger2 自动配置类 * @@ -56,7 +58,7 @@ public class YudaoSwaggerAutoConfiguration { .apiInfo(apiInfo(properties)) // 设置扫描指定 package 包下的 .select() -// .apis(basePackage(properties.getBasePackage())) + .apis(basePackage(properties.getBasePackage())) // .apis(basePackage("cn.iocoder.yudao.module.system")) // 可用于 swagger 无法展示时使用 .paths(PathSelectors.any()) .build() diff --git a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/GatewayServerApplication.java b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/GatewayServerApplication.java index ff4b97f0..5ad84475 100644 --- a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/GatewayServerApplication.java +++ b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/GatewayServerApplication.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.gateway; -import cn.iocoder.yudao.module.system.api.auth.OAuth2TokenApi; +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; diff --git a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/TokenAuthenticationFilter.java b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/TokenAuthenticationFilter.java index 3b964231..7113b88d 100644 --- a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/TokenAuthenticationFilter.java +++ b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/TokenAuthenticationFilter.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.gateway.filter; -import cn.iocoder.yudao.module.system.api.auth.OAuth2TokenApi; -import org.springframework.beans.factory.annotation.Autowired; +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; diff --git a/yudao-module-system/yudao-module-system-api/pom.xml b/yudao-module-system/yudao-module-system-api/pom.xml index 1c1215f0..f125b277 100644 --- a/yudao-module-system/yudao-module-system-api/pom.xml +++ b/yudao-module-system/yudao-module-system-api/pom.xml @@ -22,6 +22,13 @@ yudao-common + + + io.swagger + swagger-annotations + true + + org.springframework.boot diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2TokenApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2TokenApi.java deleted file mode 100644 index a769a431..00000000 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2TokenApi.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.yudao.module.system.api.auth; - -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenCheckRespDTO; -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenCreateReqDTO; -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenRespDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import javax.validation.Valid; - -/** - * OAuth2.0 Token API 接口 - * - * @author 芋道源码 - */ -@FeignClient(name = "system-server") // TODO 芋艿:fallbackFactory = -public interface OAuth2TokenApi { - - /** - * 创建访问令牌 - * - * @param reqDTO 访问令牌的创建信息 - * @return 访问令牌的信息 - */ - @GetMapping("/tmp") - OAuth2AccessTokenRespDTO createAccessToken(@Valid OAuth2AccessTokenCreateReqDTO reqDTO); - - /** - * 校验访问令牌 - * - * @param accessToken 访问令牌 - * @return 访问令牌的信息 - */ - @GetMapping("/app-api/check") - OAuth2AccessTokenCheckRespDTO checkAccessToken(@RequestParam("accessToken") String accessToken); - - /** - * 移除访问令牌 - * - * @param accessToken 访问令牌 - * @return 访问令牌的信息 - */ - @GetMapping("/tmp2") - OAuth2AccessTokenRespDTO removeAccessToken(String accessToken); - - /** - * 刷新访问令牌 - * - * @param refreshToken 刷新令牌 - * @param clientId 客户端编号 - * @return 访问令牌的信息 - */ - @GetMapping("/tmp3") - OAuth2AccessTokenRespDTO refreshAccessToken(@RequestParam("refreshToken") String refreshToken, - @RequestParam("clientId") String clientId); - -} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenCheckRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenCheckRespDTO.java deleted file mode 100644 index 5b708ff6..00000000 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenCheckRespDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.system.api.auth.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * OAuth2.0 访问令牌的校验 Response DTO - * - * @author 芋道源码 - */ -@Data -public class OAuth2AccessTokenCheckRespDTO implements Serializable { - - /** - * 用户编号 - */ - private Long userId; - /** - * 用户类型 - */ - private Integer userType; - /** - * 租户编号 - */ - private Long tenantId; - /** - * 授权范围的数组 - */ - private List scopes; - -} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenRespDTO.java deleted file mode 100644 index 76895559..00000000 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenRespDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.system.api.auth.dto; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * OAuth2.0 访问令牌的信息 Response DTO - * - * @author 芋道源码 - */ -@Data -@Accessors(chain = true) -public class OAuth2AccessTokenRespDTO implements Serializable { - - /** - * 访问令牌 - */ - private String accessToken; - /** - * 刷新令牌 - */ - private String refreshToken; - /** - * 用户编号 - */ - private Long userId; - /** - * 用户类型 - */ - private Integer userType; - /** - * 过期时间 - */ - private Date expiresTime; - -} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApi.java new file mode 100644 index 00000000..2763441f --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApi.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.system.api.oauth2; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import cn.iocoder.yudao.module.system.enums.ApiConstants; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@FeignClient(name = "system-server") // TODO 芋艿:fallbackFactory = +@Api(tags = "RPC 服务 - OAuth2.0 令牌") +public interface OAuth2TokenApi { + + String API_PREFIX = ApiConstants.API_PREFIX + "/oauth2/token"; + + @PostMapping(API_PREFIX + "/create") + @ApiOperation("创建访问令牌") + CommonResult createAccessToken(@Valid @RequestBody OAuth2AccessTokenCreateReqDTO reqDTO); + + @GetMapping(API_PREFIX + "/check") + @ApiOperation("校验访问令牌") + @ApiImplicitParam(name = "accessToken", value = "访问令牌", required = true, example = "tudou") + CommonResult checkAccessToken(@RequestParam("accessToken") String accessToken); + + @DeleteMapping(API_PREFIX + "/remove") + @ApiOperation("移除访问令牌") + @ApiImplicitParam(name = "accessToken", value = "访问令牌", required = true, example = "tudou") + CommonResult removeAccessToken(@RequestParam("accessToken") String accessToken); + + @PutMapping(API_PREFIX + "/refresh") + @ApiOperation("刷新访问令牌") + @ApiImplicitParams({ + @ApiImplicitParam(name = "refreshToken", value = "刷新令牌", required = true, example = "haha"), + @ApiImplicitParam(name = "clientId", value = "客户端编号", required = true, example = "yudaoyuanma") + }) + CommonResult refreshAccessToken(@RequestParam("refreshToken") String refreshToken, + @RequestParam("clientId") String clientId); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java new file mode 100644 index 00000000..4cb3f860 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.system.api.oauth2.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@ApiModel("RPC 服务 - OAuth2.0 访问令牌的校验 Response DTO") +@Data +public class OAuth2AccessTokenCheckRespDTO implements Serializable { + + @ApiModelProperty(value = "用户编号", required = true, example = "10") + private Long userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "1", notes = "参见 UserTypeEnum 枚举") + private Integer userType; + + @ApiModelProperty(value = "租户编号", required = true, example = "1024") + private Long tenantId; + + @ApiModelProperty(value = "授权范围的数组", example = "user_info") + private List scopes; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenCreateReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java similarity index 53% rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenCreateReqDTO.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java index 1d9b793d..2fde8a27 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/dto/OAuth2AccessTokenCreateReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java @@ -1,40 +1,33 @@ -package cn.iocoder.yudao.module.system.api.auth.dto; +package cn.iocoder.yudao.module.system.api.oauth2.dto; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.List; -/** - * OAuth2.0 访问令牌创建 Request DTO - * - * @author 芋道源码 - */ +@ApiModel("RPC 服务 - OAuth2.0 访问令牌创建 Request DTO") @Data public class OAuth2AccessTokenCreateReqDTO implements Serializable { - /** - * 用户编号 - */ + @ApiModelProperty(value = "用户编号", required = true, example = "10") @NotNull(message = "用户编号不能为空") private Long userId; - /** - * 用户类型 - */ + + @ApiModelProperty(value = "用户类型", required = true, example = "1", notes = "参见 UserTypeEnum 枚举") @NotNull(message = "用户类型不能为空") @InEnum(value = UserTypeEnum.class, message = "用户类型必须是 {value}") private Integer userType; - /** - * 客户端编号 - */ + + @ApiModelProperty(value = "客户端编号", required = true, example = "yudaoyuanma") @NotNull(message = "客户端编号不能为空") private String clientId; - /** - * 授权范围 - */ + + @ApiModelProperty(value = "授权范围的数组", example = "user_info") private List scopes; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java new file mode 100644 index 00000000..11850657 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.api.oauth2.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@ApiModel("RPC 服务 - OAuth2.0 访问令牌的信息 Response DTO") +@Data +@Accessors(chain = true) +public class OAuth2AccessTokenRespDTO implements Serializable { + + @ApiModelProperty(value = "访问令牌", required = true, example = "tudou") + private String accessToken; + + @ApiModelProperty(value = "刷新令牌", required = true, example = "haha") + private String refreshToken; + + @ApiModelProperty(value = "用户编号", required = true, example = "10") + private Long userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "1", notes = "参见 UserTypeEnum 枚举") + private Integer userType; + + @ApiModelProperty(value = "过期时间", required = true) + private Date expiresTime; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ApiConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ApiConstants.java new file mode 100644 index 00000000..e81335f3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ApiConstants.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.system.enums; + +/** + * API 相关的枚举 + * + * @author 芋道源码 + */ +public class ApiConstants { + + public static final String API_PREFIX = "/rpc-api/system"; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2TokenApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2TokenApiImpl.java deleted file mode 100644 index 3eec3fc1..00000000 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2TokenApiImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.yudao.module.system.api.auth; - -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenCheckRespDTO; -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenCreateReqDTO; -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenRespDTO; -import cn.iocoder.yudao.module.system.convert.auth.OAuth2TokenConvert; -import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; -import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService; -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * OAuth2.0 Token API 实现类 - * - * @author 芋道源码 - */ -@RestController -public class OAuth2TokenApiImpl implements OAuth2TokenApi { - - @Resource - private OAuth2TokenService oauth2TokenService; - - @Override - public OAuth2AccessTokenRespDTO createAccessToken(OAuth2AccessTokenCreateReqDTO reqDTO) { - OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken( - reqDTO.getUserId(), reqDTO.getUserType(), reqDTO.getClientId(), reqDTO.getScopes()); - return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); - } - - @Override - public OAuth2AccessTokenCheckRespDTO checkAccessToken(String accessToken) { - return OAuth2TokenConvert.INSTANCE.convert(oauth2TokenService.checkAccessToken(accessToken)); - } - - @Override - public OAuth2AccessTokenRespDTO removeAccessToken(String accessToken) { - OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(accessToken); - return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); - } - - @Override - public OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId) { - OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId); - return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); - } - -} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApiImpl.java new file mode 100644 index 00000000..c2b53637 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/oauth2/OAuth2TokenApiImpl.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.system.api.oauth2; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import cn.iocoder.yudao.module.system.convert.auth.OAuth2TokenConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@RestController // 提供 RESTful API 接口,给 Feign 调用 +@Validated +public class OAuth2TokenApiImpl implements OAuth2TokenApi { + + @Resource + private OAuth2TokenService oauth2TokenService; + + @Override + @ApiOperation("创建访问令牌") + public CommonResult createAccessToken(@RequestBody OAuth2AccessTokenCreateReqDTO reqDTO) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken( + reqDTO.getUserId(), reqDTO.getUserType(), reqDTO.getClientId(), reqDTO.getScopes()); + return success(OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO)); + } + + @Override + public CommonResult checkAccessToken(String accessToken) { + return success(OAuth2TokenConvert.INSTANCE.convert(oauth2TokenService.checkAccessToken(accessToken))); + } + + @Override + public CommonResult removeAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(accessToken); + return success(OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO)); + } + + @Override + public CommonResult refreshAccessToken(String refreshToken, String clientId) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId); + return success(OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/OAuth2TokenConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/OAuth2TokenConvert.java index 50a6b977..17c62f0d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/OAuth2TokenConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/OAuth2TokenConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.system.convert.auth; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenCheckRespDTO; -import cn.iocoder.yudao.module.system.api.auth.dto.OAuth2AccessTokenRespDTO; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; import org.mapstruct.Mapper; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/security/config/SecurityConfiguration.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/security/config/SecurityConfiguration.java index c81809b2..87443ace 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/security/config/SecurityConfiguration.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/security/config/SecurityConfiguration.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.framework.security.config; import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer; +import cn.iocoder.yudao.module.system.enums.ApiConstants; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -38,6 +39,18 @@ public class SecurityConfiguration { // OAuth2 API registry.antMatchers(buildAdminApi("/system/oauth2/token")).permitAll(); registry.antMatchers(buildAdminApi("/system/oauth2/check-token")).permitAll(); + + // TODO 芋艿:这个每个项目都需要重复配置,得捉摸有没通用的方案 + // Swagger 接口文档 + registry.antMatchers("/swagger-ui.html").anonymous() + .antMatchers("/swagger-resources/**").anonymous() + .antMatchers("/webjars/**").anonymous() + .antMatchers("/*/api-docs").anonymous(); + // Spring Boot Actuator 的安全配置 + registry.antMatchers("/actuator").anonymous() + .antMatchers("/actuator/**").anonymous(); + // RPC 服务的安全配置 + registry.antMatchers(ApiConstants.API_PREFIX + "/**").anonymous(); } }; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application.yaml index 7e33378a..79d5599e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application.yaml @@ -73,7 +73,7 @@ mybatis-plus: yudao: info: version: 1.0.0 - base-package: cn.iocoder.yudao + base-package: cn.iocoder.yudao.module.system web: admin-api: prefix: /admin-api