制定 OAuth2 协议的表结构与 API 设计

This commit is contained in:
YunaiV 2022-05-08 17:43:24 +08:00
parent 5e8648508e
commit ebee4ddb7c
12 changed files with 203 additions and 14 deletions

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.system.api.auth;
/**
* OAuth2.0 API 接口
*
* @author 芋道源码
*/
public interface OAuth2Api {
}

View File

@ -40,7 +40,7 @@ import static java.util.Collections.singleton;
@Api(tags = "管理后台 - 认证") @Api(tags = "管理后台 - 认证")
@RestController @RestController
@RequestMapping("/system/auth") // 暂时不跟 /auth 结尾 @RequestMapping("/system/auth")
@Validated @Validated
@Slf4j @Slf4j
public class AuthController { public class AuthController {

View File

@ -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 TokenEndpointPasswordImplicitCodeRefresh Token
// POST oauth/check_token CheckTokenEndpoint
// DELETE oauth/token ConsumerTokenServices#revokeToken
// GET oauth/authorize AuthorizationEndpoint
}

View File

@ -10,8 +10,9 @@ import lombok.experimental.Accessors;
import java.util.Date; import java.util.Date;
/** /**
* OAuth2 访问令牌 * OAuth2 访问令牌 DO
* *
* @author 芋道源码
*/ */
@TableName("system_oauth2_access_token") @TableName("system_oauth2_access_token")
@Data @Data
@ -20,7 +21,7 @@ import java.util.Date;
public class OAuth2AccessTokenDO extends BaseDO { public class OAuth2AccessTokenDO extends BaseDO {
/** /**
* 编号数据库字典 * 编号数据库递增
*/ */
private Long id; private Long id;
/** /**
@ -38,18 +39,14 @@ public class OAuth2AccessTokenDO extends BaseDO {
*/ */
private Integer userType; private Integer userType;
/** /**
* 刷新令牌 * 应用编号
* *
* 关联 {@link OAuth2RefreshTokenDO#getRefreshToken()} * 关联 {@link OAuth2ApplicationDO#getId()}
*/ */
private String refreshToken; private Long applicationId;
/** /**
* 过期时间 * 过期时间
*/ */
private Date expiresTime; private Date expiresTime;
/**
* 创建 IP
*/
private String createIp;
} }

View File

@ -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. 大多数 GithubGitee 等平台都会习惯称为第三方接入应用
*
* 如下字段考虑到使用相对不是很高频主要是一些开关暂时不支持
* authorized_grant_typesauthoritiesaccess_token_validityrefresh_token_validityadditional_informationautoapproveresource_idsscope
*
* @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<String> redirectUris;
/**
* 应用名
*/
private String name;
/**
* 应用图标
*/
private String logo;
/**
* 应用描述
*/
private String description;
/**
* 状态
*
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
}

View File

@ -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;
}

View File

@ -24,6 +24,7 @@ import java.util.Date;
@Data @Data
@Builder @Builder
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Deprecated
public class UserSessionDO extends BaseDO { public class UserSessionDO extends BaseDO {
/** /**

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.system.service.auth; 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 cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*;
import javax.validation.Valid; import javax.validation.Valid;

View File

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.system.service.auth;
/**
* 管理后台的 OAuth2 Service 接口
*
* 将自身的 AdminUser 用户授权给第三方应用采用 OAuth2.0 的协议
*
* 问题为什么自身也作为一个第三方应用也走这套流程呢
* 回复当然可以这么做采用 Implicit 模式考虑到大多数开发者使用不到这个特性OAuth2.0 毕竟有一定学习成本所以暂时没有采取这种方式
*
* @author 芋道源码
*/
public interface AdminOAuth2Service {
}

View File

@ -0,0 +1,11 @@
package cn.iocoder.yudao.module.system.service.auth;
/**
* OAuth2.0 授权码 Service 接口
*
* 从功能上 Spring Security OAuth JdbcAuthorizationCodeServices 的功能提供授权码的操作
*
* @author 芋道源码
*/
public class OAuth2CodeService {
}

View File

@ -5,10 +5,12 @@ import org.springframework.stereotype.Service;
/** /**
* OAuth2.0 Service 实现类 * OAuth2.0 Service 实现类
* *
*
*
* @author 芋道源码 * @author 芋道源码
*/ */
@Service @Service
public class OAuth2ServiceImpl implements OAuth2Service { public class OAuth2ServiceImpl implements OAuth2TokenService {
// @Autowired // @Autowired
// private SystemBizProperties systemBizProperties; // private SystemBizProperties systemBizProperties;

View File

@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.system.service.auth; package cn.iocoder.yudao.module.system.service.auth;
/** /**
* OAuth2.0 Service 接口 * OAuth2.0 Token Service 接口
*
* 从功能上 Spring Security OAuth JdbcTokenStore 的功能提供访问令牌刷新令牌的操作
* *
* @author 芋道源码 * @author 芋道源码
*/ */
public interface OAuth2Service { public interface OAuth2TokenService {
// OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String createIp); // OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String createIp);
// //