From ebee4ddb7c424d88b24ce4279b02447a8ba83987 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 8 May 2022 17:43:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B6=E5=AE=9A=20OAuth2=20=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E7=9A=84=E8=A1=A8=E7=BB=93=E6=9E=84=E4=B8=8E=20API=20?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/api/auth/OAuth2Api.java | 12 ++++ .../controller/admin/auth/AuthController.java | 2 +- .../admin/auth/OAuth2Controller.java | 24 +++++++ .../dataobject/auth/OAuth2AccessTokenDO.java | 15 ++--- .../dataobject/auth/OAuth2ApplicationDO.java | 65 +++++++++++++++++++ .../dal/dataobject/auth/OAuth2CodeDO.java | 62 ++++++++++++++++++ .../dal/dataobject/auth/UserSessionDO.java | 1 + .../system/service/auth/AdminAuthService.java | 1 - .../service/auth/AdminOAuth2Service.java | 14 ++++ .../service/auth/OAuth2CodeService.java | 11 ++++ .../service/auth/OAuth2ServiceImpl.java | 4 +- ...h2Service.java => OAuth2TokenService.java} | 6 +- 12 files changed, 203 insertions(+), 14 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2Api.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/OAuth2Controller.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2ApplicationDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2CodeDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminOAuth2Service.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2CodeService.java rename yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/{OAuth2Service.java => OAuth2TokenService.java} (69%) diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2Api.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2Api.java new file mode 100644 index 000000000..973466e55 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/auth/OAuth2Api.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.system.api.auth; + +/** + * OAuth2.0 API 接口 + * + * @author 芋道源码 + */ +public interface OAuth2Api { + + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 2b494a9a1..ce9e58e8d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -40,7 +40,7 @@ import static java.util.Collections.singleton; @Api(tags = "管理后台 - 认证") @RestController -@RequestMapping("/system/auth") // 暂时不跟 /auth 结尾 +@RequestMapping("/system/auth") @Validated @Slf4j public class AuthController { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/OAuth2Controller.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/OAuth2Controller.java new file mode 100644 index 000000000..d82731aab --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/OAuth2Controller.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.system.controller.admin.auth; + +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "管理后台 - OAuth2.0 授权") +@RestController +@RequestMapping("/system/oauth2") +@Validated +@Slf4j +public class OAuth2Controller { + +// POST oauth/token TokenEndpoint:Password、Implicit、Code、Refresh Token + +// POST oauth/check_token CheckTokenEndpoint + +// DELETE oauth/token ConsumerTokenServices#revokeToken + +// GET oauth/authorize AuthorizationEndpoint + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2AccessTokenDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2AccessTokenDO.java index 63e251335..b8a63c1e1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2AccessTokenDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2AccessTokenDO.java @@ -10,8 +10,9 @@ import lombok.experimental.Accessors; import java.util.Date; /** - * OAuth2 访问令牌 + * OAuth2 访问令牌 DO * + * @author 芋道源码 */ @TableName("system_oauth2_access_token") @Data @@ -20,7 +21,7 @@ import java.util.Date; public class OAuth2AccessTokenDO extends BaseDO { /** - * 编号,数据库字典 + * 编号,数据库递增 */ private Long id; /** @@ -38,18 +39,14 @@ public class OAuth2AccessTokenDO extends BaseDO { */ private Integer userType; /** - * 刷新令牌 + * 应用编号 * - * 关联 {@link OAuth2RefreshTokenDO#getRefreshToken()} + * 关联 {@link OAuth2ApplicationDO#getId()} */ - private String refreshToken; + private Long applicationId; /** * 过期时间 */ private Date expiresTime; - /** - * 创建 IP - */ - private String createIp; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2ApplicationDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2ApplicationDO.java new file mode 100644 index 000000000..20a2b6087 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2ApplicationDO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.auth; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * OAuth2 客户端 DO + * + * 为什么不使用 Client 作为表名? + * 1. clientId 字段被占用,导致表的 id 无法有合适的缩写 + * 2. 大多数 Github、Gitee 等平台,都会习惯称为第三方接入应用 + * + * 如下字段,考虑到使用相对不是很高频,主要是一些开关,暂时不支持: + * authorized_grant_types、authorities、access_token_validity、refresh_token_validity、additional_information、autoapprove、resource_ids、scope + * + * @author 芋道源码 + */ +@TableName("system_oauth2_application") +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2ApplicationDO extends BaseDO { + + /** + * 编号,数据库递增 + */ + private Long id; + /** + * 客户端编号 + */ + private String clientId; + /** + * 客户端密钥 + */ + private String clientSecret; + /** + * 可重定向的 URI 地址 + */ + private List redirectUris; + /** + * 应用名 + */ + private String name; + /** + * 应用图标 + */ + private String logo; + /** + * 应用描述 + */ + private String description; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2CodeDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2CodeDO.java new file mode 100644 index 000000000..293bd0a41 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/OAuth2CodeDO.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.auth; + +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * OAuth2 授权码 DO + * + * @author 芋道源码 + */ +@TableName("system_oauth2_code") +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2CodeDO extends BaseDO { + + /** + * 编号,数据库递增 + */ + private Long id; + /** + * 授权码 + */ + private String code; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 应用编号 + * + * 关联 {@link OAuth2ApplicationDO#getId()} + */ + private Long applicationId; + /** + * 刷新令牌 + * + * 关联 {@link OAuth2RefreshTokenDO#getRefreshToken()} + */ + private String refreshToken; + /** + * 过期时间 + */ + private Date expiresTime; + /** + * 创建 IP + */ + private String createIp; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/UserSessionDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/UserSessionDO.java index 9249dc22d..57863cb9b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/UserSessionDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/auth/UserSessionDO.java @@ -24,6 +24,7 @@ import java.util.Date; @Data @Builder @EqualsAndHashCode(callSuper = true) +@Deprecated public class UserSessionDO extends BaseDO { /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java index cf01334e8..46855e593 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.system.service.auth; -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*; import javax.validation.Valid; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminOAuth2Service.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminOAuth2Service.java new file mode 100644 index 000000000..5c10cdfb8 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminOAuth2Service.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.system.service.auth; + +/** + * 管理后台的 OAuth2 Service 接口 + * + * 将自身的 AdminUser 用户,授权给第三方应用,采用 OAuth2.0 的协议。 + * + * 问题:为什么自身也作为一个第三方应用,也走这套流程呢? + * 回复:当然可以这么做,采用 Implicit 模式。考虑到大多数开发者使用不到这个特性,OAuth2.0 毕竟有一定学习成本,所以暂时没有采取这种方式。 + * + * @author 芋道源码 + */ +public interface AdminOAuth2Service { +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2CodeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2CodeService.java new file mode 100644 index 000000000..f8a788eb0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2CodeService.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.module.system.service.auth; + +/** + * OAuth2.0 授权码 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 JdbcAuthorizationCodeServices 的功能,提供授权码的操作 + * + * @author 芋道源码 + */ +public class OAuth2CodeService { +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2ServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2ServiceImpl.java index 7718f36e1..da08b0a57 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2ServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2ServiceImpl.java @@ -5,10 +5,12 @@ import org.springframework.stereotype.Service; /** * OAuth2.0 Service 实现类 * + * + * * @author 芋道源码 */ @Service -public class OAuth2ServiceImpl implements OAuth2Service { +public class OAuth2ServiceImpl implements OAuth2TokenService { // @Autowired // private SystemBizProperties systemBizProperties; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2Service.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2TokenService.java similarity index 69% rename from yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2Service.java rename to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2TokenService.java index 030bef8f6..7e6bed380 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2Service.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/OAuth2TokenService.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.system.service.auth; /** - * OAuth2.0 Service 接口 + * OAuth2.0 Token Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 JdbcTokenStore 的功能,提供访问令牌、刷新令牌的操作 * * @author 芋道源码 */ -public interface OAuth2Service { +public interface OAuth2TokenService { // OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String createIp); //