From a545d673ab3c6d0c7111f2d865d711f35ddaf20a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 22 Apr 2020 21:57:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20auth=20=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=A4=84=E7=90=86=EF=BC=88=E6=9C=AA=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/framework/util/CollectionUtil.java | 4 + .../CommonSecurityAutoConfiguration.java | 17 +++-- ...esLogin.java => RequiresAuthenticate.java} | 6 +- .../core/annotation/RequiresNone.java | 12 +++ .../core/annotation/RequiresPermissions.java | 2 + .../core/context/AdminSecurityContext.java | 8 +- .../interceptor/AccountAuthInterceptor.java | 69 ++++++++++++++++-- .../interceptor/AdminSecurityInterceptor.java | 22 ++++++ .../interceptor/UserSecurityInterceptor.java | 21 ++++++ .../boot/web/AdminMVCAutoConfiguration.java | 9 --- system/pom.xml | 1 + system/system-biz-api/pom.xml | 23 ++++++ .../system/biz/enums/SystemErrorCodeEnum.java | 30 ++++---- .../iocoder/mall/system/biz/package-info.java | 6 ++ system/system-biz/pom.xml | 2 +- .../biz/bo/authorization/AuthorizationBO.java | 15 ++++ .../authorization/AccountRoleDO.java | 34 +++++++++ .../dataobject/authorization/ResourceDO.java | 73 +++++++++++++++++++ .../biz/dataobject/authorization/RoleDO.java | 25 +++++++ .../authorization/RoleResourceDO.java | 29 ++++++++ .../AuthorizationCheckPermissionsDTO.java | 20 +++++ .../enums/authorization/ResourceTypeEnum.java | 44 +++++++++++ .../service/admin/AuthorizationService.java | 10 +++ .../authorization/AuthorizationService.java | 9 +++ .../AuthorizationServiceImpl.java | 14 ++++ .../authorization/ResourceService.java | 4 + .../service/authorization/RoleService.java | 4 + .../biz/service/oauth2/OAuth2ServiceImpl.java | 8 +- .../oauth2/AdminsOAuth2Controller.java | 4 +- .../oauth2/UsersOAuth2Controller.java | 3 + system/system-rpc-api/pom.xml | 2 +- .../mall/system/rpc/api/admin/AdminRPC.java | 7 ++ .../mall/system/rpc/api/oauth2/OAuth2RPC.java | 3 + .../AuthorizationCheckPermissionsRequest.java | 21 ++++++ .../OAuth2AccessTokenAuthenticateRequest.java | 2 +- .../rpc/response/admin/AdminResponse.java | 19 +++++ 36 files changed, 528 insertions(+), 54 deletions(-) rename common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/{RequiresLogin.java => RequiresAuthenticate.java} (71%) create mode 100644 common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresNone.java create mode 100644 common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AdminSecurityInterceptor.java create mode 100644 common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/UserSecurityInterceptor.java create mode 100644 system/system-biz-api/pom.xml rename system/{system-biz => system-biz-api}/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java (79%) create mode 100644 system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/package-info.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/AuthorizationBO.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/AccountRoleDO.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/ResourceDO.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleDO.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleResourceDO.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationCheckPermissionsDTO.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AuthorizationService.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/ResourceService.java create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java create mode 100644 system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/admin/AdminRPC.java create mode 100644 system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/authorization/AuthorizationCheckPermissionsRequest.java create mode 100644 system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/response/admin/AdminResponse.java diff --git a/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java b/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java index ee8251258..8d66b126d 100644 --- a/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java +++ b/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java @@ -12,6 +12,10 @@ public class CollectionUtil { return collection == null || collection.isEmpty(); } + public static boolean isEmpty(Object[] arrays) { + return arrays == null || arrays.length == 0; + } + public static Set asSet(T... objs) { return new HashSet<>(Arrays.asList(objs)); } diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/config/CommonSecurityAutoConfiguration.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/config/CommonSecurityAutoConfiguration.java index b34c5b468..de29f0046 100644 --- a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/config/CommonSecurityAutoConfiguration.java +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/config/CommonSecurityAutoConfiguration.java @@ -6,7 +6,6 @@ import cn.iocoder.mall.web.core.constant.CommonMallConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -22,16 +21,22 @@ public class CommonSecurityAutoConfiguration implements WebMvcConfigurer { // ========== 拦截器相关 ========== @Bean - @ConditionalOnMissingBean(AccountAuthInterceptor.class) - public AccountAuthInterceptor accountAuthInterceptor() { - return new AccountAuthInterceptor(); + public AccountAuthInterceptor adminAccountAuthInterceptor() { + return new AccountAuthInterceptor(true); + } + + @Bean + public AccountAuthInterceptor userAccountAuthInterceptor() { + return new AccountAuthInterceptor(false); } @Override public void addInterceptors(InterceptorRegistry registry) { // AccountAuthInterceptor 拦截器 - registry.addInterceptor(this.accountAuthInterceptor()) - .addPathPatterns(CommonMallConstants.ROOT_PATH_ADMIN + "/**", CommonMallConstants.ROOT_PATH_USER + "/**"); + registry.addInterceptor(this.userAccountAuthInterceptor()) + .addPathPatterns(CommonMallConstants.ROOT_PATH_USER + "/**"); + registry.addInterceptor(this.adminAccountAuthInterceptor()) + .addPathPatterns(CommonMallConstants.ROOT_PATH_ADMIN + "/**"); logger.info("[addInterceptors][加载 AccountAuthInterceptor 拦截器完成]"); } diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresLogin.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresAuthenticate.java similarity index 71% rename from common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresLogin.java rename to common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresAuthenticate.java index a85b10b6c..bd6b84d2d 100644 --- a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresLogin.java +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresAuthenticate.java @@ -3,14 +3,16 @@ package cn.iocoder.mall.security.core.annotation; import java.lang.annotation.*; /** - * 要求用户登录注解。通过将该注解添加到 Controller 上,会自动校验用户是否登陆。 + * 要求用户认证(登陆)注解。通过将该注解添加到 Controller 上,会自动校验用户是否登陆。 * * 默认请求下,用户访问的 API 接口,无需登陆。主要的考虑是, * 1. 需要用户登陆的接口,本身会获取在线用户的编号。如果不添加 @RequiresLogin 注解就会报错。 * 2. 大多数情况下,用户的 API 接口无需登陆。 + * + * ps:同样适用于管理员 Admin */ @Documented @Target({ElementType.METHOD}) // 暂时不支持 ElementType.TYPE ,因为没有场景 @Retention(RetentionPolicy.RUNTIME) -public @interface RequiresLogin { +public @interface RequiresAuthenticate { } diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresNone.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresNone.java new file mode 100644 index 000000000..25119e0c0 --- /dev/null +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresNone.java @@ -0,0 +1,12 @@ +package cn.iocoder.mall.security.core.annotation; + +import java.lang.annotation.*; + +/** + * 通过将该注解添加到 Controller 的方法上,声明无需进行登陆 + */ +@Documented +@Target({ElementType.METHOD}) // 暂时不支持 ElementType.TYPE ,因为没有场景 +@Retention(RetentionPolicy.RUNTIME) +public @interface RequiresNone { +} diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresPermissions.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresPermissions.java index ae304a2e4..561c54a0c 100644 --- a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresPermissions.java +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresPermissions.java @@ -6,6 +6,8 @@ import java.lang.annotation.*; * 参考 Shiro @RequiresPermissions 设计 http://shiro.apache.org/static/1.3.2/apidocs/org/apache/shiro/authz/annotation/RequiresPermissions.html * * 通过将该注解添加到 Controller 的方法上,进行授权鉴定 + * + * ps:目前暂时只有管理员 Admin 使用到 */ @Documented @Target({ElementType.METHOD}) // 暂时不支持 ElementType.TYPE ,因为没有场景 diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/AdminSecurityContext.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/AdminSecurityContext.java index 625832fbd..253d1ebf2 100644 --- a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/AdminSecurityContext.java +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/AdminSecurityContext.java @@ -3,10 +3,8 @@ package cn.iocoder.mall.security.core.context; import lombok.Data; import lombok.experimental.Accessors; -import java.util.Set; - /** - * Security 上下文 + * Admin Security 上下文 */ @Data @Accessors(chain = true) @@ -20,9 +18,5 @@ public class AdminSecurityContext { * 管理员账号 */ private String username; - /** - * 拥有的角色编号 - */ - private Set roleIds; } diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AccountAuthInterceptor.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AccountAuthInterceptor.java index 040ed1a97..7c88b6405 100644 --- a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AccountAuthInterceptor.java +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AccountAuthInterceptor.java @@ -1,8 +1,13 @@ package cn.iocoder.mall.security.core.interceptor; +import cn.iocoder.common.framework.util.CollectionUtil; import cn.iocoder.common.framework.util.HttpUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.vo.CommonResult; +import cn.iocoder.mall.security.core.annotation.RequiresAuthenticate; +import cn.iocoder.mall.security.core.annotation.RequiresNone; +import cn.iocoder.mall.security.core.annotation.RequiresPermissions; +import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum; import cn.iocoder.mall.system.rpc.api.oauth2.OAuth2RPC; import cn.iocoder.mall.system.rpc.request.oauth2.OAuth2AccessTokenAuthenticateRequest; import cn.iocoder.mall.system.rpc.response.oauth2.OAuth2AccessTokenResponse; @@ -11,6 +16,7 @@ import org.apache.dubbo.config.annotation.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; +import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; @@ -23,12 +29,36 @@ public class AccountAuthInterceptor extends HandlerInterceptorAdapter { @Reference(validation = "true", version = "${dubbo.consumer.OAuth2RPC.version}") private OAuth2RPC oauth2RPC; + + /** + * 是否默认要求认证 + * + * 针对 /users/** 接口,一般默认不要求认证,因为面向用户的接口,往往不需要登陆即可访问 + * 针对 /admins/** 接口,一般默认要求认证,因为面向管理员的接口,往往是内部需要更严格的安全控制 + */ + private final boolean defaultRequiresAuthenticate; + + public AccountAuthInterceptor(boolean defaultRequiresAuthenticate) { + this.defaultRequiresAuthenticate = defaultRequiresAuthenticate; + } + @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - // 获得访问令牌 - String accessToken = HttpUtil.obtainAuthorization(request); - if (StringUtils.hasText(accessToken)) { // 如果未传递,则不进行认证 - return true; + // 1. 进行认证 + Integer accountId = this.obtainAccount(request); + // 2. 进行鉴权 + HandlerMethod handlerMethod = (HandlerMethod) handler; + // 判断是否需要认证 + this.checkAuthenticate(handlerMethod, accountId); + // 判断是否需要权限 + + return true; + } + + private Integer obtainAccount(HttpServletRequest request) { + String accessToken = HttpUtil.obtainAuthorization(request); // 获得访问令牌 + if (!StringUtils.hasText(accessToken)) { // 如果未传递,则不进行认证 + return null; } // 执行认证 OAuth2AccessTokenAuthenticateRequest oauth2AccessTokenAuthenticateRequest = new OAuth2AccessTokenAuthenticateRequest() @@ -38,8 +68,35 @@ public class AccountAuthInterceptor extends HandlerInterceptorAdapter { throw ServiceExceptionUtil.exception(oauth2AccessTokenResponseResult); } // 设置账号编号 - CommonWebUtil.setAccountId(request, oauth2AccessTokenResponseResult.getData().getAccountId()); - return true; + Integer accountId = oauth2AccessTokenResponseResult.getData().getAccountId(); + CommonWebUtil.setAccountId(request, accountId); + return accountId; + } + + private void checkAuthenticate(HandlerMethod handlerMethod, Integer accountId) { + boolean requiresAuthenticate = defaultRequiresAuthenticate; + if (handlerMethod.hasMethodAnnotation(RequiresAuthenticate.class) + || handlerMethod.hasMethodAnnotation(RequiresPermissions.class)) { // 如果需要权限验证,也认为需要认证 + requiresAuthenticate = true; + } else if (handlerMethod.hasMethodAnnotation(RequiresNone.class)) { + requiresAuthenticate = false; + } + if (requiresAuthenticate && accountId == null) { + throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_NOT_AUTHENTICATE); + } + } + + private void checkPermission(HandlerMethod handlerMethod, Integer accountId) { + RequiresPermissions requiresPermissions = handlerMethod.getMethodAnnotation(RequiresPermissions.class); + if (requiresPermissions == null) { + return; + } + String[] permissions = requiresPermissions.value(); + if (CollectionUtil.isEmpty(permissions)) { + return; + } + // 权限验证 + } } diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AdminSecurityInterceptor.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AdminSecurityInterceptor.java new file mode 100644 index 000000000..fb68b48fd --- /dev/null +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/AdminSecurityInterceptor.java @@ -0,0 +1,22 @@ +package cn.iocoder.mall.security.core.interceptor; + +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class AdminSecurityInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + // 获得 Admin 信息 + + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } + +} diff --git a/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/UserSecurityInterceptor.java b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/UserSecurityInterceptor.java new file mode 100644 index 000000000..4f0cd5084 --- /dev/null +++ b/common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/interceptor/UserSecurityInterceptor.java @@ -0,0 +1,21 @@ +package cn.iocoder.mall.security.core.interceptor; + +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class UserSecurityInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + // 获得用户信息 + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + super.afterCompletion(request, response, handler, ex); + } + +} diff --git a/common/mall-spring-boot/src/main/java/cn/iocoder/mall/spring/boot/web/AdminMVCAutoConfiguration.java b/common/mall-spring-boot/src/main/java/cn/iocoder/mall/spring/boot/web/AdminMVCAutoConfiguration.java index cec8f7d73..6a7f74f6d 100644 --- a/common/mall-spring-boot/src/main/java/cn/iocoder/mall/spring/boot/web/AdminMVCAutoConfiguration.java +++ b/common/mall-spring-boot/src/main/java/cn/iocoder/mall/spring/boot/web/AdminMVCAutoConfiguration.java @@ -46,13 +46,4 @@ public class AdminMVCAutoConfiguration implements WebMvcConfigurer { registry.addInterceptor(adminDemoInterceptor()).addPathPatterns(MallConstants.ROOT_PATH_ADMIN + "/**"); } - @Bean - @ConditionalOnMissingBean - public FilterRegistrationBean corsFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - registrationBean.setFilter(new CorsFilter()); - registrationBean.addUrlPatterns("/*"); - return registrationBean; - } - } diff --git a/system/pom.xml b/system/pom.xml index e921c3fd2..a0746feff 100644 --- a/system/pom.xml +++ b/system/pom.xml @@ -22,6 +22,7 @@ system-rpc system-rest system-biz + system-biz-api diff --git a/system/system-biz-api/pom.xml b/system/system-biz-api/pom.xml new file mode 100644 index 000000000..adb7183c8 --- /dev/null +++ b/system/system-biz-api/pom.xml @@ -0,0 +1,23 @@ + + + + system + cn.iocoder.mall + 1.0-SNAPSHOT + + 4.0.0 + + system-biz-api + + + + + cn.iocoder.mall + common-framework + 1.0-SNAPSHOT + + + + diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java similarity index 79% rename from system/system-biz/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java rename to system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java index 36311e8ac..ab06bada6 100644 --- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java +++ b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java @@ -11,24 +11,22 @@ public enum SystemErrorCodeEnum implements ServiceExceptionUtil.Enumerable { // ========== OAUTH2 模块 ========== OAUTH2_UNKNOWN(1001001000, "未知错误"), // 预留 - OAUTH2_ACCOUNT_NOT_FOUND(1001001001, "账号不存在"), - OAUTH2_ACCOUNT_PASSWORD_ERROR(1001001002, "密码不正确"), - OAUTH2_INVALID_TOKEN_NOT_FOUND(1002001011, "访问令牌不存在"), - OAUTH2_INVALID_TOKEN_EXPIRED(1002001012, "访问令牌已过期"), - OAUTH2_INVALID_TOKEN_INVALID(1002001013, "访问令牌已失效"), -// OAUTH2_NOT_LOGIN(1002001015, "账号未登陆"), -// OAUTH_INVALID_REFRESH_TOKEN_NOT_FOUND(1002001017, "刷新令牌不存在"), -// OAUTH_INVALID_REFRESH_TOKEN_EXPIRED(1002001018, "访问令牌已过期"), - + // 预留 1001001001 ~ 1001001099 错误码,方便前端 + OAUTH2_ACCESS_TOKEN_NOT_FOUND(1001001001, "访问令牌不存在"), + OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED(1001001002, "访问令牌已过期"), + OAUTH2_ACCESS_TOKEN_INVALID(1001001003, "访问令牌已失效"), + OAUTH2_NOT_AUTHENTICATE(1001001004, "账号未登陆"), + // 其它 1001001100 开始 + OAUTH2_ACCOUNT_NOT_FOUND(1001001100, "账号不存在"), + OAUTH2_ACCOUNT_PASSWORD_ERROR(1001001101, "密码不正确"), // ========== OAuth 手机验证码模块 ========== - OAUTH2_MOBILE_CODE_NOT_FOUND(1001001100, "验证码不存在"), - OAUTH2_MOBILE_CODE_EXPIRED(1001001101, "验证码已过期"), - OAUTH2_MOBILE_CODE_USED(1001001102, "验证码已使用"), - OAUTH2_MOBILE_CODE_NOT_CORRECT(1001001104, "验证码不正确"), - OAUTH2_MOBILE_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY(1001001105, "超过每日短信发送数量"), - OAUTH2_MOBILE_CODE_SEND_TOO_FAST(1001001106, "短信发送过于频率"), - + OAUTH2_MOBILE_CODE_NOT_FOUND(1001001200, "验证码不存在"), + OAUTH2_MOBILE_CODE_EXPIRED(1001001201, "验证码已过期"), + OAUTH2_MOBILE_CODE_USED(1001001202, "验证码已使用"), + OAUTH2_MOBILE_CODE_NOT_CORRECT(1001001203, "验证码不正确"), + OAUTH2_MOBILE_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY(1001001204, "超过每日短信发送数量"), + OAUTH2_MOBILE_CODE_SEND_TOO_FAST(1001001205, "短信发送过于频率"), // ========== 管理员模块 1002002000 ========== ADMIN_NOT_FOUND(1002002000, "管理员不存在"), diff --git a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/package-info.java b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/package-info.java new file mode 100644 index 000000000..877d51d39 --- /dev/null +++ b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/package-info.java @@ -0,0 +1,6 @@ +/** + * 该项目,主要用于暴露一些共享的枚举类等。 + * + * 例如说,RPC 接口提供错误码给调用方 + */ +package cn.iocoder.mall.system.biz; diff --git a/system/system-biz/pom.xml b/system/system-biz/pom.xml index 71cc2cb2b..32bb22302 100644 --- a/system/system-biz/pom.xml +++ b/system/system-biz/pom.xml @@ -15,7 +15,7 @@ cn.iocoder.mall - common-framework + system-biz-api 1.0-SNAPSHOT diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/AuthorizationBO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/AuthorizationBO.java new file mode 100644 index 000000000..b0e74fe35 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/AuthorizationBO.java @@ -0,0 +1,15 @@ +package cn.iocoder.mall.system.biz.bo.authorization; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 授权模块 - 授权信息 BO + */ +@Data +@Accessors(chain = true) +public class AuthorizationBO { + + + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/AccountRoleDO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/AccountRoleDO.java new file mode 100644 index 000000000..efb41fb14 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/AccountRoleDO.java @@ -0,0 +1,34 @@ +package cn.iocoder.mall.system.biz.dataobject.authorization; + +import cn.iocoder.common.framework.dataobject.DeletableDO; +import cn.iocoder.mall.system.biz.dataobject.account.AccountDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * {@link AccountDO} 和 {@link RoleDO} 的关联表 + */ +@TableName("admin_role") +@Data +@Accessors(chain = true) +public class AccountRoleDO extends DeletableDO { + + /** + * 编号 + */ + private Integer id; + /** + * 账号编号 + * + * 关联 {@link AccountDO#getId()} + */ + private Integer accountId; + /** + * 角色编号 + * + * 关联 {@link RoleDO#getId()} + */ + private Integer roleId; + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/ResourceDO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/ResourceDO.java new file mode 100644 index 000000000..e629c3bb8 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/ResourceDO.java @@ -0,0 +1,73 @@ +package cn.iocoder.mall.system.biz.dataobject.authorization; + +import cn.iocoder.common.framework.dataobject.DeletableDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 资源实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName(value = "resource") +public class ResourceDO extends DeletableDO { + + /** + * 资源编号 + */ + private Integer id; + /** + * 菜单名 + */ + private String name; + /** + * 权限标识 + * + * 一般格式为:${系统}:${模块}:${操作} + * 例如说:system:admin:add,即 system 服务的添加管理员。 + * + * 当我们把该 ResourceDO 赋予给角色后,意味着该角色有该资源: + * - 对于后端,配合 @RequiresPermissions 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 + * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 + */ + private String permission; + /** + * 资源类型 + * + * 关联 {@link Resource} + */ + private Integer type; + /** + * 排序 + */ + private Integer sort; + /** + * 父级资源编号 + * + * 关联:{@link ResourceDO#getId()} + */ + private Integer pid; + /** + * + * + * 目前当且仅当资源类型为【菜单】时,才会生效,即 handler 配置为界面 URL ,或者前端组件名,或者前端的路由。 + */ + private String handler; + /** + * 图标 + * + * 目前当且仅当资源类型为【菜单】时,才会生效 + */ + private String icon; + /** + * 权限标识数组,使用逗号分隔。 + * + * 例如:system:admin:add + * 推荐格式为 ${系统}:${模块}:${操作} + */ + private String permissions; + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleDO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleDO.java new file mode 100644 index 000000000..58f680756 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleDO.java @@ -0,0 +1,25 @@ +package cn.iocoder.mall.system.biz.dataobject.authorization; + +import cn.iocoder.common.framework.dataobject.DeletableDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 角色实体 + */ +@TableName("role") +@Data +@Accessors(chain = true) +public class RoleDO extends DeletableDO { + + /** + * 角色编号 + */ + private Integer id; + /** + * 角色名 + */ + private String name; + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleResourceDO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleResourceDO.java new file mode 100644 index 000000000..19efc9774 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/authorization/RoleResourceDO.java @@ -0,0 +1,29 @@ +package cn.iocoder.mall.system.biz.dataobject.authorization; + +import cn.iocoder.common.framework.dataobject.DeletableDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * {@link RoleDO} 和 {@link ResourceDO} 的关联表 + */ +@TableName("role_resource") +@Data +@Accessors(chain = true) +public class RoleResourceDO extends DeletableDO { + + /** + * 编号 + */ + private Integer id; + /** + * 角色编号(外键:{@link RoleDO} + */ + private Integer roleId; + /** + * 资源编号(外键:{@link ResourceDO} + */ + private Integer resourceId; + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationCheckPermissionsDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationCheckPermissionsDTO.java new file mode 100644 index 000000000..b85fe7658 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationCheckPermissionsDTO.java @@ -0,0 +1,20 @@ +package cn.iocoder.mall.system.biz.dto.authorization; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +/** + * OAuth2 模块 - 访问令牌认证 Request + */ +@Data +@Accessors(chain = true) +public class AuthorizationCheckPermissionsDTO { + + @NotNull(message = "访问令牌不能为空") + private String accessToken; + @NotNull(message = "IP 不能为空") + private String ip; + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java new file mode 100644 index 000000000..50c1cf2f9 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java @@ -0,0 +1,44 @@ +package cn.iocoder.mall.system.biz.enums.authorization; + +import cn.iocoder.common.framework.core.IntArrayValuable; + +import java.util.Arrays; + +/** + * 资源类型枚举 + */ +public enum ResourceTypeEnum implements IntArrayValuable { + + MENU(1, "菜单"), + BUTTON(2, "按钮"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ResourceTypeEnum::getValue).toArray(); + + /** + * 资源类型 + */ + private final Integer value; + /** + * 资源类型名 + */ + private final String name; + + ResourceTypeEnum(Integer value, String name) { + this.value = value; + this.name = name; + } + + public Integer getValue() { + return value; + } + + public String getName() { + return name; + } + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AuthorizationService.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AuthorizationService.java new file mode 100644 index 000000000..6f2347e37 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AuthorizationService.java @@ -0,0 +1,10 @@ +package cn.iocoder.mall.system.biz.service.admin; + +/** + * 授权 Service 接口 + */ +public class AuthorizationService { + + + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java new file mode 100644 index 000000000..13ad3c879 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java @@ -0,0 +1,9 @@ +package cn.iocoder.mall.system.biz.service.authorization; + +import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationCheckPermissionsDTO; + +public interface AuthorizationService { + + void checkPermissions(AuthorizationCheckPermissionsDTO checkPermissionsDTO); + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java new file mode 100644 index 000000000..5761c0700 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java @@ -0,0 +1,14 @@ +package cn.iocoder.mall.system.biz.service.authorization; + +import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationCheckPermissionsDTO; +import org.springframework.stereotype.Service; + +@Service +public class AuthorizationServiceImpl implements AuthorizationService { + + @Override + public void checkPermissions(AuthorizationCheckPermissionsDTO checkPermissionsDTO) { + + } + +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/ResourceService.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/ResourceService.java new file mode 100644 index 000000000..9a786d879 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/ResourceService.java @@ -0,0 +1,4 @@ +package cn.iocoder.mall.system.biz.service.authorization; + +public interface ResourceService { +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java new file mode 100644 index 000000000..3a1e562c1 --- /dev/null +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java @@ -0,0 +1,4 @@ +package cn.iocoder.mall.system.biz.service.authorization; + +public interface RoleService { +} diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java index 3c7aee970..41d866fd3 100644 --- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java +++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java @@ -53,7 +53,7 @@ public class OAuth2ServiceImpl implements OAuth2Service { @Override @Transactional - public OAuth2AccessTokenBO authenticate(OAuth2UsernameAuthenticateDTO authenticateDTO) { + public OAuth2AccessTokenBO authenticate(OAuth2UsernameAuthenticateDTO authenticateDTO) { // 获得账号 AccountBO accountBO = accountService.getByUsername(authenticateDTO.getUsername()); if (accountBO == null) { @@ -101,13 +101,13 @@ public class OAuth2ServiceImpl implements OAuth2Service { public OAuth2AccessTokenBO authenticate(OAuth2AccessTokenAuthenticateDTO authenticateDTO) { OAuth2AccessTokenDO oauth2AccessTokenDO = oauth2AccessTokenMapper.selectById(authenticateDTO.getAccessToken()); if (oauth2AccessTokenDO == null) { // 不存在 - throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_INVALID_TOKEN_NOT_FOUND.getCode()); + throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_ACCESS_TOKEN_NOT_FOUND.getCode()); } if (oauth2AccessTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期 - throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_INVALID_TOKEN_EXPIRED.getCode()); + throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED.getCode()); } if (!oauth2AccessTokenDO.getValid()) { // 无效 - throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_INVALID_TOKEN_INVALID.getCode()); + throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_ACCESS_TOKEN_INVALID.getCode()); } // 转换返回 return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO); diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/AdminsOAuth2Controller.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/AdminsOAuth2Controller.java index 24e61a1be..e6a58b1a4 100644 --- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/AdminsOAuth2Controller.java +++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/AdminsOAuth2Controller.java @@ -3,6 +3,7 @@ package cn.iocoder.mall.system.rest.controller.oauth2; import cn.iocoder.common.framework.constant.MallConstants; import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.vo.CommonResult; +import cn.iocoder.mall.security.core.annotation.RequiresNone; import cn.iocoder.mall.system.biz.bo.admin.AdminBO; import cn.iocoder.mall.system.biz.bo.ouath2.OAuth2AccessTokenBO; import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2UsernameAuthenticateDTO; @@ -31,7 +32,8 @@ public class AdminsOAuth2Controller { private AdminService adminService; @PostMapping("/username-authenticate") - @ApiOperation("用户名认证") + @ApiOperation("用户名认证(登陆)") + @RequiresNone public CommonResult usernameAuthenticate(AdminsOAuth2UsernameAuthenticateRequest request) { // 执行认证 OAuth2UsernameAuthenticateDTO authenticateDTO = AdminsOAuth2Convert.INSTANCE.convert(request); diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/UsersOAuth2Controller.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/UsersOAuth2Controller.java index 434261e71..ea073027a 100644 --- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/UsersOAuth2Controller.java +++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/oauth2/UsersOAuth2Controller.java @@ -3,6 +3,7 @@ package cn.iocoder.mall.system.rest.controller.oauth2; import cn.iocoder.common.framework.constant.MallConstants; import cn.iocoder.common.framework.util.HttpUtil; import cn.iocoder.common.framework.vo.CommonResult; +import cn.iocoder.mall.security.core.annotation.RequiresNone; import cn.iocoder.mall.system.biz.bo.user.UserAuthenticateBO; import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2MobileCodeAuthenticateDTO; import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2MobileCodeSendDTO; @@ -37,6 +38,7 @@ public class UsersOAuth2Controller { @PostMapping("/mobile-code-authenticate") @ApiOperation("手机验证码认证") + @RequiresNone public CommonResult mobileCodeAuthenticate(UsersOAuth2MobileCodeAuthenticateRequest request, HttpServletRequest httpRequest) { // 执行认证 @@ -52,6 +54,7 @@ public class UsersOAuth2Controller { @PostMapping("/send-mobile-code") @ApiOperation("发送手机验证码") @ApiImplicitParam(name = "mobile", value = "手机号", required = true, example = "15601691234") + @RequiresNone public CommonResult sendMobileCode(@RequestParam("mobile") String mobile, HttpServletRequest request) { // 执行发送验证码 diff --git a/system/system-rpc-api/pom.xml b/system/system-rpc-api/pom.xml index 61568b1cd..35bdfe646 100644 --- a/system/system-rpc-api/pom.xml +++ b/system/system-rpc-api/pom.xml @@ -15,7 +15,7 @@ cn.iocoder.mall - common-framework + system-biz-api 1.0-SNAPSHOT diff --git a/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/admin/AdminRPC.java b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/admin/AdminRPC.java new file mode 100644 index 000000000..5b96e1006 --- /dev/null +++ b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/admin/AdminRPC.java @@ -0,0 +1,7 @@ +package cn.iocoder.mall.system.rpc.api.admin; + +/** + * Admin RPC 接口 + */ +public interface AdminRPC { +} diff --git a/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/oauth2/OAuth2RPC.java b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/oauth2/OAuth2RPC.java index 113874c45..b6260358e 100644 --- a/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/oauth2/OAuth2RPC.java +++ b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/api/oauth2/OAuth2RPC.java @@ -4,6 +4,9 @@ import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.system.rpc.request.oauth2.OAuth2AccessTokenAuthenticateRequest; import cn.iocoder.mall.system.rpc.response.oauth2.OAuth2AccessTokenResponse; +/** + * OAuth2 RPC 接口 + */ public interface OAuth2RPC { CommonResult authenticate(OAuth2AccessTokenAuthenticateRequest request); diff --git a/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/authorization/AuthorizationCheckPermissionsRequest.java b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/authorization/AuthorizationCheckPermissionsRequest.java new file mode 100644 index 000000000..453051c6b --- /dev/null +++ b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/authorization/AuthorizationCheckPermissionsRequest.java @@ -0,0 +1,21 @@ +package cn.iocoder.mall.system.rpc.request.authorization; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 鉴权模块 - 校验账号是否有权限 Request + */ +@Data +@Accessors(chain = true) +public class AuthorizationCheckPermissionsRequest { + + @NotNull(message = "账号不能为空") + private Integer accountId; + @NotNull(message = "校验的权限不能为空") + private List permissions; + +} diff --git a/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/oauth2/OAuth2AccessTokenAuthenticateRequest.java b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/oauth2/OAuth2AccessTokenAuthenticateRequest.java index a48889aca..240f9f7d7 100644 --- a/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/oauth2/OAuth2AccessTokenAuthenticateRequest.java +++ b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/request/oauth2/OAuth2AccessTokenAuthenticateRequest.java @@ -6,7 +6,7 @@ import lombok.experimental.Accessors; import javax.validation.constraints.NotNull; /** - * OAuth2 访问令牌认证 Request + * OAuth2 模块 - 访问令牌认证 Request */ @Data @Accessors(chain = true) diff --git a/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/response/admin/AdminResponse.java b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/response/admin/AdminResponse.java new file mode 100644 index 000000000..c14a7d1ef --- /dev/null +++ b/system/system-rpc-api/src/main/java/cn/iocoder/mall/system/rpc/response/admin/AdminResponse.java @@ -0,0 +1,19 @@ +package cn.iocoder.mall.system.rpc.response.admin; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * Admin 信息 Response + */ +@Data +@Accessors(chain = true) +public class AdminResponse { + + /** + * 管理员编号 + */ + private Integer id; +// private String + +}