From b81ae21cb570b2f53f640078ebd551328e3bac92 Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Mon, 30 Dec 2024 18:19:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth2/endpoint/OAuth2TokenEndPoint.java | 182 ++++++++++++++++++ .../service/impl/WorkOrderServiceImpl.java | 2 +- 2 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/springblade/core/oauth2/endpoint/OAuth2TokenEndPoint.java diff --git a/src/main/java/org/springblade/core/oauth2/endpoint/OAuth2TokenEndPoint.java b/src/main/java/org/springblade/core/oauth2/endpoint/OAuth2TokenEndPoint.java new file mode 100644 index 0000000..dac8efa --- /dev/null +++ b/src/main/java/org/springblade/core/oauth2/endpoint/OAuth2TokenEndPoint.java @@ -0,0 +1,182 @@ +package org.springblade.core.oauth2.endpoint; + +import com.wf.captcha.SpecCaptcha; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Generated; +import org.springblade.core.cache.utils.CacheUtil; +import org.springblade.core.jwt.JwtUtil; +import org.springblade.core.jwt.props.JwtProperties; +import org.springblade.core.launch.props.BladeProperties; +import org.springblade.core.log.annotation.ApiLog; +import org.springblade.core.oauth2.exception.OAuth2Exception; +import org.springblade.core.oauth2.granter.TokenGranter; +import org.springblade.core.oauth2.granter.TokenGranterFactory; +import org.springblade.core.oauth2.handler.AuthorizationHandler; +import org.springblade.core.oauth2.handler.TokenHandler; +import org.springblade.core.oauth2.provider.OAuth2Request; +import org.springblade.core.oauth2.provider.OAuth2Response; +import org.springblade.core.oauth2.provider.OAuth2Token; +import org.springblade.core.oauth2.provider.OAuth2Validation; +import org.springblade.core.oauth2.service.OAuth2User; +import org.springblade.core.oauth2.utils.OAuth2ExceptionUtil; +import org.springblade.core.oauth2.utils.OAuth2LogUtil; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.support.Kv; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; +import java.util.UUID; + +@RestController +@Tag( + name = "用户授权认证", + description = "1 - OAuth2授权认证端点" +) +public class OAuth2TokenEndPoint { + private final BladeRedis bladeRedis; + private final JwtProperties jwtProperties; + private final BladeProperties bladeProperties; + private final TokenGranterFactory granterFactory; + private final AuthorizationHandler authorizationHandler; + private final TokenHandler tokenHandler; + + @PostMapping({"/oauth/token"}) + @Operation( + summary = "获取Token", + description = "OAuth2认证接口", + parameters = {@Parameter( + in = ParameterIn.QUERY, + name = "username", + description = "账号", + schema = @Schema( + type = "string" + ) + ), @Parameter( + in = ParameterIn.QUERY, + name = "password", + description = "密码", + schema = @Schema( + type = "string" + ) + ), @Parameter( + in = ParameterIn.QUERY, + name = "grant_type", + description = "授权类型", + schema = @Schema( + type = "string" + ) + ), @Parameter( + in = ParameterIn.QUERY, + name = "refresh_token", + description = "刷新token", + schema = @Schema( + type = "string" + ) + ), @Parameter( + in = ParameterIn.QUERY, + name = "scope", + description = "权限范围", + schema = @Schema( + type = "string" + ) + )} + ) + @ApiLog(value = "登录") + public ResponseEntity token() { + OAuth2Request request = OAuth2Request.create().buildArgs(); + OAuth2Validation preValidation = this.authorizationHandler.preValidation(request); + if (!preValidation.isSuccess()) { + this.authorizationHandler.preFailure(request, preValidation); + return ResponseEntity.ok(OAuth2Response.create().ofFailure(preValidation.getCode(), preValidation.getMessage())); + } else { + TokenGranter tokenGranter = this.granterFactory.create(request.getGrantType()); + + OAuth2User user; + try { + user = tokenGranter.user(request); + } catch (OAuth2Exception var8) { + OAuth2LogUtil.logOAuth2Exception(var8, request, this.bladeProperties.isProd()); + this.authorizationHandler.preFailure(request, OAuth2Validation.create().setSuccess(false).setCode(var8.getExceptionCode().getCode()).setMessage(var8.getMessage())); + return ResponseEntity.ok(OAuth2Response.create().ofFailure(var8.getExceptionCode().getCode(), var8.getMessage())); + } + + OAuth2Validation authValidation = this.authorizationHandler.authValidation(user, request); + if (!authValidation.isSuccess()) { + this.authorizationHandler.authFailure(user, request, authValidation); + OAuth2ExceptionUtil.throwFromCode(authValidation.getCode()); + } + + OAuth2Token token = tokenGranter.token(user, request); + OAuth2Token enhanceToken = this.tokenHandler.enhance(user, token, request); + this.authorizationHandler.authSuccessful(user, request); + return ResponseEntity.ok(enhanceToken.getArgs()); + } + } + + @GetMapping({"/oauth/logout"}) + @Operation( + summary = "退出登录" + ) + public ResponseEntity logout() { + BladeUser user = AuthUtil.getUser(); + if (user != null && this.jwtProperties.getState()) { + OAuth2Request request = OAuth2Request.create().buildHeaderArgs(); + String token = JwtUtil.getToken(request.getToken()); + JwtUtil.removeAccessToken(user.getTenantId(), user.getClientId(), String.valueOf(user.getUserId()), token); + JwtUtil.removeRefreshToken(user.getTenantId(), user.getClientId(), String.valueOf(user.getUserId()), token); + } + + return ResponseEntity.ok(OAuth2Response.create().ofSuccessful("退出登录成功")); + } + + @GetMapping({"/oauth/captcha"}) + @Operation( + summary = "获取验证码" + ) + public ResponseEntity captcha() { + SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5); + String verCode = specCaptcha.text().toLowerCase(); + String key = UUID.randomUUID().toString(); + this.bladeRedis.setEx("blade:auth::blade:captcha:" + key, verCode, Duration.ofMinutes(30L)); + return ResponseEntity.ok(OAuth2Response.create().ofSuccessful("获取验证码成功").set("key", key).set("image", specCaptcha.toBase64())); + } + + @GetMapping({"/oauth/clear-cache"}) + @Operation( + summary = "清除缓存" + ) + public ResponseEntity clearCache() { + CacheUtil.clear("blade:biz"); + CacheUtil.clear("blade:user"); + CacheUtil.clear("blade:dict"); + CacheUtil.clear("blade:flow"); + CacheUtil.clear("blade:sys"); + CacheUtil.clear("blade:param"); + CacheUtil.clear("blade:resource"); + CacheUtil.clear("blade:menu"); + CacheUtil.clear("blade:dict", Boolean.FALSE); + CacheUtil.clear("blade:menu", Boolean.FALSE); + CacheUtil.clear("blade:sys", Boolean.FALSE); + CacheUtil.clear("blade:param", Boolean.FALSE); + return ResponseEntity.ok(OAuth2Response.create().ofSuccessful("清除缓存成功")); + } + + @Generated + public OAuth2TokenEndPoint(final BladeRedis bladeRedis, final JwtProperties jwtProperties, final BladeProperties bladeProperties, final TokenGranterFactory granterFactory, final AuthorizationHandler authorizationHandler, final TokenHandler tokenHandler) { + this.bladeRedis = bladeRedis; + this.jwtProperties = jwtProperties; + this.bladeProperties = bladeProperties; + this.granterFactory = granterFactory; + this.authorizationHandler = authorizationHandler; + this.tokenHandler = tokenHandler; + } +} diff --git a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java index 54539d6..475040e 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java @@ -114,7 +114,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl