From 083c96002e0121c45480fd8ed161d709acd4913e Mon Sep 17 00:00:00 2001 From: liucong Date: Mon, 5 Dec 2022 13:41:15 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=BC=83=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/config/WebSecurityConfig.java | 5 -- .../auth/filter/ImageCodeValidateFilter.java | 52 ------------------- src/main/resources/application-dev.yml | 5 -- 3 files changed, 62 deletions(-) delete mode 100644 src/main/java/org/micai/platform/auth/filter/ImageCodeValidateFilter.java diff --git a/src/main/java/org/micai/platform/auth/config/WebSecurityConfig.java b/src/main/java/org/micai/platform/auth/config/WebSecurityConfig.java index 284d26e..48396dc 100644 --- a/src/main/java/org/micai/platform/auth/config/WebSecurityConfig.java +++ b/src/main/java/org/micai/platform/auth/config/WebSecurityConfig.java @@ -1,7 +1,6 @@ package org.micai.platform.auth.config; import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.filter.ImageCodeValidateFilter; import org.micai.platform.auth.filter.JWTAuthenticationFilter; import org.micai.platform.auth.filter.JWTLoginFilter; import org.micai.platform.auth.handler.CustomAuthenticationFailureHandler; @@ -71,9 +70,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationFailureHandler customAuthenticationFailureHandler; - @Autowired - private ImageCodeValidateFilter imageCodeValidateFilter; - @Value("${jwt.sign.key}") private String signKey; @@ -100,7 +96,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .and() // 自定义过滤器 - .addFilterBefore(imageCodeValidateFilter,JWTLoginFilter.class) .addFilter(new JWTLoginFilter(authenticationManager(), signKey, expirationTime, customAuthenticationFailureHandler)) .addFilter(new JWTAuthenticationFilter(authenticationManager(), signKey)) .authorizeRequests()// 验证策略 diff --git a/src/main/java/org/micai/platform/auth/filter/ImageCodeValidateFilter.java b/src/main/java/org/micai/platform/auth/filter/ImageCodeValidateFilter.java deleted file mode 100644 index 6d733b8..0000000 --- a/src/main/java/org/micai/platform/auth/filter/ImageCodeValidateFilter.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.micai.platform.auth.filter; - -import cn.hutool.core.util.ObjectUtil; -import org.micai.platform.auth.base.exception.MyAuthException; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.handler.CustomAuthenticationFailureHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * @Author liuCong - * @Date 2022/1/4 11:25 - * @ClassName ImageCodeValidateFilter - * @Description - */ -@Component -public class ImageCodeValidateFilter extends OncePerRequestFilter { - @Autowired - private CustomAuthenticationFailureHandler customAuthenticationFailureHandler; - - @Value("${image.code.flag}") - private boolean imageCodeFlag; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - try { - if (imageCodeFlag){ - String code = request.getParameter(ConstantCode.IMAGE_CODE); - if (ObjectUtil.isEmpty(code)) { - throw new MyAuthException(ConstantEnum.IMAGE_ERROR); - } - String imageCode = (String) request.getSession().getAttribute(ConstantCode.SESSION_KEY); - if (ObjectUtil.isEmpty(imageCode) && !imageCode.equals(code)){ - throw new MyAuthException(ConstantEnum.IMAGE_ERROR); - } - } - } catch (MyAuthException e) { - customAuthenticationFailureHandler.onAuthenticationFailure(request,response,e); - } - - filterChain.doFilter(request,response); - } -} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 5ce3322..21003ed 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -18,8 +18,3 @@ jwt: #jwt 过期时间 expiration: time: 15 - -#登录是否开启图形验证码功能 -image: - code: - flag: true \ No newline at end of file -- Gitee From 344852871aa8117af8317a77088f5b14421338fc Mon Sep 17 00:00:00 2001 From: liucong Date: Fri, 9 Dec 2022 11:59:59 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0oath2=E5=B9=B6=E5=B0=86?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=94=B9=E6=88=90=E6=A8=A1=E5=9D=97=E5=8C=96?= =?UTF-8?q?(=E8=AE=A4=E8=AF=81=E6=9C=8D=E5=8A=A1/=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platform-auth-server/pom.xml | 28 ++++ .../authserver/AuthServerApplication.java | 22 +-- .../platform/authserver}/bo/UserQueryBo.java | 2 +- .../AuthorizationServerConfiguration.java | 127 ++++++++++++++++ .../authserver/config/JwtTokenEnhancer.java | 43 ++++++ .../authserver/config/PasswordEncoder.java | 22 +++ .../authserver/config/TokenConfig.java | 50 +++++++ .../authserver/config/WebSecurityConfig.java | 121 +++++++++++++++ .../authserver}/entity/Permission.java | 2 +- .../platform/authserver}/entity/Role.java | 2 +- .../authserver}/entity/RolePermission.java | 2 +- .../platform/authserver}/entity/User.java | 2 +- .../platform/authserver}/entity/UserRole.java | 2 +- .../filter/JWTAuthenticationFilter.java | 15 +- .../authserver}/filter/JWTLoginFilter.java | 12 +- .../handler/AuthApprovalHandler.java | 51 +++++++ .../CustomAuthenticationFailureHandler.java | 6 +- .../Http401AuthenticationEntryPoint.java | 4 +- .../handler/MyMetaObjectHandler.java | 2 +- .../interceptor/PlusInterceptor.java | 2 +- .../authserver}/mapper/PermissionMapper.java | 4 +- .../authserver}/mapper/RoleMapper.java | 4 +- .../mapper/RolePermissionMapper.java | 4 +- .../authserver/mapper/UserMapper.java | 8 + .../authserver}/mapper/UserRoleMapper.java | 4 +- .../CustomAuthenticationProvider.java | 34 ++--- .../authserver/service/PermissionService.java | 17 +++ .../service/RolePermissionService.java | 17 +++ .../authserver/service/RoleService.java | 8 +- .../authserver/service/UserRoleService.java | 17 +++ .../authserver/service/UserService.java | 8 + .../service/impl}/GrantedAuthorityImpl.java | 2 +- .../service/impl/PermissionServiceImpl.java | 20 +++ .../impl/RolePermissionServiceImpl.java | 20 +++ .../service/impl/RoleServiceImpl.java | 12 +- .../service/impl/UserDetailsServiceImpl.java | 76 ++++++++++ .../service/impl/UserRoleServiceImpl.java | 21 +++ .../service/impl/UserServiceImpl.java | 19 +++ .../src}/main/resources/application-dev.yml | 2 +- .../src}/main/resources/application-pro.yml | 0 .../src/main/resources/application.yml | 29 ++++ platform-common/pom.xml | 30 ++++ .../common/base}/constant/ConstantCode.java | 2 +- .../common/base}/constant/ConstantEnum.java | 2 +- .../base/exception/DefaultException.java | 6 +- .../exception/GlobalExceptionHandler.java | 6 +- .../base/exception/MyAuthException.java | 4 +- .../base/exception/PlatformException.java | 4 +- .../platform/common}/base/result/Result.java | 4 +- .../common}/base/result/UploadResult.java | 4 +- .../micai/platform/common}/base/sms/Sms.java | 2 +- .../common}/base/sms/impl/AbstractSms.java | 4 +- .../common}/base/sms/impl/QiniuSmsImpl.java | 4 +- platform-resources-server/pom.xml | 28 ++++ .../ResourcesServerApplication.java | 19 +++ .../resourcesserver}/bo/MenuDelBo.java | 2 +- .../resourcesserver}/bo/MenuSaveBo.java | 2 +- .../resourcesserver}/bo/MenuUpdateBo.java | 2 +- .../resourcesserver}/bo/OrganDelBo.java | 2 +- .../resourcesserver}/bo/OrganFindBo.java | 2 +- .../resourcesserver}/bo/OrganSaveBo.java | 2 +- .../resourcesserver}/bo/OrganUpdateBo.java | 2 +- .../resourcesserver}/bo/PermissionDelBo.java | 2 +- .../resourcesserver}/bo/PermissionFindBo.java | 2 +- .../bo/PermissionMenuDelBo.java | 2 +- .../bo/PermissionMenuSaveBo.java | 2 +- .../bo/PermissionMenuUpdateBo.java | 2 +- .../resourcesserver}/bo/PermissionSaveBo.java | 2 +- .../bo/PermissionUpdateBo.java | 2 +- .../resourcesserver}/bo/RoleDelBo.java | 2 +- .../resourcesserver}/bo/RoleFindBo.java | 2 +- .../bo/RolePermissionDelBo.java | 2 +- .../bo/RolePermissionSaveBo.java | 2 +- .../bo/RolePermissionUpdateBo.java | 2 +- .../resourcesserver}/bo/RoleSaveBo.java | 2 +- .../resourcesserver}/bo/RoleUpdateBo.java | 2 +- .../resourcesserver}/bo/UserDelBo.java | 2 +- .../resourcesserver}/bo/UserFindBo.java | 2 +- .../resourcesserver/bo/UserQueryBo.java | 26 ++++ .../resourcesserver}/bo/UserRoleDelBo.java | 2 +- .../resourcesserver}/bo/UserRoleSaveBo.java | 2 +- .../resourcesserver}/bo/UserRoleUpdateBo.java | 2 +- .../resourcesserver}/bo/UserSaveBo.java | 2 +- .../resourcesserver}/bo/UserUpdateBo.java | 2 +- .../config/CodeGenerator.java | 2 +- .../config/PasswordEncoder.java | 22 +++ .../config/ResourceServerConfig.java | 35 +++++ .../resourcesserver}/config/SiteOptions.java | 2 +- .../config/SwaggerConfig.java | 2 +- .../resourcesserver/config/TokenConfig.java | 41 ++++++ .../config/WebSecurityConfig.java | 65 ++++---- .../controller/BaseController.java | 8 +- .../controller/PermissionController.java | 20 +-- .../controller/RoleController.java | 20 +-- .../controller/RolePermissionController.java | 16 +- .../controller/UploadController.java | 10 +- .../controller/UserController.java | 20 +-- .../controller/UserRoleController.java | 16 +- .../dto/UserAuthenticationDto.java | 2 +- .../resourcesserver/entity/Permission.java | 65 ++++++++ .../platform/resourcesserver/entity/Role.java | 29 ++-- .../entity/RolePermission.java | 14 +- .../platform/resourcesserver/entity/User.java | 68 +++++++++ .../resourcesserver/entity/UserRole.java | 19 +-- .../filter/JWTAuthenticationFilter.java | 139 ++++++++++++++++++ .../CustomAuthenticationFailureHandler.java | 34 +++++ .../Http401AuthenticationEntryPoint.java | 31 ++++ .../handler/MyMetaObjectHandler.java | 39 +++++ .../interceptor/PlusInterceptor.java | 25 ++++ .../mapper/PermissionMapper.java | 16 ++ .../resourcesserver/mapper/RoleMapper.java | 16 ++ .../mapper/RolePermissionMapper.java | 16 ++ .../resourcesserver}/mapper/UserMapper.java | 4 +- .../mapper/UserRoleMapper.java | 16 ++ .../CustomAuthenticationProvider.java | 127 ++++++++++++++++ .../service/PermissionService.java | 14 +- .../service/RolePermissionService.java | 10 +- .../resourcesserver}/service/RoleService.java | 14 +- .../service/UserRoleService.java | 10 +- .../resourcesserver}/service/UserService.java | 14 +- .../service/impl/GrantedAuthorityImpl.java | 26 ++++ .../service/impl/PermissionServiceImpl.java | 28 ++-- .../impl/RolePermissionServiceImpl.java | 22 +-- .../service/impl/RoleServiceImpl.java | 28 ++-- .../service/impl/UserDetailsServiceImpl.java | 76 ++++++++++ .../service/impl/UserRoleServiceImpl.java | 22 +-- .../service/impl/UserServiceImpl.java | 28 ++-- .../resourcesserver}/storage/Storage.java | 2 +- .../storage/StorageFactory.java | 9 +- .../storage/impl/AbstractStorage.java | 18 +-- .../storage/impl/MinioStorageImpl.java | 4 +- .../storage/impl/NativeStorageImpl.java | 6 +- .../storage/impl/OssStorageImpl.java | 11 +- .../storage/impl/QiniuStorageImpl.java | 4 +- .../storage/impl/UpYunStorageImpl.java | 5 +- .../utils/ApplicationUtil.java | 2 +- .../utils/AuthenticationManger.java | 6 +- .../resourcesserver}/utils/FileKit.java | 2 +- .../resourcesserver}/utils/FilePathUtils.java | 2 +- .../resourcesserver}/utils/ImageUtils.java | 2 +- .../resourcesserver}/utils/JwtHelper.java | 2 +- .../platform/resourcesserver}/utils/MD5.java | 4 +- .../resourcesserver}/utils/PdfMergeUtils.java | 2 +- .../utils/WatermarkOffice.java | 2 +- .../resourcesserver}/utils/WatermarkPdf.java | 2 +- .../utils/WatermarkUtils.java | 2 +- .../resourcesserver}/vo/OrganListVo.java | 2 +- .../resourcesserver}/vo/PermissionListVo.java | 2 +- .../resourcesserver}/vo/RoleListVo.java | 2 +- .../resourcesserver}/vo/UserListVo.java | 2 +- .../src/main/resources/application-dev.yml | 22 +++ .../src/main/resources/application-pro.yml | 0 .../src}/main/resources/application.yml | 0 .../src/main/resources/logback-spring.xml | 51 +++++++ pom.xml | 36 +++-- .../platform/auth/config/ThreadConfig.java | 40 ----- .../auth/controller/ImageCodeController.java | 47 ------ .../controller/JwtExceptionController.java | 73 --------- .../auth/controller/OrganInfoController.java | 112 -------------- .../auth/controller/OrganUserController.java | 20 --- .../controller/PermissionMenuController.java | 89 ----------- .../auth/controller/SysDictController.java | 20 --- .../auth/controller/SysMenuController.java | 113 -------------- .../auth/controller/SysRegionController.java | 58 -------- .../micai/platform/auth/entity/OrganInfo.java | 64 -------- .../micai/platform/auth/entity/SysDict.java | 61 -------- .../micai/platform/auth/entity/SysMenu.java | 85 ----------- .../micai/platform/auth/entity/SysRegion.java | 67 --------- .../platform/auth/mapper/OrganInfoMapper.java | 16 -- .../platform/auth/mapper/OrganUserMapper.java | 16 -- .../auth/mapper/PermissionMenuMapper.java | 16 -- .../auth/mapper/SysDictItemMapper.java | 16 -- .../platform/auth/mapper/SysDictMapper.java | 16 -- .../platform/auth/mapper/SysMenuMapper.java | 16 -- .../platform/auth/mapper/SysRegionMapper.java | 19 --- .../auth/service/OrganInfoService.java | 29 ---- .../auth/service/PermissionMenuService.java | 19 --- .../platform/auth/service/SysMenuService.java | 29 ---- .../auth/service/SysRegionService.java | 31 ---- .../service/impl/OrganInfoServiceImpl.java | 45 ------ .../impl/PermissionMenuServiceImpl.java | 73 --------- .../auth/service/impl/SysMenuServiceImpl.java | 128 ---------------- .../service/impl/SysRegionServiceImpl.java | 44 ------ .../org/micai/platform/auth/LogTests.java | 34 ----- .../MicaiPlatformAuthApplicationTests.java | 13 -- src/test/resources/application.properties | 42 ------ 186 files changed, 2074 insertions(+), 1856 deletions(-) create mode 100644 platform-auth-server/pom.xml rename src/main/java/org/micai/platform/auth/MicaiPlatformAuthApplication.java => platform-auth-server/src/main/java/org/micai/platform/authserver/AuthServerApplication.java (36%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/bo/UserQueryBo.java (93%) create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/config/PasswordEncoder.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/entity/Permission.java (97%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/entity/Role.java (97%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/entity/RolePermission.java (96%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/entity/User.java (97%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/entity/UserRole.java (96%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/filter/JWTAuthenticationFilter.java (94%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/filter/JWTLoginFilter.java (94%) create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/handler/CustomAuthenticationFailureHandler.java (88%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/handler/Http401AuthenticationEntryPoint.java (90%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/handler/MyMetaObjectHandler.java (95%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/interceptor/PlusInterceptor.java (93%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/mapper/PermissionMapper.java (67%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/mapper/RoleMapper.java (67%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/mapper/RolePermissionMapper.java (67%) create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/UserMapper.java rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/mapper/UserRoleMapper.java (67%) rename {src/main/java/org/micai/platform/auth => platform-auth-server/src/main/java/org/micai/platform/authserver}/provider/CustomAuthenticationProvider.java (81%) create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/PermissionService.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/RolePermissionService.java rename src/main/java/org/micai/platform/auth/service/SysDictService.java => platform-auth-server/src/main/java/org/micai/platform/authserver/service/RoleService.java (41%) create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserRoleService.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserService.java rename {src/main/java/org/micai/platform/auth/service => platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl}/GrantedAuthorityImpl.java (90%) create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/PermissionServiceImpl.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RolePermissionServiceImpl.java rename src/main/java/org/micai/platform/auth/service/impl/SysDictServiceImpl.java => platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RoleServiceImpl.java (37%) create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserDetailsServiceImpl.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserRoleServiceImpl.java create mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserServiceImpl.java rename {src => platform-auth-server/src}/main/resources/application-dev.yml (95%) rename {src => platform-auth-server/src}/main/resources/application-pro.yml (100%) create mode 100644 platform-auth-server/src/main/resources/application.yml create mode 100644 platform-common/pom.xml rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common/base}/constant/ConstantCode.java (99%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common/base}/constant/ConstantEnum.java (98%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/exception/DefaultException.java (85%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/exception/GlobalExceptionHandler.java (91%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/exception/MyAuthException.java (91%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/exception/PlatformException.java (91%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/result/Result.java (85%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/result/UploadResult.java (86%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/sms/Sms.java (88%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/sms/impl/AbstractSms.java (59%) rename {src/main/java/org/micai/platform/auth => platform-common/src/main/java/org/micai/platform/common}/base/sms/impl/QiniuSmsImpl.java (77%) create mode 100644 platform-resources-server/pom.xml create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/ResourcesServerApplication.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/MenuDelBo.java (90%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/MenuSaveBo.java (96%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/MenuUpdateBo.java (96%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/OrganDelBo.java (73%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/OrganFindBo.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/OrganSaveBo.java (73%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/OrganUpdateBo.java (74%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/PermissionDelBo.java (92%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/PermissionFindBo.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/PermissionMenuDelBo.java (92%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/PermissionMenuSaveBo.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/PermissionMenuUpdateBo.java (94%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/PermissionSaveBo.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/PermissionUpdateBo.java (95%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/RoleDelBo.java (92%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/RoleFindBo.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/RolePermissionDelBo.java (92%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/RolePermissionSaveBo.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/RolePermissionUpdateBo.java (94%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/RoleSaveBo.java (91%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/RoleUpdateBo.java (94%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/UserDelBo.java (92%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/UserFindBo.java (93%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserQueryBo.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/UserRoleDelBo.java (92%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/UserRoleSaveBo.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/UserRoleUpdateBo.java (94%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/UserSaveBo.java (95%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/bo/UserUpdateBo.java (94%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/config/CodeGenerator.java (98%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/PasswordEncoder.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/config/SiteOptions.java (96%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/config/SwaggerConfig.java (98%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/config/WebSecurityConfig.java (63%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/controller/BaseController.java (85%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/controller/PermissionController.java (85%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/controller/RoleController.java (85%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/controller/RolePermissionController.java (84%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/controller/UploadController.java (93%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/controller/UserController.java (89%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/controller/UserRoleController.java (84%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/dto/UserAuthenticationDto.java (90%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Permission.java rename src/main/java/org/micai/platform/auth/entity/SysDictItem.java => platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Role.java (70%) rename src/main/java/org/micai/platform/auth/entity/PermissionMenu.java => platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/RolePermission.java (82%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/User.java rename src/main/java/org/micai/platform/auth/entity/OrganUser.java => platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/UserRole.java (74%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/Http401AuthenticationEntryPoint.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/MyMetaObjectHandler.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/interceptor/PlusInterceptor.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/PermissionMapper.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RoleMapper.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RolePermissionMapper.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/mapper/UserMapper.java (59%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/UserRoleMapper.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/provider/CustomAuthenticationProvider.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/PermissionService.java (56%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/RolePermissionService.java (55%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/RoleService.java (55%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/UserRoleService.java (55%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/UserService.java (56%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/GrantedAuthorityImpl.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/impl/PermissionServiceImpl.java (78%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/impl/RolePermissionServiceImpl.java (77%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/impl/RoleServiceImpl.java (78%) create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserDetailsServiceImpl.java rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/impl/UserRoleServiceImpl.java (76%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/service/impl/UserServiceImpl.java (83%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/Storage.java (95%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/StorageFactory.java (82%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/impl/AbstractStorage.java (82%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/impl/MinioStorageImpl.java (78%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/impl/NativeStorageImpl.java (83%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/impl/OssStorageImpl.java (89%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/impl/QiniuStorageImpl.java (78%) rename {src/main/java/org/micai/platform/auth/base => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/storage/impl/UpYunStorageImpl.java (70%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/ApplicationUtil.java (97%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/AuthenticationManger.java (90%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/FileKit.java (96%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/FilePathUtils.java (97%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/ImageUtils.java (99%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/JwtHelper.java (98%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/MD5.java (90%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/PdfMergeUtils.java (98%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/WatermarkOffice.java (99%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/WatermarkPdf.java (97%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/utils/WatermarkUtils.java (96%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/vo/OrganListVo.java (95%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/vo/PermissionListVo.java (95%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/vo/RoleListVo.java (95%) rename {src/main/java/org/micai/platform/auth => platform-resources-server/src/main/java/org/micai/platform/resourcesserver}/vo/UserListVo.java (95%) create mode 100644 platform-resources-server/src/main/resources/application-dev.yml create mode 100644 platform-resources-server/src/main/resources/application-pro.yml rename {src => platform-resources-server/src}/main/resources/application.yml (100%) create mode 100644 platform-resources-server/src/main/resources/logback-spring.xml delete mode 100644 src/main/java/org/micai/platform/auth/config/ThreadConfig.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/ImageCodeController.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/JwtExceptionController.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/OrganInfoController.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/OrganUserController.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/PermissionMenuController.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/SysDictController.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/SysMenuController.java delete mode 100644 src/main/java/org/micai/platform/auth/controller/SysRegionController.java delete mode 100644 src/main/java/org/micai/platform/auth/entity/OrganInfo.java delete mode 100644 src/main/java/org/micai/platform/auth/entity/SysDict.java delete mode 100644 src/main/java/org/micai/platform/auth/entity/SysMenu.java delete mode 100644 src/main/java/org/micai/platform/auth/entity/SysRegion.java delete mode 100644 src/main/java/org/micai/platform/auth/mapper/OrganInfoMapper.java delete mode 100644 src/main/java/org/micai/platform/auth/mapper/OrganUserMapper.java delete mode 100644 src/main/java/org/micai/platform/auth/mapper/PermissionMenuMapper.java delete mode 100644 src/main/java/org/micai/platform/auth/mapper/SysDictItemMapper.java delete mode 100644 src/main/java/org/micai/platform/auth/mapper/SysDictMapper.java delete mode 100644 src/main/java/org/micai/platform/auth/mapper/SysMenuMapper.java delete mode 100644 src/main/java/org/micai/platform/auth/mapper/SysRegionMapper.java delete mode 100644 src/main/java/org/micai/platform/auth/service/OrganInfoService.java delete mode 100644 src/main/java/org/micai/platform/auth/service/PermissionMenuService.java delete mode 100644 src/main/java/org/micai/platform/auth/service/SysMenuService.java delete mode 100644 src/main/java/org/micai/platform/auth/service/SysRegionService.java delete mode 100644 src/main/java/org/micai/platform/auth/service/impl/OrganInfoServiceImpl.java delete mode 100644 src/main/java/org/micai/platform/auth/service/impl/PermissionMenuServiceImpl.java delete mode 100644 src/main/java/org/micai/platform/auth/service/impl/SysMenuServiceImpl.java delete mode 100644 src/main/java/org/micai/platform/auth/service/impl/SysRegionServiceImpl.java delete mode 100644 src/test/java/org/micai/platform/auth/LogTests.java delete mode 100644 src/test/java/org/micai/platform/auth/MicaiPlatformAuthApplicationTests.java delete mode 100644 src/test/resources/application.properties diff --git a/platform-auth-server/pom.xml b/platform-auth-server/pom.xml new file mode 100644 index 0000000..0f1bc6c --- /dev/null +++ b/platform-auth-server/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + org.micai.platform + micai-platform-auth + 0.0.1-SNAPSHOT + + + platform-auth-server + + + 8 + 8 + UTF-8 + + + + + org.micai.platform + platform-common + 0.0.1-SNAPSHOT + + + + \ No newline at end of file diff --git a/src/main/java/org/micai/platform/auth/MicaiPlatformAuthApplication.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/AuthServerApplication.java similarity index 36% rename from src/main/java/org/micai/platform/auth/MicaiPlatformAuthApplication.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/AuthServerApplication.java index 7275d74..9f5de89 100644 --- a/src/main/java/org/micai/platform/auth/MicaiPlatformAuthApplication.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/AuthServerApplication.java @@ -1,15 +1,19 @@ -package org.micai.platform.auth; +package org.micai.platform.authserver; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@MapperScan("org.micai.platform.auth.mapper") +/** + * @Author liuCong + * @Date ${DATE} ${TIME} + * @ClassName ${NAME} + * @Description + */ @SpringBootApplication -public class MicaiPlatformAuthApplication { - - public static void main(String[] args) { - SpringApplication.run(MicaiPlatformAuthApplication.class, args); - } - -} +@MapperScan("org.micai.platform.authserver.mapper") +public class AuthServerApplication { + public static void main(String[] args) { + SpringApplication.run(AuthServerApplication.class,args); + } +} \ No newline at end of file diff --git a/src/main/java/org/micai/platform/auth/bo/UserQueryBo.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/bo/UserQueryBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/UserQueryBo.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/bo/UserQueryBo.java index 2ebb498..5fadd1e 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserQueryBo.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/bo/UserQueryBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.authserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java new file mode 100644 index 0000000..f81103f --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java @@ -0,0 +1,127 @@ +package org.micai.platform.authserver.config; + +import org.micai.platform.authserver.handler.AuthApprovalHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.ClientDetailsService; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices; +import org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices; +import org.springframework.security.oauth2.provider.token.TokenEnhancer; +import org.springframework.security.oauth2.provider.token.TokenEnhancerChain; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author liuCong + * @Date 2022/11/24 下午 2:40 + * @ClassName AuthorizationServerConfiguration + * @Description + */ +@Configuration +@EnableAuthorizationServer +public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { + + @Resource + private DataSource dataSource; + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private JwtTokenStore jwtTokenStore; + + @Autowired + private UserDetailsService customUserDetailsService; + + @Autowired + private JwtAccessTokenConverter jwtAccessTokenConverter; + + @Autowired + private JwtTokenEnhancer jwtTokenEnhancer; + + @Bean + public AuthorizationCodeServices jdbcAuthorizationCodeServices() { + // JDBC方式保存授权码到 oauth_code 表中 + return new JdbcAuthorizationCodeServices(dataSource); + } + + /** + * @Author : liuCong + * @Date : 2022/11/24 下午 2:50 + * @Description :在认证管理器的令牌端点配置中添加---用在密码模式授权 + * @Throws : // + * @Params : [endpoints] + * @Return : void + **/ + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints + // 密码模式要设置认证管理器 + .authenticationManager(authenticationManager) + //令牌存储管理 + .tokenStore(jwtTokenStore).accessTokenConverter(jwtAccessTokenConverter) + // 刷新令牌使用 + .userDetailsService(customUserDetailsService) + // 授权码使用 + .authorizationCodeServices(jdbcAuthorizationCodeServices()) + //实现自动授权 不需要用户点击授权 + .userApprovalHandler(new AuthApprovalHandler()) + + ; + if (jwtTokenEnhancer != null ){ + //重新创建EnhancerChain放如 + TokenEnhancerChain enhancerChain = new TokenEnhancerChain(); + List enhancers = new ArrayList<>(); + enhancers.add(jwtTokenEnhancer); + enhancers.add(jwtAccessTokenConverter); + enhancerChain.setTokenEnhancers(enhancers); + endpoints.tokenEnhancer(enhancerChain); + } + } + + @Override + public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { + // 获取密钥需要身份认证,使用单点登录时必须配置 + // /oauth/token_key :提供公有密匙的端点,使用 JWT 令牌时会使用 , 涉及的类 TokenKeyEndpoint + // /oauth/check_token : 用于资源服务器请求端点来检查令牌是否有效, 涉及的类 CheckTokenEndpoint + security.tokenKeyAccess("permitAll()") + .checkTokenAccess("isAuthenticated()") + .allowFormAuthenticationForClients(); + } + + + /** + * 基于jdbc存储客户端信息,需要先进行配置 + * + * @return + */ + public ClientDetailsService clientDetailsService() { + return new JdbcClientDetailsService(dataSource); + } + + /** + * 配置客户端信息 + * 数据库模式 + * @param clients + * @throws Exception + */ + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + clients.withClientDetails(clientDetailsService()); + } + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java new file mode 100644 index 0000000..7767160 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java @@ -0,0 +1,43 @@ +package org.micai.platform.authserver.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.token.TokenEnhancer; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Author liuCong + * @Date 2022/11/24 下午 2:40 + * @ClassName JwtTokenEnhancerConfig + * @Description + */ +@Configuration +public class JwtTokenEnhancer implements TokenEnhancer { + + /** + * @Author : liuCong + * @Date : 2022/11/25 下午 4:36 + * @Description : + * org.springframework.security.oauth2.provider.token.DefaultTokenServices 默认token创建方法 + * 在 AuthorizationServerTokenServices 增强访问令牌的策略。 + * org.springframework.security.oauth2.provider.token.TokenEnhancer#enhance(org.springframework.security.oauth2.common.OAuth2AccessToken, org.springframework.security.oauth2.provider.OAuth2Authentication) + * @Throws : // + * @Params : [oAuth2AccessToken, oAuth2Authentication] + * @Return : org.springframework.security.oauth2.common.OAuth2AccessToken + **/ + @Override + public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) { + Map info = new HashMap<>(); + //自定义的信息 + info.put("com", "liucong"); + info.put("with", "micai"); + ((DefaultOAuth2AccessToken) oAuth2AccessToken).setAdditionalInformation(info); + return oAuth2AccessToken; + } + + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/PasswordEncoder.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/PasswordEncoder.java new file mode 100644 index 0000000..0432001 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/PasswordEncoder.java @@ -0,0 +1,22 @@ +package org.micai.platform.authserver.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * @Author liuCong + * @Date 2022/12/8 下午 5:16 + * @ClassName PasswordEncoder + * @Description + */ +@Configuration +public class PasswordEncoder { + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + + return new BCryptPasswordEncoder(); + } + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java new file mode 100644 index 0000000..30dd59e --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java @@ -0,0 +1,50 @@ +package org.micai.platform.authserver.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; + +/** + * @Author liuCong + * @Date 2022/11/24 下午 3:38 + * @ClassName JwtTokenConfig + * @Description 配置Jwt令牌服务,生成jwt格式的token + */ +@Configuration +public class TokenConfig { + + + // jwt模式token + private static final String SIGN_KEY = "2728689210118790161"; + + + /** + * @Author : liuCong + * @Date : 2022/11/25 下午 5:02 + * @Description : + * @Throws : // + * @Params : [] + * @Return : org.springframework.security.oauth2.provider.token.store.JwtTokenStore + * 默认使用的是InMemoryTokenStore来存储,如果用数据库,那么每次token服务查询、存储,都需要SQL操作。这里重点 JdbcTokenStore。 + **/ + @Bean + public JwtTokenStore jwtTokenStore(){ + return new JwtTokenStore(jwtAccessTokenConverter()); + } + + /** + * @Author : liuCong + * @Date : 2022/11/25 下午 4:16 + * @Description :TokenEnhancer的子类,帮助程序在JWT编码的令牌值和OAuth身份验证信息之间进行转换(在两个方向上),同时充当TokenEnhancer授予令牌的时间。 + * @Throws : // + * @Params : [] + * @Return : org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter + **/ + @Bean + public JwtAccessTokenConverter jwtAccessTokenConverter(){ + JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); + converter.setSigningKey(SIGN_KEY); + return converter; + } +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java new file mode 100644 index 0000000..b8d764e --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java @@ -0,0 +1,121 @@ +package org.micai.platform.authserver.config; + + +import org.micai.platform.authserver.filter.JWTAuthenticationFilter; +import org.micai.platform.authserver.filter.JWTLoginFilter; +import org.micai.platform.authserver.handler.CustomAuthenticationFailureHandler; +import org.micai.platform.authserver.handler.Http401AuthenticationEntryPoint; +import org.micai.platform.authserver.provider.CustomAuthenticationProvider; +import org.micai.platform.authserver.service.*; +import org.micai.platform.authserver.service.impl.UserDetailsServiceImpl; +import org.micai.platform.common.base.constant.ConstantCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * SpringSecurity的配置 + * 通过SpringSecurity的配置,将JWTLoginFilter,JWTAuthenticationFilter组合在一起 + * + * @author zhaoxinguo on 2017/9/13. + */ +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private UserService userService; + + @Autowired + private BCryptPasswordEncoder bCryptPasswordEncoder; + + @Autowired + private UserRoleService userRoleService; + + @Autowired + private RoleService roleService; + + @Autowired + private RolePermissionService rolePermissionService; + + @Autowired + private PermissionService permissionService; + + @Autowired + private CustomAuthenticationFailureHandler customAuthenticationFailureHandler; + + @Value("${jwt.sign.key}") + private String signKey; + + @Value("${jwt.expiration.time}") + private int expirationTime; + + @Bean + @Override + protected AuthenticationManager authenticationManager() throws Exception { + return super.authenticationManager(); + } + + /** + * 设置 HTTP 验证规则 + * + * @param http + * @throws Exception + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .cors().and().csrf().disable()//禁止跨域 + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)//session管理机制: 不会保存session状态 + + .and() + .exceptionHandling()// 自定义异常处理 + .authenticationEntryPoint(new Http401AuthenticationEntryPoint(ConstantCode.BASE_REALM)) // 未登录处理 +// .and()//权限不足处理.exceptionHandling().accessDeniedHandler(customAccessDeniedHandler) // 自定义访问失败处理器 + + .and() + // 自定义过滤器 + .addFilter(new JWTLoginFilter(authenticationManager(), signKey, expirationTime, customAuthenticationFailureHandler)) + .addFilter(new JWTAuthenticationFilter(authenticationManager(), signKey)) + .authorizeRequests()// 验证策略 + .anyRequest().authenticated() // 所有请求需要身份认证 + + .and() + .logout() // 默认注销行为为logout,可以通过下面的方式来修改 + .logoutUrl("/logout") + .logoutSuccessUrl("/login")// 设置注销成功后跳转页面,默认是跳转到登录页面; +// .logoutSuccessHandler(customLogoutSuccessHandler) + .permitAll(); + } + + + @Bean + public UserDetailsService userDetailsService() { + return new UserDetailsServiceImpl(); + } + + + /** + * 该方法是登录的时候会进入 + * + * @param auth + * @throws Exception + */ + @Override + public void configure(AuthenticationManagerBuilder auth) throws Exception { + // 使用自定义身份验证组件 + auth.authenticationProvider(new CustomAuthenticationProvider(userService, bCryptPasswordEncoder,userRoleService, + roleService,rolePermissionService,permissionService)); + } +} diff --git a/src/main/java/org/micai/platform/auth/entity/Permission.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/Permission.java similarity index 97% rename from src/main/java/org/micai/platform/auth/entity/Permission.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/entity/Permission.java index c326063..3f34495 100644 --- a/src/main/java/org/micai/platform/auth/entity/Permission.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/Permission.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.authserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/entity/Role.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/Role.java similarity index 97% rename from src/main/java/org/micai/platform/auth/entity/Role.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/entity/Role.java index 0b1ac7c..18599a7 100644 --- a/src/main/java/org/micai/platform/auth/entity/Role.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/Role.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.authserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/entity/RolePermission.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/RolePermission.java similarity index 96% rename from src/main/java/org/micai/platform/auth/entity/RolePermission.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/entity/RolePermission.java index 8ce4d26..fcb5c9a 100644 --- a/src/main/java/org/micai/platform/auth/entity/RolePermission.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/RolePermission.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.authserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/entity/User.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/User.java similarity index 97% rename from src/main/java/org/micai/platform/auth/entity/User.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/entity/User.java index 2111296..8e6cb65 100644 --- a/src/main/java/org/micai/platform/auth/entity/User.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/User.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.authserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/entity/UserRole.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/UserRole.java similarity index 96% rename from src/main/java/org/micai/platform/auth/entity/UserRole.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/entity/UserRole.java index 9eb02ba..d8bc510 100644 --- a/src/main/java/org/micai/platform/auth/entity/UserRole.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/entity/UserRole.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.authserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/filter/JWTAuthenticationFilter.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTAuthenticationFilter.java similarity index 94% rename from src/main/java/org/micai/platform/auth/filter/JWTAuthenticationFilter.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTAuthenticationFilter.java index 1200420..7fc83f1 100644 --- a/src/main/java/org/micai/platform/auth/filter/JWTAuthenticationFilter.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTAuthenticationFilter.java @@ -1,13 +1,13 @@ -package org.micai.platform.auth.filter; +package org.micai.platform.authserver.filter; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import io.jsonwebtoken.*; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.service.GrantedAuthorityImpl; +import org.micai.platform.authserver.service.impl.GrantedAuthorityImpl; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.GrantedAuthority; @@ -19,7 +19,10 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; /** * 自定义JWT认证过滤器 diff --git a/src/main/java/org/micai/platform/auth/filter/JWTLoginFilter.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java similarity index 94% rename from src/main/java/org/micai/platform/auth/filter/JWTLoginFilter.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java index 366582b..dcd24ff 100644 --- a/src/main/java/org/micai/platform/auth/filter/JWTLoginFilter.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java @@ -1,15 +1,15 @@ -package org.micai.platform.auth.filter; +package org.micai.platform.authserver.filter; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.ObjectMapper; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.bo.UserQueryBo; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.handler.CustomAuthenticationFailureHandler; +import org.micai.platform.authserver.bo.UserQueryBo; +import org.micai.platform.authserver.handler.CustomAuthenticationFailureHandler; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.result.Result; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java new file mode 100644 index 0000000..2d3143b --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java @@ -0,0 +1,51 @@ +package org.micai.platform.authserver.handler; + +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.provider.AuthorizationRequest; +import org.springframework.security.oauth2.provider.approval.UserApprovalHandler; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Author liuCong + * @Date 2022/12/6 下午 3:32 + * @ClassName AuthApprovalHandler + * @Description + */ +public class AuthApprovalHandler implements UserApprovalHandler { + + private String approvalParameter = "user_oauth_approval"; + /** + * 被批准 默认是false 需要手动授权 + * + * @param authorizationRequest 授权请求 + * @param authentication 身份验证 + * @return boolean + */ + @Override + public boolean isApproved(AuthorizationRequest authorizationRequest, Authentication authentication) { + return true; + } + + @Override + public AuthorizationRequest checkForPreApproval(AuthorizationRequest authorizationRequest, Authentication authentication) { + return authorizationRequest; + } + + @Override + public AuthorizationRequest updateAfterApproval(AuthorizationRequest authorizationRequest, Authentication authentication) { + Map approvalParameters = authorizationRequest.getApprovalParameters(); + String flag = (String)approvalParameters.get(this.approvalParameter); + boolean approved = flag != null && flag.toLowerCase().equals("true"); + authorizationRequest.setApproved(approved); + return authorizationRequest; + } + + @Override + public Map getUserApprovalRequest(AuthorizationRequest authorizationRequest, Authentication authentication) { + Map model = new HashMap(); + model.putAll(authorizationRequest.getRequestParameters()); + return model; + } +} diff --git a/src/main/java/org/micai/platform/auth/handler/CustomAuthenticationFailureHandler.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/CustomAuthenticationFailureHandler.java similarity index 88% rename from src/main/java/org/micai/platform/auth/handler/CustomAuthenticationFailureHandler.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/handler/CustomAuthenticationFailureHandler.java index 8e40cb2..1b53083 100644 --- a/src/main/java/org/micai/platform/auth/handler/CustomAuthenticationFailureHandler.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/CustomAuthenticationFailureHandler.java @@ -1,8 +1,8 @@ -package org.micai.platform.auth.handler; +package org.micai.platform.authserver.handler; import com.fasterxml.jackson.databind.ObjectMapper; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.result.Result; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.stereotype.Component; diff --git a/src/main/java/org/micai/platform/auth/handler/Http401AuthenticationEntryPoint.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/Http401AuthenticationEntryPoint.java similarity index 90% rename from src/main/java/org/micai/platform/auth/handler/Http401AuthenticationEntryPoint.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/handler/Http401AuthenticationEntryPoint.java index 07c757a..8e96d54 100644 --- a/src/main/java/org/micai/platform/auth/handler/Http401AuthenticationEntryPoint.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/Http401AuthenticationEntryPoint.java @@ -1,6 +1,6 @@ -package org.micai.platform.auth.handler; +package org.micai.platform.authserver.handler; -import org.micai.platform.auth.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantCode; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; diff --git a/src/main/java/org/micai/platform/auth/handler/MyMetaObjectHandler.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/MyMetaObjectHandler.java similarity index 95% rename from src/main/java/org/micai/platform/auth/handler/MyMetaObjectHandler.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/handler/MyMetaObjectHandler.java index 45369f8..b665c0a 100644 --- a/src/main/java/org/micai/platform/auth/handler/MyMetaObjectHandler.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/MyMetaObjectHandler.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.handler; +package org.micai.platform.authserver.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; diff --git a/src/main/java/org/micai/platform/auth/interceptor/PlusInterceptor.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/interceptor/PlusInterceptor.java similarity index 93% rename from src/main/java/org/micai/platform/auth/interceptor/PlusInterceptor.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/interceptor/PlusInterceptor.java index fa3787e..ed70961 100644 --- a/src/main/java/org/micai/platform/auth/interceptor/PlusInterceptor.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/interceptor/PlusInterceptor.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.interceptor; +package org.micai.platform.authserver.interceptor; import com.baomidou.mybatisplus.annotation.DbType; diff --git a/src/main/java/org/micai/platform/auth/mapper/PermissionMapper.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/PermissionMapper.java similarity index 67% rename from src/main/java/org/micai/platform/auth/mapper/PermissionMapper.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/PermissionMapper.java index c9b7a60..87f2a29 100644 --- a/src/main/java/org/micai/platform/auth/mapper/PermissionMapper.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/PermissionMapper.java @@ -1,6 +1,6 @@ -package org.micai.platform.auth.mapper; +package org.micai.platform.authserver.mapper; -import org.micai.platform.auth.entity.Permission; +import org.micai.platform.authserver.entity.Permission; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** diff --git a/src/main/java/org/micai/platform/auth/mapper/RoleMapper.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/RoleMapper.java similarity index 67% rename from src/main/java/org/micai/platform/auth/mapper/RoleMapper.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/RoleMapper.java index ab45d55..cb79889 100644 --- a/src/main/java/org/micai/platform/auth/mapper/RoleMapper.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/RoleMapper.java @@ -1,6 +1,6 @@ -package org.micai.platform.auth.mapper; +package org.micai.platform.authserver.mapper; -import org.micai.platform.auth.entity.Role; +import org.micai.platform.authserver.entity.Role; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** diff --git a/src/main/java/org/micai/platform/auth/mapper/RolePermissionMapper.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/RolePermissionMapper.java similarity index 67% rename from src/main/java/org/micai/platform/auth/mapper/RolePermissionMapper.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/RolePermissionMapper.java index a249433..d8206cc 100644 --- a/src/main/java/org/micai/platform/auth/mapper/RolePermissionMapper.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/RolePermissionMapper.java @@ -1,6 +1,6 @@ -package org.micai.platform.auth.mapper; +package org.micai.platform.authserver.mapper; -import org.micai.platform.auth.entity.RolePermission; +import org.micai.platform.authserver.entity.RolePermission; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/UserMapper.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/UserMapper.java new file mode 100644 index 0000000..1b421f8 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/UserMapper.java @@ -0,0 +1,8 @@ +package org.micai.platform.authserver.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.micai.platform.authserver.entity.User; + +public interface UserMapper extends BaseMapper { + +} diff --git a/src/main/java/org/micai/platform/auth/mapper/UserRoleMapper.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/UserRoleMapper.java similarity index 67% rename from src/main/java/org/micai/platform/auth/mapper/UserRoleMapper.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/UserRoleMapper.java index 6ea5897..9d06a84 100644 --- a/src/main/java/org/micai/platform/auth/mapper/UserRoleMapper.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/mapper/UserRoleMapper.java @@ -1,6 +1,6 @@ -package org.micai.platform.auth.mapper; +package org.micai.platform.authserver.mapper; -import org.micai.platform.auth.entity.UserRole; +import org.micai.platform.authserver.entity.UserRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** diff --git a/src/main/java/org/micai/platform/auth/provider/CustomAuthenticationProvider.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/provider/CustomAuthenticationProvider.java similarity index 81% rename from src/main/java/org/micai/platform/auth/provider/CustomAuthenticationProvider.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/provider/CustomAuthenticationProvider.java index 425bd4e..8e13d01 100644 --- a/src/main/java/org/micai/platform/auth/provider/CustomAuthenticationProvider.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/provider/CustomAuthenticationProvider.java @@ -1,13 +1,14 @@ -package org.micai.platform.auth.provider; +package org.micai.platform.authserver.provider; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.MyAuthException; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.entity.*; -import org.micai.platform.auth.service.*; +import org.micai.platform.authserver.entity.*; +import org.micai.platform.authserver.service.*; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.MyAuthException; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -71,8 +72,7 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { String name = authentication.getName(); String password = authentication.getCredentials().toString(); // 认证逻辑 - /*UserDetails userDetails = userDetailsService.loadUserByUsername(name);*/ - User userDetails = userService.findByUsername(name); + User userDetails = userService.getOne(new LambdaQueryWrapper().eq(User::getUsername,name)); if (ObjectUtil.isEmpty(userDetails)) { throw new MyAuthException(ConstantEnum.USER_CODE_ERROR); } @@ -87,7 +87,7 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { } List roleIdList = userRoleList.stream().map(UserRole::getRoleId).collect(Collectors.toList()); List roleList = roleService.list(new QueryWrapper().lambda() - .in(Role::getId,roleIdList).eq(Role::getStatus,ConstantCode.STR_Z_ONE)); + .in(Role::getId,roleIdList).eq(Role::getStatus, ConstantCode.STR_Z_ONE)); if (ObjectUtil.isEmpty(roleList)){ throw new MyAuthException(ConstantEnum.NO_ROLE); } @@ -103,19 +103,9 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { throw new MyAuthException(ConstantEnum.NO_PERMISSION); } - StringBuilder roleStr = new StringBuilder(); - for (Role role : roleList) { - roleStr.append(ConstantCode.DEFAULT_ROLE_PREFIX).append(role.getRoleCode()); - roleStr.append(ConstantCode.SEPARATOR); - } - StringBuilder permissionStr = new StringBuilder(); - for (int i = 0; i < permissionList.size(); i++) { - permissionStr.append(permissionList.get(i).getPermissionCode()); - if ((permissionList.size() - 1) != i){ - permissionStr.append(ConstantCode.SEPARATOR); - } - } - String authStr = roleStr.append(permissionStr).toString(); + String roleStr = roleList.stream().distinct().map(Role::getRoleCode).collect(Collectors.joining(",")); + String permissionStr = permissionList.stream().distinct().map(Permission::getPermissionCode).collect(Collectors.joining(",")); + String authStr = roleStr + ConstantCode.SEPARATOR + permissionStr; // 这里设置权限和角色 List grantedAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList(authStr); // 生成令牌 这里令牌里面存入了:name,password,authorities, 当然你也可以放其他内容 diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/PermissionService.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/PermissionService.java new file mode 100644 index 0000000..4aa1885 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/PermissionService.java @@ -0,0 +1,17 @@ +package org.micai.platform.authserver.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.micai.platform.authserver.entity.Permission; + +/** + *

+ * 服务类 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +public interface PermissionService extends IService { + + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/RolePermissionService.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/RolePermissionService.java new file mode 100644 index 0000000..aa098d4 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/RolePermissionService.java @@ -0,0 +1,17 @@ +package org.micai.platform.authserver.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.micai.platform.authserver.entity.RolePermission; + +/** + *

+ * 服务类 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +public interface RolePermissionService extends IService { + + +} diff --git a/src/main/java/org/micai/platform/auth/service/SysDictService.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/RoleService.java similarity index 41% rename from src/main/java/org/micai/platform/auth/service/SysDictService.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/service/RoleService.java index 2efcd92..63c615d 100644 --- a/src/main/java/org/micai/platform/auth/service/SysDictService.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/RoleService.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.service; +package org.micai.platform.authserver.service; -import org.micai.platform.auth.entity.SysDict; import com.baomidou.mybatisplus.extension.service.IService; +import org.micai.platform.authserver.entity.Role; /** *

@@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.extension.service.IService; *

* * @author liucong - * @since 2021-12-06 + * @since 2021-12-04 */ -public interface SysDictService extends IService { +public interface RoleService extends IService { } diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserRoleService.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserRoleService.java new file mode 100644 index 0000000..4c5d691 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserRoleService.java @@ -0,0 +1,17 @@ +package org.micai.platform.authserver.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.micai.platform.authserver.entity.UserRole; + +/** + *

+ * 服务类 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +public interface UserRoleService extends IService { + + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserService.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserService.java new file mode 100644 index 0000000..d6e4f2e --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/UserService.java @@ -0,0 +1,8 @@ +package org.micai.platform.authserver.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.micai.platform.authserver.entity.User; + +public interface UserService extends IService { + +} diff --git a/src/main/java/org/micai/platform/auth/service/GrantedAuthorityImpl.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/GrantedAuthorityImpl.java similarity index 90% rename from src/main/java/org/micai/platform/auth/service/GrantedAuthorityImpl.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/GrantedAuthorityImpl.java index c3770b7..d54f52c 100644 --- a/src/main/java/org/micai/platform/auth/service/GrantedAuthorityImpl.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/GrantedAuthorityImpl.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.service; +package org.micai.platform.authserver.service.impl; import org.springframework.security.core.GrantedAuthority; diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/PermissionServiceImpl.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/PermissionServiceImpl.java new file mode 100644 index 0000000..9454fbc --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/PermissionServiceImpl.java @@ -0,0 +1,20 @@ +package org.micai.platform.authserver.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.micai.platform.authserver.entity.Permission; +import org.micai.platform.authserver.mapper.PermissionMapper; +import org.micai.platform.authserver.service.PermissionService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +@Service +public class PermissionServiceImpl extends ServiceImpl implements PermissionService { + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RolePermissionServiceImpl.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RolePermissionServiceImpl.java new file mode 100644 index 0000000..05d9822 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RolePermissionServiceImpl.java @@ -0,0 +1,20 @@ +package org.micai.platform.authserver.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.micai.platform.authserver.entity.RolePermission; +import org.micai.platform.authserver.mapper.RolePermissionMapper; +import org.micai.platform.authserver.service.RolePermissionService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +@Service +public class RolePermissionServiceImpl extends ServiceImpl implements RolePermissionService { + +} diff --git a/src/main/java/org/micai/platform/auth/service/impl/SysDictServiceImpl.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RoleServiceImpl.java similarity index 37% rename from src/main/java/org/micai/platform/auth/service/impl/SysDictServiceImpl.java rename to platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RoleServiceImpl.java index 099f0e9..e104f8e 100644 --- a/src/main/java/org/micai/platform/auth/service/impl/SysDictServiceImpl.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/RoleServiceImpl.java @@ -1,9 +1,9 @@ -package org.micai.platform.auth.service.impl; +package org.micai.platform.authserver.service.impl; -import org.micai.platform.auth.entity.SysDict; -import org.micai.platform.auth.mapper.SysDictMapper; -import org.micai.platform.auth.service.SysDictService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.micai.platform.authserver.entity.Role; +import org.micai.platform.authserver.mapper.RoleMapper; +import org.micai.platform.authserver.service.RoleService; import org.springframework.stereotype.Service; /** @@ -12,9 +12,9 @@ import org.springframework.stereotype.Service; *

* * @author liucong - * @since 2021-12-06 + * @since 2021-12-04 */ @Service -public class SysDictServiceImpl extends ServiceImpl implements SysDictService { +public class RoleServiceImpl extends ServiceImpl implements RoleService { } diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserDetailsServiceImpl.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserDetailsServiceImpl.java new file mode 100644 index 0000000..251334b --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserDetailsServiceImpl.java @@ -0,0 +1,76 @@ +package org.micai.platform.authserver.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.micai.platform.authserver.entity.*; +import org.micai.platform.authserver.service.*; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.MyAuthException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author liuCong + * @Date 2022/11/24 下午 1:36 + * @ClassName UserDetailsServiceImpl + * @Description + */ +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private UserService userService; + + @Autowired + private UserRoleService userRoleService; + + @Autowired + private RoleService roleService; + + @Autowired + private RolePermissionService rolePermissionService; + + @Autowired + private PermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userService.getOne(new LambdaQueryWrapper().eq(User::getUsername,username)); + if (user == null){ + throw new UsernameNotFoundException("未找到该用户"); + } + //获取用户权限 + List userRoleList = userRoleService.list(new QueryWrapper().lambda().eq(UserRole::getUserId,user.getId())); + if (ObjectUtil.isEmpty(userRoleList)){ + throw new MyAuthException(ConstantEnum.NO_ROLE); + } + List roleIdList = userRoleList.stream().map(UserRole::getRoleId).collect(Collectors.toList()); + List roleList = roleService.list(new QueryWrapper().lambda() + .in(Role::getId,roleIdList).eq(Role::getStatus, ConstantCode.STR_Z_ONE)); + if (ObjectUtil.isEmpty(roleList)){ + throw new MyAuthException(ConstantEnum.NO_ROLE); + } + List rolePermissionList = rolePermissionService.list(new QueryWrapper().lambda() + .in(RolePermission::getRoleId,roleIdList)); + if (ObjectUtil.isEmpty(rolePermissionList)){ + throw new MyAuthException(ConstantEnum.NO_PERMISSION); + } + List permissionIdList = rolePermissionList.stream().map(RolePermission::getPermissionId).collect(Collectors.toList()); + List permissionList = permissionService.list(new QueryWrapper().lambda() + .in(Permission::getId,permissionIdList).eq(Permission::getStatus,ConstantCode.STR_Z_ONE)); + if (ObjectUtil.isEmpty(permissionList)){ + throw new MyAuthException(ConstantEnum.NO_PERMISSION); + } + + String collect = permissionList.stream().map(Permission::getPermissionCode).collect(Collectors.joining(",")); + return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), AuthorityUtils.createAuthorityList(collect)); + } + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserRoleServiceImpl.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserRoleServiceImpl.java new file mode 100644 index 0000000..4dc40af --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,21 @@ +package org.micai.platform.authserver.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.micai.platform.authserver.entity.UserRole; +import org.micai.platform.authserver.mapper.UserRoleMapper; +import org.micai.platform.authserver.service.UserRoleService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +@Service +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + + +} diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserServiceImpl.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..ec30dd2 --- /dev/null +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/service/impl/UserServiceImpl.java @@ -0,0 +1,19 @@ +package org.micai.platform.authserver.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.micai.platform.authserver.entity.User; +import org.micai.platform.authserver.mapper.UserMapper; +import org.micai.platform.authserver.service.UserService; +import org.springframework.stereotype.Service; + +/** + * @ClassName UserServiceImpl + * @Description 用户Service + * @Author zhaoxinguo + * @Date 2021/12/3 20:40 + * @Version 1.0 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + +} diff --git a/src/main/resources/application-dev.yml b/platform-auth-server/src/main/resources/application-dev.yml similarity index 95% rename from src/main/resources/application-dev.yml rename to platform-auth-server/src/main/resources/application-dev.yml index 21003ed..4d1326a 100644 --- a/src/main/resources/application-dev.yml +++ b/platform-auth-server/src/main/resources/application-dev.yml @@ -8,7 +8,7 @@ spring: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/security?prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true username: root - password: root + password: ly1218 #jwt相关配置 jwt: diff --git a/src/main/resources/application-pro.yml b/platform-auth-server/src/main/resources/application-pro.yml similarity index 100% rename from src/main/resources/application-pro.yml rename to platform-auth-server/src/main/resources/application-pro.yml diff --git a/platform-auth-server/src/main/resources/application.yml b/platform-auth-server/src/main/resources/application.yml new file mode 100644 index 0000000..f57047c --- /dev/null +++ b/platform-auth-server/src/main/resources/application.yml @@ -0,0 +1,29 @@ +#spring +spring: + mvc: + pathmatch: + matching-strategy: ant_path_matcher + profiles: + active: dev + devtools: + restart: + enabled: true + +#mybatis-plus +mybatis-plus: + global-config: + db-config: + insert-strategy: not_empty + update-strategy: not_empty + where-strategy: not_empty + id-type: auto + table-prefix: tb_ + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +#jwt config +jwt: + header: Authorization + secret: NDU0NTY4amhmc3NkeHp6eGNxdzIlMjFAJTIxQCUyM2ZmNQ== + expiration: 7200000 diff --git a/platform-common/pom.xml b/platform-common/pom.xml new file mode 100644 index 0000000..53f791d --- /dev/null +++ b/platform-common/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + org.micai.platform + micai-platform-auth + 0.0.1-SNAPSHOT + + + platform-common + + + 8 + 8 + UTF-8 + 5.7.16 + + + + + + cn.hutool + hutool-all + ${hutool.version} + + + + \ No newline at end of file diff --git a/src/main/java/org/micai/platform/auth/constant/ConstantCode.java b/platform-common/src/main/java/org/micai/platform/common/base/constant/ConstantCode.java similarity index 99% rename from src/main/java/org/micai/platform/auth/constant/ConstantCode.java rename to platform-common/src/main/java/org/micai/platform/common/base/constant/ConstantCode.java index 240702d..52718ed 100644 --- a/src/main/java/org/micai/platform/auth/constant/ConstantCode.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/constant/ConstantCode.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.constant; +package org.micai.platform.common.base.constant; /** * @Author liuCong diff --git a/src/main/java/org/micai/platform/auth/constant/ConstantEnum.java b/platform-common/src/main/java/org/micai/platform/common/base/constant/ConstantEnum.java similarity index 98% rename from src/main/java/org/micai/platform/auth/constant/ConstantEnum.java rename to platform-common/src/main/java/org/micai/platform/common/base/constant/ConstantEnum.java index 4fc71fa..2bd94db 100644 --- a/src/main/java/org/micai/platform/auth/constant/ConstantEnum.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/constant/ConstantEnum.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.constant; +package org.micai.platform.common.base.constant; import javax.servlet.http.HttpServletResponse; diff --git a/src/main/java/org/micai/platform/auth/base/exception/DefaultException.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/DefaultException.java similarity index 85% rename from src/main/java/org/micai/platform/auth/base/exception/DefaultException.java rename to platform-common/src/main/java/org/micai/platform/common/base/exception/DefaultException.java index 2d70094..621c06e 100644 --- a/src/main/java/org/micai/platform/auth/base/exception/DefaultException.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/DefaultException.java @@ -1,8 +1,8 @@ -package org.micai.platform.auth.base.exception; +package org.micai.platform.common.base.exception; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.base.result.Result; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.result.Result; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/src/main/java/org/micai/platform/auth/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java similarity index 91% rename from src/main/java/org/micai/platform/auth/base/exception/GlobalExceptionHandler.java rename to platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index db0d836..c40349d 100644 --- a/src/main/java/org/micai/platform/auth/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -1,8 +1,8 @@ -package org.micai.platform.auth.base.exception; +package org.micai.platform.common.base.exception; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.constant.ConstantEnum; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.result.Result; import org.springframework.dao.DuplicateKeyException; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.annotation.ControllerAdvice; diff --git a/src/main/java/org/micai/platform/auth/base/exception/MyAuthException.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/MyAuthException.java similarity index 91% rename from src/main/java/org/micai/platform/auth/base/exception/MyAuthException.java rename to platform-common/src/main/java/org/micai/platform/common/base/exception/MyAuthException.java index bb37c99..dc796f2 100644 --- a/src/main/java/org/micai/platform/auth/base/exception/MyAuthException.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/MyAuthException.java @@ -1,6 +1,6 @@ -package org.micai.platform.auth.base.exception; +package org.micai.platform.common.base.exception; -import org.micai.platform.auth.constant.ConstantEnum; +import org.micai.platform.common.base.constant.ConstantEnum; import org.springframework.security.core.AuthenticationException; /** diff --git a/src/main/java/org/micai/platform/auth/base/exception/PlatformException.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/PlatformException.java similarity index 91% rename from src/main/java/org/micai/platform/auth/base/exception/PlatformException.java rename to platform-common/src/main/java/org/micai/platform/common/base/exception/PlatformException.java index 126848c..704f5ed 100644 --- a/src/main/java/org/micai/platform/auth/base/exception/PlatformException.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/PlatformException.java @@ -1,8 +1,8 @@ -package org.micai.platform.auth.base.exception; +package org.micai.platform.common.base.exception; import lombok.Data; import lombok.EqualsAndHashCode; -import org.micai.platform.auth.constant.ConstantEnum; +import org.micai.platform.common.base.constant.ConstantEnum; /** * @Author liuCong diff --git a/src/main/java/org/micai/platform/auth/base/result/Result.java b/platform-common/src/main/java/org/micai/platform/common/base/result/Result.java similarity index 85% rename from src/main/java/org/micai/platform/auth/base/result/Result.java rename to platform-common/src/main/java/org/micai/platform/common/base/result/Result.java index 966f8cf..b6fb9a0 100644 --- a/src/main/java/org/micai/platform/auth/base/result/Result.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/result/Result.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.base.result; +package org.micai.platform.common.base.result; import lombok.Data; -import org.micai.platform.auth.constant.ConstantEnum; +import org.micai.platform.common.base.constant.ConstantEnum; /** * 返回数据 diff --git a/src/main/java/org/micai/platform/auth/base/result/UploadResult.java b/platform-common/src/main/java/org/micai/platform/common/base/result/UploadResult.java similarity index 86% rename from src/main/java/org/micai/platform/auth/base/result/UploadResult.java rename to platform-common/src/main/java/org/micai/platform/common/base/result/UploadResult.java index 43cfba2..872204f 100644 --- a/src/main/java/org/micai/platform/auth/base/result/UploadResult.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/result/UploadResult.java @@ -1,8 +1,8 @@ -package org.micai.platform.auth.base.result; +package org.micai.platform.common.base.result; import lombok.Data; import lombok.experimental.Accessors; -import org.micai.platform.auth.constant.ConstantEnum; +import org.micai.platform.common.base.constant.ConstantEnum; /** * @Author liuCong diff --git a/src/main/java/org/micai/platform/auth/base/sms/Sms.java b/platform-common/src/main/java/org/micai/platform/common/base/sms/Sms.java similarity index 88% rename from src/main/java/org/micai/platform/auth/base/sms/Sms.java rename to platform-common/src/main/java/org/micai/platform/common/base/sms/Sms.java index 1a43c9c..4eb175d 100644 --- a/src/main/java/org/micai/platform/auth/base/sms/Sms.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/sms/Sms.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.base.sms; +package org.micai.platform.common.base.sms; /** * @Author zhaoxinguo diff --git a/src/main/java/org/micai/platform/auth/base/sms/impl/AbstractSms.java b/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/AbstractSms.java similarity index 59% rename from src/main/java/org/micai/platform/auth/base/sms/impl/AbstractSms.java rename to platform-common/src/main/java/org/micai/platform/common/base/sms/impl/AbstractSms.java index 79f5a10..92e18d3 100644 --- a/src/main/java/org/micai/platform/auth/base/sms/impl/AbstractSms.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/AbstractSms.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.base.sms.impl; +package org.micai.platform.common.base.sms.impl; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.sms.Sms; +import org.micai.platform.common.base.sms.Sms; /** * 系统短信接口抽象实现类 diff --git a/src/main/java/org/micai/platform/auth/base/sms/impl/QiniuSmsImpl.java b/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/QiniuSmsImpl.java similarity index 77% rename from src/main/java/org/micai/platform/auth/base/sms/impl/QiniuSmsImpl.java rename to platform-common/src/main/java/org/micai/platform/common/base/sms/impl/QiniuSmsImpl.java index d8e3f6a..7871dae 100644 --- a/src/main/java/org/micai/platform/auth/base/sms/impl/QiniuSmsImpl.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/QiniuSmsImpl.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.base.sms.impl; +package org.micai.platform.common.base.sms.impl; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.sms.Sms; +import org.micai.platform.common.base.sms.Sms; import org.springframework.stereotype.Component; /** diff --git a/platform-resources-server/pom.xml b/platform-resources-server/pom.xml new file mode 100644 index 0000000..0ad5c86 --- /dev/null +++ b/platform-resources-server/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + org.micai.platform + micai-platform-auth + 0.0.1-SNAPSHOT + + + platform-resources-server + + + 8 + 8 + UTF-8 + + + + + + org.micai.platform + platform-common + 0.0.1-SNAPSHOT + + + diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/ResourcesServerApplication.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/ResourcesServerApplication.java new file mode 100644 index 0000000..248986e --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/ResourcesServerApplication.java @@ -0,0 +1,19 @@ +package org.micai.platform.resourcesserver; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Author liuCong + * @Date ${DATE} ${TIME} + * @ClassName ${NAME} + * @Description + */ +@SpringBootApplication +@MapperScan("org.micai.platform.resourcesserver.mapper") +public class ResourcesServerApplication { + public static void main(String[] args) { + SpringApplication.run(ResourcesServerApplication.class,args); + } +} \ No newline at end of file diff --git a/src/main/java/org/micai/platform/auth/bo/MenuDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuDelBo.java similarity index 90% rename from src/main/java/org/micai/platform/auth/bo/MenuDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuDelBo.java index 9aac603..2503224 100644 --- a/src/main/java/org/micai/platform/auth/bo/MenuDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/MenuSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuSaveBo.java similarity index 96% rename from src/main/java/org/micai/platform/auth/bo/MenuSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuSaveBo.java index 8441677..840e094 100644 --- a/src/main/java/org/micai/platform/auth/bo/MenuSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/MenuUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuUpdateBo.java similarity index 96% rename from src/main/java/org/micai/platform/auth/bo/MenuUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuUpdateBo.java index cc287e9..fdb41c3 100644 --- a/src/main/java/org/micai/platform/auth/bo/MenuUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/MenuUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/OrganDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganDelBo.java similarity index 73% rename from src/main/java/org/micai/platform/auth/bo/OrganDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganDelBo.java index c29c515..827d99f 100644 --- a/src/main/java/org/micai/platform/auth/bo/OrganDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; /** * @Author zhaoxinguo diff --git a/src/main/java/org/micai/platform/auth/bo/OrganFindBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganFindBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/OrganFindBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganFindBo.java index 02e27f3..f33cfb5 100644 --- a/src/main/java/org/micai/platform/auth/bo/OrganFindBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganFindBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import cn.hutool.db.Page; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/bo/OrganSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganSaveBo.java similarity index 73% rename from src/main/java/org/micai/platform/auth/bo/OrganSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganSaveBo.java index 6c0a794..01ea1c2 100644 --- a/src/main/java/org/micai/platform/auth/bo/OrganSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; /** * @Author zhaoxinguo diff --git a/src/main/java/org/micai/platform/auth/bo/OrganUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganUpdateBo.java similarity index 74% rename from src/main/java/org/micai/platform/auth/bo/OrganUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganUpdateBo.java index a715f9b..53218b4 100644 --- a/src/main/java/org/micai/platform/auth/bo/OrganUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/OrganUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; /** * @Author zhaoxinguo diff --git a/src/main/java/org/micai/platform/auth/bo/PermissionDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionDelBo.java similarity index 92% rename from src/main/java/org/micai/platform/auth/bo/PermissionDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionDelBo.java index 131d3c1..0437fe4 100644 --- a/src/main/java/org/micai/platform/auth/bo/PermissionDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/PermissionFindBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionFindBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/PermissionFindBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionFindBo.java index 7d7f061..6d44e17 100644 --- a/src/main/java/org/micai/platform/auth/bo/PermissionFindBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionFindBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import cn.hutool.db.Page; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/bo/PermissionMenuDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuDelBo.java similarity index 92% rename from src/main/java/org/micai/platform/auth/bo/PermissionMenuDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuDelBo.java index 14e1522..03c2026 100644 --- a/src/main/java/org/micai/platform/auth/bo/PermissionMenuDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/PermissionMenuSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuSaveBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/PermissionMenuSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuSaveBo.java index ac9084b..2cd6ad9 100644 --- a/src/main/java/org/micai/platform/auth/bo/PermissionMenuSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/PermissionMenuUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuUpdateBo.java similarity index 94% rename from src/main/java/org/micai/platform/auth/bo/PermissionMenuUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuUpdateBo.java index 8cb2e5f..b0fcc55 100644 --- a/src/main/java/org/micai/platform/auth/bo/PermissionMenuUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionMenuUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/PermissionSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionSaveBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/PermissionSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionSaveBo.java index 99df3ca..2a0f32c 100644 --- a/src/main/java/org/micai/platform/auth/bo/PermissionSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/PermissionUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionUpdateBo.java similarity index 95% rename from src/main/java/org/micai/platform/auth/bo/PermissionUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionUpdateBo.java index a215a02..97ed584 100644 --- a/src/main/java/org/micai/platform/auth/bo/PermissionUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/PermissionUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/org/micai/platform/auth/bo/RoleDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleDelBo.java similarity index 92% rename from src/main/java/org/micai/platform/auth/bo/RoleDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleDelBo.java index abddc80..e9dd4bd 100644 --- a/src/main/java/org/micai/platform/auth/bo/RoleDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/RoleFindBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleFindBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/RoleFindBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleFindBo.java index 61160f7..37ff971 100644 --- a/src/main/java/org/micai/platform/auth/bo/RoleFindBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleFindBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import cn.hutool.db.Page; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/org/micai/platform/auth/bo/RolePermissionDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionDelBo.java similarity index 92% rename from src/main/java/org/micai/platform/auth/bo/RolePermissionDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionDelBo.java index fece4bb..98c0ab9 100644 --- a/src/main/java/org/micai/platform/auth/bo/RolePermissionDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/RolePermissionSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionSaveBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/RolePermissionSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionSaveBo.java index d117fc8..affeb3d 100644 --- a/src/main/java/org/micai/platform/auth/bo/RolePermissionSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/RolePermissionUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionUpdateBo.java similarity index 94% rename from src/main/java/org/micai/platform/auth/bo/RolePermissionUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionUpdateBo.java index 4ef8d5f..888bb70 100644 --- a/src/main/java/org/micai/platform/auth/bo/RolePermissionUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RolePermissionUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/RoleSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleSaveBo.java similarity index 91% rename from src/main/java/org/micai/platform/auth/bo/RoleSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleSaveBo.java index 40952bc..c2c52a0 100644 --- a/src/main/java/org/micai/platform/auth/bo/RoleSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/RoleUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleUpdateBo.java similarity index 94% rename from src/main/java/org/micai/platform/auth/bo/RoleUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleUpdateBo.java index 08e1f9f..9f98a70 100644 --- a/src/main/java/org/micai/platform/auth/bo/RoleUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/RoleUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/UserDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserDelBo.java similarity index 92% rename from src/main/java/org/micai/platform/auth/bo/UserDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserDelBo.java index 5726e7b..e10e3a2 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/UserFindBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserFindBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/UserFindBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserFindBo.java index 172096b..ce61d42 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserFindBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserFindBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import cn.hutool.db.Page; import io.swagger.annotations.ApiModel; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserQueryBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserQueryBo.java new file mode 100644 index 0000000..2b2018b --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserQueryBo.java @@ -0,0 +1,26 @@ +package org.micai.platform.resourcesserver.bo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@ApiModel(value = "用户登录bo") +@Accessors(chain = true) +public class UserQueryBo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户名") + private String username; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "图形验证码") + private String imageCode; + +} diff --git a/src/main/java/org/micai/platform/auth/bo/UserRoleDelBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleDelBo.java similarity index 92% rename from src/main/java/org/micai/platform/auth/bo/UserRoleDelBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleDelBo.java index 5e76d21..253f970 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserRoleDelBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleDelBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/UserRoleSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleSaveBo.java similarity index 93% rename from src/main/java/org/micai/platform/auth/bo/UserRoleSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleSaveBo.java index 8239ace..3d52202 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserRoleSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/UserRoleUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleUpdateBo.java similarity index 94% rename from src/main/java/org/micai/platform/auth/bo/UserRoleUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleUpdateBo.java index bea8fa2..568159a 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserRoleUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserRoleUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/UserSaveBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserSaveBo.java similarity index 95% rename from src/main/java/org/micai/platform/auth/bo/UserSaveBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserSaveBo.java index 8cd030e..67d9535 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserSaveBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserSaveBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/bo/UserUpdateBo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserUpdateBo.java similarity index 94% rename from src/main/java/org/micai/platform/auth/bo/UserUpdateBo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserUpdateBo.java index 17d70d5..4da773f 100644 --- a/src/main/java/org/micai/platform/auth/bo/UserUpdateBo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/bo/UserUpdateBo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.bo; +package org.micai.platform.resourcesserver.bo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/config/CodeGenerator.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/CodeGenerator.java similarity index 98% rename from src/main/java/org/micai/platform/auth/config/CodeGenerator.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/CodeGenerator.java index 235016b..752af62 100644 --- a/src/main/java/org/micai/platform/auth/config/CodeGenerator.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/CodeGenerator.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.config; +package org.micai.platform.resourcesserver.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/PasswordEncoder.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/PasswordEncoder.java new file mode 100644 index 0000000..f676a95 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/PasswordEncoder.java @@ -0,0 +1,22 @@ +package org.micai.platform.resourcesserver.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * @Author liuCong + * @Date 2022/12/8 下午 5:16 + * @ClassName PasswordEncoder + * @Description + */ +@Configuration +public class PasswordEncoder { + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + + return new BCryptPasswordEncoder(); + } + +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java new file mode 100644 index 0000000..7213971 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java @@ -0,0 +1,35 @@ +package org.micai.platform.resourcesserver.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; + +/** + * @Author liuCong + * @Date 2022/11/24 下午 5:01 + * @ClassName ResourceServerConfigurerAdapter + * @Description + */ +@Configuration +@EnableResourceServer +public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + + @Autowired + private JwtTokenStore jwtTokenStore; + + @Value("${resource-ids}") + private String resourceIds; + + @Override + public void configure(ResourceServerSecurityConfigurer resources) throws Exception { + resources + .resourceId(resourceIds)//设置资源id + .tokenStore(jwtTokenStore) + ; + } + +} diff --git a/src/main/java/org/micai/platform/auth/config/SiteOptions.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SiteOptions.java similarity index 96% rename from src/main/java/org/micai/platform/auth/config/SiteOptions.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SiteOptions.java index 391e61b..2594617 100644 --- a/src/main/java/org/micai/platform/auth/config/SiteOptions.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SiteOptions.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.config; +package org.micai.platform.resourcesserver.config; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/src/main/java/org/micai/platform/auth/config/SwaggerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java similarity index 98% rename from src/main/java/org/micai/platform/auth/config/SwaggerConfig.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java index 3c7d3b8..45294c8 100644 --- a/src/main/java/org/micai/platform/auth/config/SwaggerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.config; +package org.micai.platform.resourcesserver.config; import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI; import org.springframework.context.annotation.Bean; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java new file mode 100644 index 0000000..7b0bbcd --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java @@ -0,0 +1,41 @@ +package org.micai.platform.resourcesserver.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; + +/** + * @Author liuCong + * @Date 2022/11/24 下午 3:38 + * @ClassName JwtTokenConfig + * @Description 配置Jwt令牌服务,生成jwt格式的token + */ +@Configuration +public class TokenConfig { + + + // jwt模式token + private static final String SIGN_KEY = "2728689210118790161"; + + @Bean + public JwtTokenStore jwtTokenStore(){ + return new JwtTokenStore(jwtAccessTokenConverter()); + } + + + /** + * @Author : liuCong + * @Date : 2022/11/25 下午 4:16 + * @Description :TokenEnhancer的子类,帮助程序在JWT编码的令牌值和OAuth身份验证信息之间进行转换(在两个方向上),同时充当TokenEnhancer授予令牌的时间。 + * @Throws : // + * @Params : [] + * @Return : org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter + **/ + @Bean + public JwtAccessTokenConverter jwtAccessTokenConverter(){ + JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); + converter.setSigningKey(SIGN_KEY); + return converter; + } +} diff --git a/src/main/java/org/micai/platform/auth/config/WebSecurityConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/WebSecurityConfig.java similarity index 63% rename from src/main/java/org/micai/platform/auth/config/WebSecurityConfig.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/WebSecurityConfig.java index 48396dc..aedabf1 100644 --- a/src/main/java/org/micai/platform/auth/config/WebSecurityConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/WebSecurityConfig.java @@ -1,15 +1,16 @@ -package org.micai.platform.auth.config; - -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.filter.JWTAuthenticationFilter; -import org.micai.platform.auth.filter.JWTLoginFilter; -import org.micai.platform.auth.handler.CustomAuthenticationFailureHandler; -import org.micai.platform.auth.handler.Http401AuthenticationEntryPoint; -import org.micai.platform.auth.provider.CustomAuthenticationProvider; -import org.micai.platform.auth.service.*; +package org.micai.platform.resourcesserver.config; + +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.resourcesserver.filter.JWTAuthenticationFilter; +import org.micai.platform.resourcesserver.handler.CustomAuthenticationFailureHandler; +import org.micai.platform.resourcesserver.handler.Http401AuthenticationEntryPoint; +import org.micai.platform.resourcesserver.provider.CustomAuthenticationProvider; +import org.micai.platform.resourcesserver.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -44,9 +45,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { "/webjars/**", "/doc.html", - // -- image code - "/image/code" // other public endpoints of your API may be appended to this array + //oauth2 }; @Autowired @@ -76,6 +76,12 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Value("${jwt.expiration.time}") private int expirationTime; + @Bean + @Override + protected AuthenticationManager authenticationManager() throws Exception { + return super.authenticationManager(); + } + /** * 设置 HTTP 验证规则 * @@ -85,31 +91,30 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http + .cors().and().csrf().disable()//禁止跨域 + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)//session管理机制: 不会保存session状态 - .cors().and().csrf().disable()//禁止跨域 - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)//session管理机制: 不会保存session状态 - - .and() - .exceptionHandling()// 自定义异常处理 - .authenticationEntryPoint(new Http401AuthenticationEntryPoint(ConstantCode.BASE_REALM)) // 未登录处理 + .and() + .exceptionHandling()// 自定义异常处理 + .authenticationEntryPoint(new Http401AuthenticationEntryPoint(ConstantCode.BASE_REALM)) // 未登录处理 // .and()//权限不足处理.exceptionHandling().accessDeniedHandler(customAccessDeniedHandler) // 自定义访问失败处理器 - .and() - // 自定义过滤器 - .addFilter(new JWTLoginFilter(authenticationManager(), signKey, expirationTime, customAuthenticationFailureHandler)) - .addFilter(new JWTAuthenticationFilter(authenticationManager(), signKey)) - .authorizeRequests()// 验证策略 - .antMatchers(AUTH_WHITELIST).permitAll()// 无需验证路径 - .anyRequest().authenticated() // 所有请求需要身份认证 - - .and() - .logout() // 默认注销行为为logout,可以通过下面的方式来修改 - .logoutUrl("/logout") - .logoutSuccessUrl("/login")// 设置注销成功后跳转页面,默认是跳转到登录页面; + .and() + // 自定义过滤器 + .addFilter(new JWTAuthenticationFilter(authenticationManager(), signKey)) + .authorizeRequests()// 验证策略 + .antMatchers(AUTH_WHITELIST).permitAll()// 无需验证路径 + .anyRequest().authenticated() // 所有请求需要身份认证 + + .and() + .logout() // 默认注销行为为logout,可以通过下面的方式来修改 + .logoutUrl("/logout") + .logoutSuccessUrl("/login")// 设置注销成功后跳转页面,默认是跳转到登录页面; // .logoutSuccessHandler(customLogoutSuccessHandler) - .permitAll(); + .permitAll(); } + /** * 该方法是登录的时候会进入 * diff --git a/src/main/java/org/micai/platform/auth/controller/BaseController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/BaseController.java similarity index 85% rename from src/main/java/org/micai/platform/auth/controller/BaseController.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/BaseController.java index 57497c3..b610148 100644 --- a/src/main/java/org/micai/platform/auth/controller/BaseController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/BaseController.java @@ -1,9 +1,9 @@ -package org.micai.platform.auth.controller; +package org.micai.platform.resourcesserver.controller; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.storage.StorageFactory; -import org.micai.platform.auth.config.SiteOptions; -import org.micai.platform.auth.service.UserService; +import org.micai.platform.resourcesserver.config.SiteOptions; +import org.micai.platform.resourcesserver.service.UserService; +import org.micai.platform.resourcesserver.storage.StorageFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; diff --git a/src/main/java/org/micai/platform/auth/controller/PermissionController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/PermissionController.java similarity index 85% rename from src/main/java/org/micai/platform/auth/controller/PermissionController.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/PermissionController.java index aaed3e5..48b20e4 100644 --- a/src/main/java/org/micai/platform/auth/controller/PermissionController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/PermissionController.java @@ -1,19 +1,19 @@ -package org.micai.platform.auth.controller; +package org.micai.platform.resourcesserver.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.bo.PermissionDelBo; -import org.micai.platform.auth.bo.PermissionFindBo; -import org.micai.platform.auth.bo.PermissionSaveBo; -import org.micai.platform.auth.bo.PermissionUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.service.PermissionService; -import org.micai.platform.auth.vo.RoleListVo; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.common.base.result.Result; +import org.micai.platform.resourcesserver.bo.PermissionDelBo; +import org.micai.platform.resourcesserver.bo.PermissionFindBo; +import org.micai.platform.resourcesserver.bo.PermissionSaveBo; +import org.micai.platform.resourcesserver.bo.PermissionUpdateBo; +import org.micai.platform.resourcesserver.service.PermissionService; +import org.micai.platform.resourcesserver.vo.RoleListVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/org/micai/platform/auth/controller/RoleController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/RoleController.java similarity index 85% rename from src/main/java/org/micai/platform/auth/controller/RoleController.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/RoleController.java index 7168345..8d91f73 100644 --- a/src/main/java/org/micai/platform/auth/controller/RoleController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/RoleController.java @@ -1,19 +1,19 @@ -package org.micai.platform.auth.controller; +package org.micai.platform.resourcesserver.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.bo.RoleDelBo; -import org.micai.platform.auth.bo.RoleFindBo; -import org.micai.platform.auth.bo.RoleSaveBo; -import org.micai.platform.auth.bo.RoleUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.service.RoleService; -import org.micai.platform.auth.vo.UserListVo; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.common.base.result.Result; +import org.micai.platform.resourcesserver.bo.RoleDelBo; +import org.micai.platform.resourcesserver.bo.RoleFindBo; +import org.micai.platform.resourcesserver.bo.RoleSaveBo; +import org.micai.platform.resourcesserver.bo.RoleUpdateBo; +import org.micai.platform.resourcesserver.service.RoleService; +import org.micai.platform.resourcesserver.vo.UserListVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/org/micai/platform/auth/controller/RolePermissionController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/RolePermissionController.java similarity index 84% rename from src/main/java/org/micai/platform/auth/controller/RolePermissionController.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/RolePermissionController.java index acc5640..4e95137 100644 --- a/src/main/java/org/micai/platform/auth/controller/RolePermissionController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/RolePermissionController.java @@ -1,16 +1,16 @@ -package org.micai.platform.auth.controller; +package org.micai.platform.resourcesserver.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.bo.RolePermissionDelBo; -import org.micai.platform.auth.bo.RolePermissionSaveBo; -import org.micai.platform.auth.bo.RolePermissionUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.service.RolePermissionService; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.common.base.result.Result; +import org.micai.platform.resourcesserver.bo.RolePermissionDelBo; +import org.micai.platform.resourcesserver.bo.RolePermissionSaveBo; +import org.micai.platform.resourcesserver.bo.RolePermissionUpdateBo; +import org.micai.platform.resourcesserver.service.RolePermissionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/org/micai/platform/auth/controller/UploadController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UploadController.java similarity index 93% rename from src/main/java/org/micai/platform/auth/controller/UploadController.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UploadController.java index cc6ff85..3e7dabd 100644 --- a/src/main/java/org/micai/platform/auth/controller/UploadController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UploadController.java @@ -1,12 +1,12 @@ -package org.micai.platform.auth.controller; +package org.micai.platform.resourcesserver.controller; import cn.hutool.core.util.ObjectUtil; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.base.result.UploadResult; -import org.micai.platform.auth.utils.FileKit; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.result.UploadResult; +import org.micai.platform.resourcesserver.utils.FileKit; import org.springframework.stereotype.Controller; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.bind.annotation.PostMapping; diff --git a/src/main/java/org/micai/platform/auth/controller/UserController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserController.java similarity index 89% rename from src/main/java/org/micai/platform/auth/controller/UserController.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserController.java index a36e4b5..48f525e 100644 --- a/src/main/java/org/micai/platform/auth/controller/UserController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserController.java @@ -1,18 +1,18 @@ -package org.micai.platform.auth.controller; +package org.micai.platform.resourcesserver.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.bo.UserDelBo; -import org.micai.platform.auth.bo.UserFindBo; -import org.micai.platform.auth.bo.UserSaveBo; -import org.micai.platform.auth.bo.UserUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.entity.User; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.vo.UserListVo; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.common.base.result.Result; +import org.micai.platform.resourcesserver.bo.UserDelBo; +import org.micai.platform.resourcesserver.bo.UserFindBo; +import org.micai.platform.resourcesserver.bo.UserSaveBo; +import org.micai.platform.resourcesserver.bo.UserUpdateBo; +import org.micai.platform.resourcesserver.entity.User; +import org.micai.platform.resourcesserver.vo.UserListVo; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; diff --git a/src/main/java/org/micai/platform/auth/controller/UserRoleController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserRoleController.java similarity index 84% rename from src/main/java/org/micai/platform/auth/controller/UserRoleController.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserRoleController.java index b2d7254..d1e7f75 100644 --- a/src/main/java/org/micai/platform/auth/controller/UserRoleController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserRoleController.java @@ -1,16 +1,16 @@ -package org.micai.platform.auth.controller; +package org.micai.platform.resourcesserver.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.bo.UserRoleDelBo; -import org.micai.platform.auth.bo.UserRoleSaveBo; -import org.micai.platform.auth.bo.UserRoleUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.service.UserRoleService; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.common.base.result.Result; +import org.micai.platform.resourcesserver.bo.UserRoleDelBo; +import org.micai.platform.resourcesserver.bo.UserRoleSaveBo; +import org.micai.platform.resourcesserver.bo.UserRoleUpdateBo; +import org.micai.platform.resourcesserver.service.UserRoleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/org/micai/platform/auth/dto/UserAuthenticationDto.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/dto/UserAuthenticationDto.java similarity index 90% rename from src/main/java/org/micai/platform/auth/dto/UserAuthenticationDto.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/dto/UserAuthenticationDto.java index 70b2701..388380d 100644 --- a/src/main/java/org/micai/platform/auth/dto/UserAuthenticationDto.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/dto/UserAuthenticationDto.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.dto; +package org.micai.platform.resourcesserver.dto; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Permission.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Permission.java new file mode 100644 index 0000000..5bbe429 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Permission.java @@ -0,0 +1,65 @@ +package org.micai.platform.resourcesserver.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author liucong + * @since 2021-12-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="Permission对象", description="") +public class Permission implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "权限编码") + private String permissionCode; + + @ApiModelProperty(value = "权限名称") + private String permissionName; + + @ApiModelProperty(value = "描述") + private String description; + + @ApiModelProperty(value = "状态: 01 启用 02停用") + private String status; + + @ApiModelProperty(value = "创建人") + private Long createUserId; + + @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "修改人") + private Long updateUserId; + + @ApiModelProperty(value = "修改时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "版本") + @Version + @TableField(fill = FieldFill.UPDATE, condition = SqlCondition.EQUAL) + private Long version; + + +} diff --git a/src/main/java/org/micai/platform/auth/entity/SysDictItem.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Role.java similarity index 70% rename from src/main/java/org/micai/platform/auth/entity/SysDictItem.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Role.java index f16e584..aa8e8f3 100644 --- a/src/main/java/org/micai/platform/auth/entity/SysDictItem.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/Role.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.resourcesserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; @@ -16,34 +16,31 @@ import java.util.Date; *

* * @author liucong - * @since 2021-12-10 + * @since 2021-12-04 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@ApiModel(value="SysDictItem对象", description="") -public class SysDictItem implements Serializable { +@ApiModel(value="Role对象", description="") +public class Role implements Serializable { private static final long serialVersionUID = 1L; - @ApiModelProperty(value = "主键id") + @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Long id; - @ApiModelProperty(value = "字典表id") - private Long dictId; + @ApiModelProperty(value = "角色编码") + private String roleCode; - @ApiModelProperty(value = "字典项文本") - private String itemText; - - @ApiModelProperty(value = "字典项值") - private String itemValue; + @ApiModelProperty(value = "角色名称") + private String roleName; @ApiModelProperty(value = "描述") private String description; - @ApiModelProperty(value = "排序") - private Integer sn; + @ApiModelProperty(value = "状态: 01 启用 02停用") + private String status; @ApiModelProperty(value = "创建人") private Long createUserId; @@ -59,11 +56,9 @@ public class SysDictItem implements Serializable { @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; - @ApiModelProperty(value = "状态: 01 启用 02停用") - private String status; - @ApiModelProperty(value = "版本号") @Version + @TableField(fill = FieldFill.UPDATE, condition = SqlCondition.EQUAL) private Long version; diff --git a/src/main/java/org/micai/platform/auth/entity/PermissionMenu.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/RolePermission.java similarity index 82% rename from src/main/java/org/micai/platform/auth/entity/PermissionMenu.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/RolePermission.java index 3518962..4dafa61 100644 --- a/src/main/java/org/micai/platform/auth/entity/PermissionMenu.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/RolePermission.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.resourcesserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; @@ -16,25 +16,25 @@ import java.util.Date; *

* * @author liucong - * @since 2021-12-06 + * @since 2021-12-04 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@ApiModel(value="PermissionMenu对象", description="") -public class PermissionMenu implements Serializable { +@ApiModel(value="RolePermission对象", description="") +public class RolePermission implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; + @ApiModelProperty(value = "角色id") + private Long roleId; + @ApiModelProperty(value = "权限id") private Long permissionId; - @ApiModelProperty(value = "菜单id") - private Long menuId; - @ApiModelProperty(value = "创建人id") private Long createUserId; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/User.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/User.java new file mode 100644 index 0000000..7f39f88 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/User.java @@ -0,0 +1,68 @@ +package org.micai.platform.resourcesserver.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author liucong + * @since 2021-12-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="User对象", description="") +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "用户名") + private String username; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "创建人") + private Long createUserId; + + @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "修改人") + private Long updateUserId; + + @ApiModelProperty(value = "修改时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "状态: 01 启用 02停用") + private String status; + + @ApiModelProperty(value = "版本") + @Version + @TableField(fill = FieldFill.UPDATE, condition = SqlCondition.EQUAL) + private Long version; + + +} diff --git a/src/main/java/org/micai/platform/auth/entity/OrganUser.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/UserRole.java similarity index 74% rename from src/main/java/org/micai/platform/auth/entity/OrganUser.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/UserRole.java index bd5b74d..2d5f44b 100644 --- a/src/main/java/org/micai/platform/auth/entity/OrganUser.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/entity/UserRole.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.entity; +package org.micai.platform.resourcesserver.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; @@ -16,27 +16,28 @@ import java.util.Date; *

* * @author liucong - * @since 2021-12-06 + * @since 2021-12-04 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@ApiModel(value="OrganUser对象", description="") -public class OrganUser implements Serializable { +@ApiModel(value="UserRole对象", description="") +public class UserRole implements Serializable { private static final long serialVersionUID = 1L; + @ApiModelProperty(value = "主键id") @TableId(value = "id", type = IdType.AUTO) private Long id; - @ApiModelProperty(value = "组织机构id") - private Long organId; - @ApiModelProperty(value = "用户id") private Long userId; - @ApiModelProperty(value = "创建人") - private Long createUserId; + @ApiModelProperty(value = "角色id") + private Long roleId; + + @ApiModelProperty(value = "创建用户id") + private Long creatUserId; @ApiModelProperty(value = "创建时间") @TableField(fill = FieldFill.INSERT) diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java new file mode 100644 index 0000000..2155e9c --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java @@ -0,0 +1,139 @@ +package org.micai.platform.resourcesserver.filter; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import io.jsonwebtoken.*; +import lombok.extern.slf4j.Slf4j; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.service.impl.GrantedAuthorityImpl; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * 自定义JWT认证过滤器 + * 该类继承自BasicAuthenticationFilter,在doFilterInternal方法中, + * 从http头的Authorization 项读取token数据,然后用Jwts包提供的方法校验token的合法性。 + * 如果校验通过,就认为这是一个取得授权的合法请求 + * @author zhaoxinguo on 2017/9/13. + */ +@Slf4j +public class JWTAuthenticationFilter extends BasicAuthenticationFilter { + + private final String signKey; + + public JWTAuthenticationFilter(AuthenticationManager authenticationManager, String signKey) { + super(authenticationManager); + this.signKey = signKey; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + String header = request.getHeader(ConstantCode.AUTHORIZATION); + if (ObjectUtil.isEmpty(header) || !header.startsWith(ConstantCode.HEADER_BEARER)) { + chain.doFilter(request, response); + return; + } + UsernamePasswordAuthenticationToken authentication = getAuthentication(request, response); + SecurityContextHolder.getContext().setAuthentication(authentication); + chain.doFilter(request, response); + } + + private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + try { + long start = System.currentTimeMillis(); + String token = request.getHeader(ConstantCode.AUTHORIZATION); + if (ObjectUtil.isEmpty(token)) { + throw new PlatformException(ConstantEnum.TOKEN_MISS); + } + // parse the token. + String user = null; + Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token.replace(ConstantCode.HEADER_BEARER, "")).getBody(); + log.info("相关信息 : {}",claims.getSubject()); + // token签发时间 + long issuedAt = claims.getIssuedAt().getTime(); + // 当前时间 + long currentTimeMillis = System.currentTimeMillis(); + // token过期时间 + long expirationTime = claims.getExpiration().getTime(); + // 1. 签发时间 < 当前时间 < (签发时间+((token过期时间-token签发时间)/2)) 不刷新token + // 2. (签发时间+((token过期时间-token签发时间)/2)) < 当前时间 < token过期时间 刷新token并返回给前端 + // 3. tokne过期时间 < 当前时间 跳转登录,重新登录获取token + // 验证token时间有效性 + if ((issuedAt + ((expirationTime - issuedAt) / 2)) < currentTimeMillis && currentTimeMillis < expirationTime) { + + // 重新生成token start + Calendar calendar = Calendar.getInstance(); + Date now = calendar.getTime(); + // 设置签发时间 + calendar.setTime(new Date()); + // 设置过期时间 + calendar.add(Calendar.MINUTE, Long.bitCount(expirationTime)); + Date time = calendar.getTime(); + String refreshToken = Jwts.builder() + .setSubject(claims.getSubject()) + .setIssuedAt(now)//签发时间 + .setExpiration(time)//过期时间 + .signWith(SignatureAlgorithm.HS512, signKey) //采用什么算法是可以自己选择的,不一定非要采用HS512 + .compact(); + // 重新生成token end + + // 主动刷新token,并返回给前端 + response.addHeader(ConstantCode.REFRESH_TOKEN, refreshToken); + } + long end = System.currentTimeMillis(); + logger.info("执行时间: " + (end - start) + " 毫秒"); + user = claims.getSubject(); + if (ObjectUtil.isNotEmpty(user)) { + String authStr = user.split("-")[ConstantCode.INT_TWO]; + List authList = JSON.parseArray(authStr, String.class); + ArrayList authorities = new ArrayList<>(); + for (String auth : authList) { + authorities.add(new GrantedAuthorityImpl(auth)); + } + return new UsernamePasswordAuthenticationToken(user, null, authorities); + } + } catch (ExpiredJwtException e) { + // 异常捕获、发送到ExpiredJwtException + request.setAttribute("expiredJwtException", e); + // 将异常分发到ExpiredJwtException控制器 + request.getRequestDispatcher("/expiredJwtException").forward(request, response); + } catch (UnsupportedJwtException e) { + // 异常捕获、发送到UnsupportedJwtException + request.setAttribute("unsupportedJwtException", e); + // 将异常分发到UnsupportedJwtException控制器 + request.getRequestDispatcher("/unsupportedJwtException").forward(request, response); + } catch (MalformedJwtException e) { + // 异常捕获、发送到MalformedJwtException + request.setAttribute("malformedJwtException", e); + // 将异常分发到MalformedJwtException控制器 + request.getRequestDispatcher("/malformedJwtException").forward(request, response); + } catch (SignatureException e) { + // 异常捕获、发送到SignatureException + request.setAttribute("signatureException", e); + // 将异常分发到SignatureException控制器 + request.getRequestDispatcher("/signatureException").forward(request, response); + } catch (IllegalArgumentException e) { + // 异常捕获、发送到IllegalArgumentException + request.setAttribute("illegalArgumentException", e); + // 将异常分发到IllegalArgumentException控制器 + request.getRequestDispatcher("/illegalArgumentException").forward(request, response); + } + return null; + } + +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java new file mode 100644 index 0000000..25cc053 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java @@ -0,0 +1,34 @@ +package org.micai.platform.resourcesserver.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.result.Result; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * @Author liuCong + * @Date 2022/1/4 17:20 + * @ClassName CustomAuthenticationFailureHandler + * @Description + */ +@Component +public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { + @Override + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType(ConstantCode.CONTENT_TYPE_JSON); + Result result = new Result(HttpServletResponse.SC_UNAUTHORIZED,exception.getMessage()); + PrintWriter out = response.getWriter(); + out.write(new ObjectMapper().writeValueAsString(result)); + out.flush(); + out.close(); + } +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/Http401AuthenticationEntryPoint.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/Http401AuthenticationEntryPoint.java new file mode 100644 index 0000000..ca77a9a --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/Http401AuthenticationEntryPoint.java @@ -0,0 +1,31 @@ +package org.micai.platform.resourcesserver.handler; + +import org.micai.platform.common.base.constant.ConstantCode; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Auther: zhaoxinguo + * @Date: 2018/9/20 14:55 + * @Description: 自定义认证拦截器 + */ +public class Http401AuthenticationEntryPoint implements AuthenticationEntryPoint { + + private final String headerValue; + + public Http401AuthenticationEntryPoint(String headerValue) { + this.headerValue = headerValue; + } + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + response.setHeader(ConstantCode.AUTHORIZATION, this.headerValue); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage()); + } + +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/MyMetaObjectHandler.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/MyMetaObjectHandler.java new file mode 100644 index 0000000..c99cdb3 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/MyMetaObjectHandler.java @@ -0,0 +1,39 @@ +package org.micai.platform.resourcesserver.handler; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * @Author liuCong + * @Date 2021/12/11 11:36 + * @ClassName MyMetaObjectHandler + * @Description + */ +@Component +public class MyMetaObjectHandler implements MetaObjectHandler { + + private final String CREATE_TIME = "createTime"; + private final String UPDATE_TIME = "updateTime"; + private final String VERSION = "version"; + /** + * 插入时的填充策略 + * @param metaObject + */ + @Override + public void insertFill(MetaObject metaObject) { + this.setFieldValByName(CREATE_TIME, new Date(), metaObject); + this.setFieldValByName(UPDATE_TIME, new Date(), metaObject); + } + + /** + * 更新时的填充策略 + * @param metaObject + */ + @Override + public void updateFill(MetaObject metaObject) { + this.setFieldValByName(UPDATE_TIME, new Date(), metaObject); + } +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/interceptor/PlusInterceptor.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/interceptor/PlusInterceptor.java new file mode 100644 index 0000000..e5e0dce --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/interceptor/PlusInterceptor.java @@ -0,0 +1,25 @@ +package org.micai.platform.resourcesserver.interceptor; + + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; + +/** + * @Author liuCong + * @Date 2021/12/13 16:06 + * @ClassName MybatisPlusInterceptor + * @Description + */ +@Configuration +public class PlusInterceptor { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/PermissionMapper.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/PermissionMapper.java new file mode 100644 index 0000000..81a2f50 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/PermissionMapper.java @@ -0,0 +1,16 @@ +package org.micai.platform.resourcesserver.mapper; + +import org.micai.platform.resourcesserver.entity.Permission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +public interface PermissionMapper extends BaseMapper { + +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RoleMapper.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RoleMapper.java new file mode 100644 index 0000000..9a2b7f9 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RoleMapper.java @@ -0,0 +1,16 @@ +package org.micai.platform.resourcesserver.mapper; + +import org.micai.platform.resourcesserver.entity.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +public interface RoleMapper extends BaseMapper { + +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RolePermissionMapper.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RolePermissionMapper.java new file mode 100644 index 0000000..e77154b --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/RolePermissionMapper.java @@ -0,0 +1,16 @@ +package org.micai.platform.resourcesserver.mapper; + +import org.micai.platform.resourcesserver.entity.RolePermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +public interface RolePermissionMapper extends BaseMapper { + +} diff --git a/src/main/java/org/micai/platform/auth/mapper/UserMapper.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/UserMapper.java similarity index 59% rename from src/main/java/org/micai/platform/auth/mapper/UserMapper.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/UserMapper.java index 966c526..082527b 100644 --- a/src/main/java/org/micai/platform/auth/mapper/UserMapper.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/UserMapper.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.mapper; +package org.micai.platform.resourcesserver.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.micai.platform.auth.entity.User; +import org.micai.platform.resourcesserver.entity.User; public interface UserMapper extends BaseMapper { diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/UserRoleMapper.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/UserRoleMapper.java new file mode 100644 index 0000000..6c1ea3f --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/mapper/UserRoleMapper.java @@ -0,0 +1,16 @@ +package org.micai.platform.resourcesserver.mapper; + +import org.micai.platform.resourcesserver.entity.UserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author liucong + * @since 2021-12-04 + */ +public interface UserRoleMapper extends BaseMapper { + +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/provider/CustomAuthenticationProvider.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/provider/CustomAuthenticationProvider.java new file mode 100644 index 0000000..eb5e1da --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/provider/CustomAuthenticationProvider.java @@ -0,0 +1,127 @@ +package org.micai.platform.resourcesserver.provider; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.MyAuthException; +import org.micai.platform.resourcesserver.entity.*; +import org.micai.platform.resourcesserver.service.*; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 自定义身份认证验证组件 + * + * @author zhaoxinguo on 2017/9/12. + */ +@Slf4j +public class CustomAuthenticationProvider implements AuthenticationProvider { + + private UserService userService; + + private BCryptPasswordEncoder bCryptPasswordEncoder; + + private UserRoleService userRoleService; + + private RoleService roleService; + + private RolePermissionService rolePermissionService; + + private PermissionService permissionService; + + + public CustomAuthenticationProvider(UserService userService, BCryptPasswordEncoder bCryptPasswordEncoder, UserRoleService userRoleService, + RoleService roleService, RolePermissionService rolePermissionService, PermissionService permissionService) { + this.userService = userService; + this.bCryptPasswordEncoder = bCryptPasswordEncoder; + this.userRoleService = userRoleService; + this.roleService = roleService; + this.rolePermissionService = rolePermissionService; + this.permissionService = permissionService; + } + + /** + *执行与以下合同相同的身份验证 + * {@link org.springframework.security.authentication.AuthenticationManager#authenticate(Authentication)} + *。 + * + * @param authentication 身份验证请求对象。 + * + * @返回包含凭证的经过完全认证的对象。 可能会回来 + * null (如果 AuthenticationProvider 无法支持) + * 对传递的 Authentication 对象的身份验证。 在这种情况下, + * 支持所提供的下一个 AuthenticationProvider + * 将尝试 Authentication 类。 + * + * @throws AuthenticationException 如果身份验证失败。 + */ + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + // 获取认证的用户名 & 密码 + String name = authentication.getName(); + String password = authentication.getCredentials().toString(); + // 认证逻辑 + User userDetails = userService.getOne(new LambdaQueryWrapper().eq(User::getUsername,name)); + if (ObjectUtil.isEmpty(userDetails)) { + throw new MyAuthException(ConstantEnum.USER_CODE_ERROR); + } + + if (!bCryptPasswordEncoder.matches(password, userDetails.getPassword())) { + throw new MyAuthException(ConstantEnum.USER_CODE_ERROR); + } + //获取用户权限 + List userRoleList = userRoleService.list(new QueryWrapper().lambda().eq(UserRole::getUserId,userDetails.getId())); + if (ObjectUtil.isEmpty(userRoleList)){ + throw new MyAuthException(ConstantEnum.NO_ROLE); + } + List roleIdList = userRoleList.stream().map(UserRole::getRoleId).collect(Collectors.toList()); + List roleList = roleService.list(new QueryWrapper().lambda() + .in(Role::getId,roleIdList).eq(Role::getStatus, ConstantCode.STR_Z_ONE)); + if (ObjectUtil.isEmpty(roleList)){ + throw new MyAuthException(ConstantEnum.NO_ROLE); + } + List rolePermissionList = rolePermissionService.list(new QueryWrapper().lambda() + .in(RolePermission::getRoleId,roleIdList)); + if (ObjectUtil.isEmpty(rolePermissionList)){ + throw new MyAuthException(ConstantEnum.NO_PERMISSION); + } + List permissionIdList = rolePermissionList.stream().map(RolePermission::getPermissionId).collect(Collectors.toList()); + List permissionList = permissionService.list(new QueryWrapper().lambda() + .in(Permission::getId,permissionIdList).eq(Permission::getStatus,ConstantCode.STR_Z_ONE)); + if (ObjectUtil.isEmpty(permissionList)){ + throw new MyAuthException(ConstantEnum.NO_PERMISSION); + } + + String roleStr = roleList.stream().distinct().map(Role::getRoleCode).collect(Collectors.joining(",")); + String permissionStr = permissionList.stream().distinct().map(Permission::getPermissionCode).collect(Collectors.joining(",")); + String authStr = roleStr + ConstantCode.SEPARATOR + permissionStr; + // 这里设置权限和角色 + List grantedAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList(authStr); + // 生成令牌 这里令牌里面存入了:name,password,authorities, 当然你也可以放其他内容 + name = userDetails.getId() + "-" + name; + log.info("authStr:{} , 用户:{}", authStr, name); + return new UsernamePasswordAuthenticationToken(name, password, grantedAuthorities); + } + + /** + * 是否可以提供输入类型的认证服务 + * @param authentication + * @return + */ + @Override + public boolean supports(Class authentication) { + return authentication.equals(UsernamePasswordAuthenticationToken.class); + } + +} diff --git a/src/main/java/org/micai/platform/auth/service/PermissionService.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/PermissionService.java similarity index 56% rename from src/main/java/org/micai/platform/auth/service/PermissionService.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/PermissionService.java index 7d213f4..ca8a3cb 100644 --- a/src/main/java/org/micai/platform/auth/service/PermissionService.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/PermissionService.java @@ -1,13 +1,13 @@ -package org.micai.platform.auth.service; +package org.micai.platform.resourcesserver.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import org.micai.platform.auth.bo.PermissionDelBo; -import org.micai.platform.auth.bo.PermissionFindBo; -import org.micai.platform.auth.bo.PermissionSaveBo; -import org.micai.platform.auth.bo.PermissionUpdateBo; -import org.micai.platform.auth.entity.Permission; -import org.micai.platform.auth.vo.RoleListVo; +import org.micai.platform.resourcesserver.bo.PermissionDelBo; +import org.micai.platform.resourcesserver.bo.PermissionFindBo; +import org.micai.platform.resourcesserver.bo.PermissionSaveBo; +import org.micai.platform.resourcesserver.bo.PermissionUpdateBo; +import org.micai.platform.resourcesserver.entity.Permission; +import org.micai.platform.resourcesserver.vo.RoleListVo; /** *

diff --git a/src/main/java/org/micai/platform/auth/service/RolePermissionService.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/RolePermissionService.java similarity index 55% rename from src/main/java/org/micai/platform/auth/service/RolePermissionService.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/RolePermissionService.java index e1697c8..4a17ca5 100644 --- a/src/main/java/org/micai/platform/auth/service/RolePermissionService.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/RolePermissionService.java @@ -1,9 +1,9 @@ -package org.micai.platform.auth.service; +package org.micai.platform.resourcesserver.service; -import org.micai.platform.auth.bo.RolePermissionDelBo; -import org.micai.platform.auth.bo.RolePermissionSaveBo; -import org.micai.platform.auth.bo.RolePermissionUpdateBo; -import org.micai.platform.auth.entity.RolePermission; +import org.micai.platform.resourcesserver.bo.RolePermissionDelBo; +import org.micai.platform.resourcesserver.bo.RolePermissionSaveBo; +import org.micai.platform.resourcesserver.bo.RolePermissionUpdateBo; +import org.micai.platform.resourcesserver.entity.RolePermission; import com.baomidou.mybatisplus.extension.service.IService; /** diff --git a/src/main/java/org/micai/platform/auth/service/RoleService.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/RoleService.java similarity index 55% rename from src/main/java/org/micai/platform/auth/service/RoleService.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/RoleService.java index 9a925dc..ffe0696 100644 --- a/src/main/java/org/micai/platform/auth/service/RoleService.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/RoleService.java @@ -1,13 +1,13 @@ -package org.micai.platform.auth.service; +package org.micai.platform.resourcesserver.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.micai.platform.auth.bo.RoleDelBo; -import org.micai.platform.auth.bo.RoleFindBo; -import org.micai.platform.auth.bo.RoleSaveBo; -import org.micai.platform.auth.bo.RoleUpdateBo; -import org.micai.platform.auth.entity.Role; +import org.micai.platform.resourcesserver.bo.RoleDelBo; +import org.micai.platform.resourcesserver.bo.RoleFindBo; +import org.micai.platform.resourcesserver.bo.RoleSaveBo; +import org.micai.platform.resourcesserver.bo.RoleUpdateBo; +import org.micai.platform.resourcesserver.entity.Role; import com.baomidou.mybatisplus.extension.service.IService; -import org.micai.platform.auth.vo.UserListVo; +import org.micai.platform.resourcesserver.vo.UserListVo; /** *

diff --git a/src/main/java/org/micai/platform/auth/service/UserRoleService.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/UserRoleService.java similarity index 55% rename from src/main/java/org/micai/platform/auth/service/UserRoleService.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/UserRoleService.java index 45ce2f0..8d3c12b 100644 --- a/src/main/java/org/micai/platform/auth/service/UserRoleService.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/UserRoleService.java @@ -1,9 +1,9 @@ -package org.micai.platform.auth.service; +package org.micai.platform.resourcesserver.service; -import org.micai.platform.auth.bo.UserRoleDelBo; -import org.micai.platform.auth.bo.UserRoleSaveBo; -import org.micai.platform.auth.bo.UserRoleUpdateBo; -import org.micai.platform.auth.entity.UserRole; +import org.micai.platform.resourcesserver.bo.UserRoleDelBo; +import org.micai.platform.resourcesserver.bo.UserRoleSaveBo; +import org.micai.platform.resourcesserver.bo.UserRoleUpdateBo; +import org.micai.platform.resourcesserver.entity.UserRole; import com.baomidou.mybatisplus.extension.service.IService; /** diff --git a/src/main/java/org/micai/platform/auth/service/UserService.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/UserService.java similarity index 56% rename from src/main/java/org/micai/platform/auth/service/UserService.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/UserService.java index 68ff57d..3027e06 100644 --- a/src/main/java/org/micai/platform/auth/service/UserService.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/UserService.java @@ -1,13 +1,13 @@ -package org.micai.platform.auth.service; +package org.micai.platform.resourcesserver.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import org.micai.platform.auth.bo.UserDelBo; -import org.micai.platform.auth.bo.UserFindBo; -import org.micai.platform.auth.bo.UserSaveBo; -import org.micai.platform.auth.bo.UserUpdateBo; -import org.micai.platform.auth.entity.User; -import org.micai.platform.auth.vo.UserListVo; +import org.micai.platform.resourcesserver.bo.UserDelBo; +import org.micai.platform.resourcesserver.bo.UserFindBo; +import org.micai.platform.resourcesserver.bo.UserSaveBo; +import org.micai.platform.resourcesserver.bo.UserUpdateBo; +import org.micai.platform.resourcesserver.entity.User; +import org.micai.platform.resourcesserver.vo.UserListVo; import java.util.List; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/GrantedAuthorityImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/GrantedAuthorityImpl.java new file mode 100644 index 0000000..551c06f --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/GrantedAuthorityImpl.java @@ -0,0 +1,26 @@ +package org.micai.platform.resourcesserver.service.impl; + +import org.springframework.security.core.GrantedAuthority; + +/** + * 权限类型,负责存储权限和角色 + * + * @author zhaoxinguo on 2017/9/12. + */ +public class GrantedAuthorityImpl implements GrantedAuthority { + + private String authority; + + public GrantedAuthorityImpl(String authority) { + this.authority = authority; + } + + public void setAuthority(String authority) { + this.authority = authority; + } + + @Override + public String getAuthority() { + return this.authority; + } +} diff --git a/src/main/java/org/micai/platform/auth/service/impl/PermissionServiceImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/PermissionServiceImpl.java similarity index 78% rename from src/main/java/org/micai/platform/auth/service/impl/PermissionServiceImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/PermissionServiceImpl.java index b5aa464..d948a3a 100644 --- a/src/main/java/org/micai/platform/auth/service/impl/PermissionServiceImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/PermissionServiceImpl.java @@ -1,23 +1,23 @@ -package org.micai.platform.auth.service.impl; +package org.micai.platform.resourcesserver.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.bo.PermissionDelBo; -import org.micai.platform.auth.bo.PermissionFindBo; -import org.micai.platform.auth.bo.PermissionSaveBo; -import org.micai.platform.auth.bo.PermissionUpdateBo; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.entity.Permission; -import org.micai.platform.auth.mapper.PermissionMapper; -import org.micai.platform.auth.service.PermissionService; -import org.micai.platform.auth.utils.AuthenticationManger; -import org.micai.platform.auth.vo.RoleListVo; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.bo.PermissionDelBo; +import org.micai.platform.resourcesserver.bo.PermissionFindBo; +import org.micai.platform.resourcesserver.bo.PermissionSaveBo; +import org.micai.platform.resourcesserver.bo.PermissionUpdateBo; +import org.micai.platform.resourcesserver.dto.UserAuthenticationDto; +import org.micai.platform.resourcesserver.entity.Permission; +import org.micai.platform.resourcesserver.mapper.PermissionMapper; +import org.micai.platform.resourcesserver.service.PermissionService; +import org.micai.platform.resourcesserver.utils.AuthenticationManger; +import org.micai.platform.resourcesserver.vo.RoleListVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/org/micai/platform/auth/service/impl/RolePermissionServiceImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/RolePermissionServiceImpl.java similarity index 77% rename from src/main/java/org/micai/platform/auth/service/impl/RolePermissionServiceImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/RolePermissionServiceImpl.java index 9e36ca8..bb91cd9 100644 --- a/src/main/java/org/micai/platform/auth/service/impl/RolePermissionServiceImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/RolePermissionServiceImpl.java @@ -1,19 +1,19 @@ -package org.micai.platform.auth.service.impl; +package org.micai.platform.resourcesserver.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.bo.RolePermissionDelBo; -import org.micai.platform.auth.bo.RolePermissionSaveBo; -import org.micai.platform.auth.bo.RolePermissionUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.entity.RolePermission; -import org.micai.platform.auth.mapper.RolePermissionMapper; -import org.micai.platform.auth.service.RolePermissionService; -import org.micai.platform.auth.utils.AuthenticationManger; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.bo.RolePermissionDelBo; +import org.micai.platform.resourcesserver.bo.RolePermissionSaveBo; +import org.micai.platform.resourcesserver.bo.RolePermissionUpdateBo; +import org.micai.platform.resourcesserver.dto.UserAuthenticationDto; +import org.micai.platform.resourcesserver.entity.RolePermission; +import org.micai.platform.resourcesserver.mapper.RolePermissionMapper; +import org.micai.platform.resourcesserver.service.RolePermissionService; +import org.micai.platform.resourcesserver.utils.AuthenticationManger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/org/micai/platform/auth/service/impl/RoleServiceImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/RoleServiceImpl.java similarity index 78% rename from src/main/java/org/micai/platform/auth/service/impl/RoleServiceImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/RoleServiceImpl.java index 4f7d412..4388d94 100644 --- a/src/main/java/org/micai/platform/auth/service/impl/RoleServiceImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/RoleServiceImpl.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.service.impl; +package org.micai.platform.resourcesserver.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; @@ -6,19 +6,19 @@ import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.bo.RoleDelBo; -import org.micai.platform.auth.bo.RoleFindBo; -import org.micai.platform.auth.bo.RoleSaveBo; -import org.micai.platform.auth.bo.RoleUpdateBo; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.entity.Role; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.mapper.RoleMapper; -import org.micai.platform.auth.service.RoleService; -import org.micai.platform.auth.utils.AuthenticationManger; -import org.micai.platform.auth.vo.UserListVo; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.bo.RoleDelBo; +import org.micai.platform.resourcesserver.bo.RoleFindBo; +import org.micai.platform.resourcesserver.bo.RoleSaveBo; +import org.micai.platform.resourcesserver.bo.RoleUpdateBo; +import org.micai.platform.resourcesserver.dto.UserAuthenticationDto; +import org.micai.platform.resourcesserver.entity.Role; +import org.micai.platform.resourcesserver.mapper.RoleMapper; +import org.micai.platform.resourcesserver.service.RoleService; +import org.micai.platform.resourcesserver.utils.AuthenticationManger; +import org.micai.platform.resourcesserver.vo.UserListVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserDetailsServiceImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserDetailsServiceImpl.java new file mode 100644 index 0000000..cc9659a --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserDetailsServiceImpl.java @@ -0,0 +1,76 @@ +package org.micai.platform.resourcesserver.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.MyAuthException; +import org.micai.platform.resourcesserver.entity.*; +import org.micai.platform.resourcesserver.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author liuCong + * @Date 2022/11/24 下午 1:36 + * @ClassName UserDetailsServiceImpl + * @Description + */ +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private UserService userService; + + @Autowired + private UserRoleService userRoleService; + + @Autowired + private RoleService roleService; + + @Autowired + private RolePermissionService rolePermissionService; + + @Autowired + private PermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userService.getOne(new LambdaQueryWrapper().eq(User::getUsername,username)); + if (user == null){ + throw new UsernameNotFoundException("未找到该用户"); + } + //获取用户权限 + List userRoleList = userRoleService.list(new QueryWrapper().lambda().eq(UserRole::getUserId,user.getId())); + if (ObjectUtil.isEmpty(userRoleList)){ + throw new MyAuthException(ConstantEnum.NO_ROLE); + } + List roleIdList = userRoleList.stream().map(UserRole::getRoleId).collect(Collectors.toList()); + List roleList = roleService.list(new QueryWrapper().lambda() + .in(Role::getId,roleIdList).eq(Role::getStatus, ConstantCode.STR_Z_ONE)); + if (ObjectUtil.isEmpty(roleList)){ + throw new MyAuthException(ConstantEnum.NO_ROLE); + } + List rolePermissionList = rolePermissionService.list(new QueryWrapper().lambda() + .in(RolePermission::getRoleId,roleIdList)); + if (ObjectUtil.isEmpty(rolePermissionList)){ + throw new MyAuthException(ConstantEnum.NO_PERMISSION); + } + List permissionIdList = rolePermissionList.stream().map(RolePermission::getPermissionId).collect(Collectors.toList()); + List permissionList = permissionService.list(new QueryWrapper().lambda() + .in(Permission::getId,permissionIdList).eq(Permission::getStatus,ConstantCode.STR_Z_ONE)); + if (ObjectUtil.isEmpty(permissionList)){ + throw new MyAuthException(ConstantEnum.NO_PERMISSION); + } + + String collect = permissionList.stream().map(Permission::getPermissionCode).collect(Collectors.joining(",")); + return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), AuthorityUtils.createAuthorityList(collect)); + } + +} diff --git a/src/main/java/org/micai/platform/auth/service/impl/UserRoleServiceImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserRoleServiceImpl.java similarity index 76% rename from src/main/java/org/micai/platform/auth/service/impl/UserRoleServiceImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserRoleServiceImpl.java index c9d7a45..4fdfa8e 100644 --- a/src/main/java/org/micai/platform/auth/service/impl/UserRoleServiceImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserRoleServiceImpl.java @@ -1,19 +1,19 @@ -package org.micai.platform.auth.service.impl; +package org.micai.platform.resourcesserver.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.bo.UserRoleDelBo; -import org.micai.platform.auth.bo.UserRoleSaveBo; -import org.micai.platform.auth.bo.UserRoleUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.entity.UserRole; -import org.micai.platform.auth.mapper.UserRoleMapper; -import org.micai.platform.auth.service.UserRoleService; -import org.micai.platform.auth.utils.AuthenticationManger; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.bo.UserRoleDelBo; +import org.micai.platform.resourcesserver.bo.UserRoleSaveBo; +import org.micai.platform.resourcesserver.bo.UserRoleUpdateBo; +import org.micai.platform.resourcesserver.dto.UserAuthenticationDto; +import org.micai.platform.resourcesserver.entity.UserRole; +import org.micai.platform.resourcesserver.mapper.UserRoleMapper; +import org.micai.platform.resourcesserver.service.UserRoleService; +import org.micai.platform.resourcesserver.utils.AuthenticationManger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/org/micai/platform/auth/service/impl/UserServiceImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserServiceImpl.java similarity index 83% rename from src/main/java/org/micai/platform/auth/service/impl/UserServiceImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserServiceImpl.java index a81eed7..6f67536 100644 --- a/src/main/java/org/micai/platform/auth/service/impl/UserServiceImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/service/impl/UserServiceImpl.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.service.impl; +package org.micai.platform.resourcesserver.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; @@ -7,19 +7,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.bo.UserDelBo; -import org.micai.platform.auth.bo.UserFindBo; -import org.micai.platform.auth.bo.UserSaveBo; -import org.micai.platform.auth.bo.UserUpdateBo; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.entity.User; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.mapper.UserMapper; -import org.micai.platform.auth.service.UserService; -import org.micai.platform.auth.utils.AuthenticationManger; -import org.micai.platform.auth.vo.UserListVo; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.bo.UserDelBo; +import org.micai.platform.resourcesserver.bo.UserFindBo; +import org.micai.platform.resourcesserver.bo.UserSaveBo; +import org.micai.platform.resourcesserver.bo.UserUpdateBo; +import org.micai.platform.resourcesserver.dto.UserAuthenticationDto; +import org.micai.platform.resourcesserver.entity.User; +import org.micai.platform.resourcesserver.mapper.UserMapper; +import org.micai.platform.resourcesserver.service.UserService; +import org.micai.platform.resourcesserver.utils.AuthenticationManger; +import org.micai.platform.resourcesserver.vo.UserListVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; diff --git a/src/main/java/org/micai/platform/auth/base/storage/Storage.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/Storage.java similarity index 95% rename from src/main/java/org/micai/platform/auth/base/storage/Storage.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/Storage.java index f794eab..060537e 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/Storage.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/Storage.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.base.storage; +package org.micai.platform.resourcesserver.storage; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/org/micai/platform/auth/base/storage/StorageFactory.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/StorageFactory.java similarity index 82% rename from src/main/java/org/micai/platform/auth/base/storage/StorageFactory.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/StorageFactory.java index ac8e0d1..b39278a 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/StorageFactory.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/StorageFactory.java @@ -1,13 +1,14 @@ -package org.micai.platform.auth.base.storage; +package org.micai.platform.resourcesserver.storage; import org.apache.commons.lang3.StringUtils; -import org.micai.platform.auth.base.storage.impl.NativeStorageImpl; -import org.micai.platform.auth.base.storage.impl.OssStorageImpl; -import org.micai.platform.auth.config.SiteOptions; +import org.micai.platform.resourcesserver.config.SiteOptions; +import org.micai.platform.resourcesserver.storage.impl.NativeStorageImpl; +import org.micai.platform.resourcesserver.storage.impl.OssStorageImpl; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; + import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/org/micai/platform/auth/base/storage/impl/AbstractStorage.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/AbstractStorage.java similarity index 82% rename from src/main/java/org/micai/platform/auth/base/storage/impl/AbstractStorage.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/AbstractStorage.java index fec60bb..21718bf 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/impl/AbstractStorage.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/AbstractStorage.java @@ -1,14 +1,14 @@ -package org.micai.platform.auth.base.storage.impl; +package org.micai.platform.resourcesserver.storage.impl; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.storage.Storage; -import org.micai.platform.auth.config.SiteOptions; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.utils.FileKit; -import org.micai.platform.auth.utils.FilePathUtils; -import org.micai.platform.auth.utils.ImageUtils; -import org.micai.platform.auth.utils.MD5; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.config.SiteOptions; +import org.micai.platform.resourcesserver.storage.Storage; +import org.micai.platform.resourcesserver.utils.FileKit; +import org.micai.platform.resourcesserver.utils.FilePathUtils; +import org.micai.platform.resourcesserver.utils.ImageUtils; +import org.micai.platform.resourcesserver.utils.MD5; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/org/micai/platform/auth/base/storage/impl/MinioStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/MinioStorageImpl.java similarity index 78% rename from src/main/java/org/micai/platform/auth/base/storage/impl/MinioStorageImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/MinioStorageImpl.java index c167acf..475e8a6 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/impl/MinioStorageImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/MinioStorageImpl.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.base.storage.impl; +package org.micai.platform.resourcesserver.storage.impl; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.storage.Storage; +import org.micai.platform.resourcesserver.storage.Storage; import org.springframework.stereotype.Component; /** diff --git a/src/main/java/org/micai/platform/auth/base/storage/impl/NativeStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/NativeStorageImpl.java similarity index 83% rename from src/main/java/org/micai/platform/auth/base/storage/impl/NativeStorageImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/NativeStorageImpl.java index 69399bc..22add12 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/impl/NativeStorageImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/NativeStorageImpl.java @@ -1,8 +1,8 @@ -package org.micai.platform.auth.base.storage.impl; +package org.micai.platform.resourcesserver.storage.impl; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.storage.Storage; -import org.micai.platform.auth.utils.FileKit; +import org.micai.platform.resourcesserver.storage.Storage; +import org.micai.platform.resourcesserver.utils.FileKit; import org.springframework.stereotype.Component; import java.io.File; diff --git a/src/main/java/org/micai/platform/auth/base/storage/impl/OssStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/OssStorageImpl.java similarity index 89% rename from src/main/java/org/micai/platform/auth/base/storage/impl/OssStorageImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/OssStorageImpl.java index b1a02bf..93b0ce2 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/impl/OssStorageImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/OssStorageImpl.java @@ -1,14 +1,15 @@ -package org.micai.platform.auth.base.storage.impl; +package org.micai.platform.resourcesserver.storage.impl; import com.aliyun.oss.OSSClient; import com.upyun.UpYunUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.micai.platform.auth.base.storage.Storage; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.utils.FileKit; +import org.micai.platform.common.base.constant.ConstantEnum; +import org.micai.platform.common.base.exception.PlatformException; +import org.micai.platform.resourcesserver.storage.Storage; +import org.micai.platform.resourcesserver.utils.FileKit; import org.springframework.stereotype.Component; + import java.io.ByteArrayInputStream; /** diff --git a/src/main/java/org/micai/platform/auth/base/storage/impl/QiniuStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/QiniuStorageImpl.java similarity index 78% rename from src/main/java/org/micai/platform/auth/base/storage/impl/QiniuStorageImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/QiniuStorageImpl.java index 4d44193..02005ed 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/impl/QiniuStorageImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/QiniuStorageImpl.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.base.storage.impl; +package org.micai.platform.resourcesserver.storage.impl; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.storage.Storage; +import org.micai.platform.resourcesserver.storage.Storage; import org.springframework.stereotype.Component; /** diff --git a/src/main/java/org/micai/platform/auth/base/storage/impl/UpYunStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/UpYunStorageImpl.java similarity index 70% rename from src/main/java/org/micai/platform/auth/base/storage/impl/UpYunStorageImpl.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/UpYunStorageImpl.java index a3895ca..5fb3ebe 100644 --- a/src/main/java/org/micai/platform/auth/base/storage/impl/UpYunStorageImpl.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/UpYunStorageImpl.java @@ -1,6 +1,7 @@ -package org.micai.platform.auth.base.storage.impl; +package org.micai.platform.resourcesserver.storage.impl; -import org.micai.platform.auth.base.storage.Storage; + +import org.micai.platform.resourcesserver.storage.Storage; public class UpYunStorageImpl extends AbstractStorage implements Storage { diff --git a/src/main/java/org/micai/platform/auth/utils/ApplicationUtil.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/ApplicationUtil.java similarity index 97% rename from src/main/java/org/micai/platform/auth/utils/ApplicationUtil.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/ApplicationUtil.java index 4d7d882..62d073b 100644 --- a/src/main/java/org/micai/platform/auth/utils/ApplicationUtil.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/ApplicationUtil.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; diff --git a/src/main/java/org/micai/platform/auth/utils/AuthenticationManger.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/AuthenticationManger.java similarity index 90% rename from src/main/java/org/micai/platform/auth/utils/AuthenticationManger.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/AuthenticationManger.java index 89e180f..89555c9 100644 --- a/src/main/java/org/micai/platform/auth/utils/AuthenticationManger.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/AuthenticationManger.java @@ -1,8 +1,8 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.constant.ConstantCode; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.resourcesserver.dto.UserAuthenticationDto; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/src/main/java/org/micai/platform/auth/utils/FileKit.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FileKit.java similarity index 96% rename from src/main/java/org/micai/platform/auth/utils/FileKit.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FileKit.java index 0b7b03c..25115b7 100644 --- a/src/main/java/org/micai/platform/auth/utils/FileKit.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FileKit.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import com.sun.istack.internal.NotNull; import org.apache.commons.io.FileUtils; diff --git a/src/main/java/org/micai/platform/auth/utils/FilePathUtils.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FilePathUtils.java similarity index 97% rename from src/main/java/org/micai/platform/auth/utils/FilePathUtils.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FilePathUtils.java index 5c49ce5..054ecea 100644 --- a/src/main/java/org/micai/platform/auth/utils/FilePathUtils.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FilePathUtils.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import org.apache.commons.text.RandomStringGenerator; diff --git a/src/main/java/org/micai/platform/auth/utils/ImageUtils.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/ImageUtils.java similarity index 99% rename from src/main/java/org/micai/platform/auth/utils/ImageUtils.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/ImageUtils.java index 0b14bcb..8c7edd2 100644 --- a/src/main/java/org/micai/platform/auth/utils/ImageUtils.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/ImageUtils.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import lombok.extern.slf4j.Slf4j; import net.coobird.thumbnailator.Thumbnails; diff --git a/src/main/java/org/micai/platform/auth/utils/JwtHelper.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/JwtHelper.java similarity index 98% rename from src/main/java/org/micai/platform/auth/utils/JwtHelper.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/JwtHelper.java index 0e05aec..a0fd9c0 100644 --- a/src/main/java/org/micai/platform/auth/utils/JwtHelper.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/JwtHelper.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; diff --git a/src/main/java/org/micai/platform/auth/utils/MD5.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/MD5.java similarity index 90% rename from src/main/java/org/micai/platform/auth/utils/MD5.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/MD5.java index 5a3ecc8..92b172b 100644 --- a/src/main/java/org/micai/platform/auth/utils/MD5.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/MD5.java @@ -1,7 +1,7 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import org.apache.commons.lang3.StringUtils; -import org.micai.platform.auth.base.exception.PlatformException; +import org.micai.platform.common.base.exception.PlatformException; import java.math.BigInteger; import java.security.MessageDigest; diff --git a/src/main/java/org/micai/platform/auth/utils/PdfMergeUtils.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/PdfMergeUtils.java similarity index 98% rename from src/main/java/org/micai/platform/auth/utils/PdfMergeUtils.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/PdfMergeUtils.java index 343c658..d1c60c0 100644 --- a/src/main/java/org/micai/platform/auth/utils/PdfMergeUtils.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/PdfMergeUtils.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfContentByte; diff --git a/src/main/java/org/micai/platform/auth/utils/WatermarkOffice.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkOffice.java similarity index 99% rename from src/main/java/org/micai/platform/auth/utils/WatermarkOffice.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkOffice.java index 36bb9f2..43dad6f 100644 --- a/src/main/java/org/micai/platform/auth/utils/WatermarkOffice.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkOffice.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/src/main/java/org/micai/platform/auth/utils/WatermarkPdf.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkPdf.java similarity index 97% rename from src/main/java/org/micai/platform/auth/utils/WatermarkPdf.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkPdf.java index 0085e1b..9e6207d 100644 --- a/src/main/java/org/micai/platform/auth/utils/WatermarkPdf.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkPdf.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; import java.io.FileOutputStream; import java.io.IOException; diff --git a/src/main/java/org/micai/platform/auth/utils/WatermarkUtils.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkUtils.java similarity index 96% rename from src/main/java/org/micai/platform/auth/utils/WatermarkUtils.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkUtils.java index 87fd700..b0a8699 100644 --- a/src/main/java/org/micai/platform/auth/utils/WatermarkUtils.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkUtils.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.utils; +package org.micai.platform.resourcesserver.utils; /** * @ClassName WatermarkUtils diff --git a/src/main/java/org/micai/platform/auth/vo/OrganListVo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/OrganListVo.java similarity index 95% rename from src/main/java/org/micai/platform/auth/vo/OrganListVo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/OrganListVo.java index c799fe9..e3fc46c 100644 --- a/src/main/java/org/micai/platform/auth/vo/OrganListVo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/OrganListVo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.vo; +package org.micai.platform.resourcesserver.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/vo/PermissionListVo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/PermissionListVo.java similarity index 95% rename from src/main/java/org/micai/platform/auth/vo/PermissionListVo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/PermissionListVo.java index 282c771..9e5fd09 100644 --- a/src/main/java/org/micai/platform/auth/vo/PermissionListVo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/PermissionListVo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.vo; +package org.micai.platform.resourcesserver.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/vo/RoleListVo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/RoleListVo.java similarity index 95% rename from src/main/java/org/micai/platform/auth/vo/RoleListVo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/RoleListVo.java index d0d1d36..0dcb67d 100644 --- a/src/main/java/org/micai/platform/auth/vo/RoleListVo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/RoleListVo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.vo; +package org.micai.platform.resourcesserver.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/org/micai/platform/auth/vo/UserListVo.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/UserListVo.java similarity index 95% rename from src/main/java/org/micai/platform/auth/vo/UserListVo.java rename to platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/UserListVo.java index d4796ec..ad824c3 100644 --- a/src/main/java/org/micai/platform/auth/vo/UserListVo.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/vo/UserListVo.java @@ -1,4 +1,4 @@ -package org.micai.platform.auth.vo; +package org.micai.platform.resourcesserver.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/platform-resources-server/src/main/resources/application-dev.yml b/platform-resources-server/src/main/resources/application-dev.yml new file mode 100644 index 0000000..c4ec76e --- /dev/null +++ b/platform-resources-server/src/main/resources/application-dev.yml @@ -0,0 +1,22 @@ +#dev 开发环境 +#服务 +server: + port: 8081 +#spring +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/security?prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true + username: root + password: ly1218 + +#jwt相关配置 +jwt: + #sign key + sign: + key: spring-security-@Jwt!&Secret^# + #jwt 过期时间 + expiration: + time: 15 + +resource-ids: user diff --git a/platform-resources-server/src/main/resources/application-pro.yml b/platform-resources-server/src/main/resources/application-pro.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/application.yml b/platform-resources-server/src/main/resources/application.yml similarity index 100% rename from src/main/resources/application.yml rename to platform-resources-server/src/main/resources/application.yml diff --git a/platform-resources-server/src/main/resources/logback-spring.xml b/platform-resources-server/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..4a1d217 --- /dev/null +++ b/platform-resources-server/src/main/resources/logback-spring.xml @@ -0,0 +1,51 @@ + + + + + + + + logback + + + + + + + + + + + + + + + trace + + + ${PATTERN_COLOR} + + UTF-8 + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index 20e3007..18fe870 100644 --- a/pom.xml +++ b/pom.xml @@ -11,14 +11,19 @@ org.micai.platform micai-platform-auth 0.0.1-SNAPSHOT - micai-platform-auth + pom + micai-platform-auth Micai platform project for Spring Boot - + + platform-auth-server + platform-resources-server + platform-common + + 1.8 5.1.30 0.7.0 1.2.78 - 5.7.16 2.7.0 1.3.2 1.3 @@ -31,10 +36,11 @@ 3.4.3.4 1.9.2 3.4.0 - 3.4.0 3.16 3.16 2.0 + 1.7.30 + 2.2.6.RELEASE @@ -81,12 +87,6 @@ fastjson ${fastjson.version} - - - cn.hutool - hutool-all - ${hutool.version} - io.springfox @@ -103,11 +103,6 @@ mybatis-plus-generator ${mybatis-plus-generator.version} - - com.baomidou - mybatis-plus - ${mybatis-plus.version} - org.apache.velocity velocity-engine-core @@ -181,6 +176,17 @@ spring-boot-devtools true + + + org.springframework.security.oauth.boot + spring-security-oauth2-autoconfigure + ${oauth2.version} + + + org.slf4j + slf4j-api + ${slf4j-api.version} + diff --git a/src/main/java/org/micai/platform/auth/config/ThreadConfig.java b/src/main/java/org/micai/platform/auth/config/ThreadConfig.java deleted file mode 100644 index 5135f45..0000000 --- a/src/main/java/org/micai/platform/auth/config/ThreadConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.micai.platform.auth.config; - -import org.micai.platform.auth.utils.ApplicationUtil; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -/** - * @FileName: ThreadConfig - * @Author: zhaoxinguo - * @Date: 2019/3/20 18:24 - * @Description: 线程池配置 - */ -@Configuration -public class ThreadConfig { - - @Bean - public ThreadPoolTaskExecutor taskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(20); - executor.setMaxPoolSize(100); - executor.setKeepAliveSeconds(30000); - executor.setQueueCapacity(100); - executor.setThreadNamePrefix("default_task_executor_thread"); - executor.initialize(); - return executor; - } - - @Bean - public BCryptPasswordEncoder bCryptPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public ApplicationUtil applicationUtil() { - return new ApplicationUtil(); - } - -} diff --git a/src/main/java/org/micai/platform/auth/controller/ImageCodeController.java b/src/main/java/org/micai/platform/auth/controller/ImageCodeController.java deleted file mode 100644 index 64bbe2b..0000000 --- a/src/main/java/org/micai/platform/auth/controller/ImageCodeController.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.micai.platform.auth.controller; - -import cn.hutool.captcha.CaptchaUtil; -import cn.hutool.captcha.LineCaptcha; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.constant.ConstantCode; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * @Author liuCong - * @Date 2022/1/4 10:53 - * @ClassName ImageCodeController - * @Description - */ -@Controller -@Api(tags = "图形验证码", value = "图形验证码") -@RequestMapping("/image") -@Slf4j -public class ImageCodeController extends BaseController { - - - @GetMapping("/code") - @ApiOperation(value = "获取图形验证码", notes = "获取图形验证码") - public void getImage(HttpServletRequest request, HttpServletResponse response) { - try { - LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(ConstantCode.INT_TWO_HUNDRED, ConstantCode.INT_ONE_HUNDRED); - String code = lineCaptcha.getCode(); - log.info("code info:{}", code); - request.getSession().setAttribute(ConstantCode.SESSION_KEY, code); - ServletOutputStream outputStream = response.getOutputStream(); - lineCaptcha.write(outputStream); - outputStream.flush(); - outputStream.close(); - } catch (Exception e) { - log.error("error info:", e); - } - } - -} diff --git a/src/main/java/org/micai/platform/auth/controller/JwtExceptionController.java b/src/main/java/org/micai/platform/auth/controller/JwtExceptionController.java deleted file mode 100644 index 7777f5e..0000000 --- a/src/main/java/org/micai/platform/auth/controller/JwtExceptionController.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.micai.platform.auth.controller; - -import io.jsonwebtoken.ExpiredJwtException; -import io.jsonwebtoken.MalformedJwtException; -import io.jsonwebtoken.SignatureException; -import io.jsonwebtoken.UnsupportedJwtException; -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.constant.ConstantEnum; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; - -import javax.servlet.http.HttpServletRequest; - -/** - * @ClassName JwtExceptionController - * @Description Jwt异常处理类 - * @Author zhaoxinguo - * @Date 2021/11/26 15:58 - * @Version 1.0 - */ -@RestController -@ApiIgnore -@Slf4j -public class JwtExceptionController { - - @RequestMapping("/expiredJwtException") - public Result expiredJwtException(HttpServletRequest request) { - if (request.getAttribute("expiredJwtException") instanceof ExpiredJwtException) { - return new Result(ConstantEnum.EXPIRED_JWT); - } - return null; - } - - @RequestMapping("/unsupportedJwtException") - public Result unsupportedJwtException(HttpServletRequest request) { - if (request.getAttribute("unsupportedJwtException") instanceof UnsupportedJwtException) { - log.error("unsupportedJwtException"); - return new Result(ConstantEnum.TOKEN_ERROR); - } - return null; - } - - @RequestMapping("/signatureException") - public Result signatureException(HttpServletRequest request) { - if (request.getAttribute("signatureException") instanceof SignatureException) { - log.error("signatureException"); - return new Result(ConstantEnum.TOKEN_ERROR); - } - return null; - } - - @RequestMapping("/illegalArgumentException") - public Result illegalArgumentException(HttpServletRequest request) { - if (request.getAttribute("illegalArgumentException") instanceof IllegalArgumentException) { - log.error("illegalArgumentException"); - return new Result(ConstantEnum.TOKEN_ERROR); - } - return null; - } - - - @RequestMapping("/malformedJwtException") - public Result malformedJwtException(HttpServletRequest request) { - if (request.getAttribute("malformedJwtException") instanceof MalformedJwtException) { - log.error("malformedJwtException"); - return new Result(ConstantEnum.TOKEN_ERROR); - } - return null; - } - -} diff --git a/src/main/java/org/micai/platform/auth/controller/OrganInfoController.java b/src/main/java/org/micai/platform/auth/controller/OrganInfoController.java deleted file mode 100644 index 1a1cd03..0000000 --- a/src/main/java/org/micai/platform/auth/controller/OrganInfoController.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.micai.platform.auth.controller; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.bo.*; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.service.OrganInfoService; -import org.micai.platform.auth.vo.OrganListVo; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -/** - *

- * 前端控制器 - *

- * - * @author liucong - * @since 2021-12-06 - */ -@RestController -@RequestMapping("/organ") -@Api(tags = "组织管理", value = "组织管理") -@Slf4j -public class OrganInfoController { - - @Autowired - private OrganInfoService organInfoService; - - @ApiOperation(value = "获取组织列表", notes = "获取组织列表") - @PostMapping("/getOrganList") - @PreAuthorize("hasAnyAuthority('root')") - public Result getOrganList(@RequestBody OrganFindBo bo){ - Result result; - try { - Page page = organInfoService.getOrganList(bo); - result = new Result(ConstantEnum.SUCCESS,page); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - - @ApiOperation(value = "更新组织信息", notes = "更新组织信息") - @PostMapping("/updateOrgan") - @PreAuthorize("hasAnyAuthority('root')") - public Result updateOrgan(@RequestBody @Valid OrganUpdateBo bo){ - Result result; - try { - organInfoService.updateOrgan(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - @ApiOperation(value = "新增组织", notes = "新增组织") - @PostMapping("/saveOrgan") - @PreAuthorize("hasAnyAuthority('root')") - public Result saveOrgan(@RequestBody @Valid OrganSaveBo bo){ - Result result; - try { - organInfoService.saveOrgan(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - @ApiOperation(value = "删除组织", notes = "删除组织") - @PostMapping("/delOrgan") - @PreAuthorize("hasAnyAuthority('root')") - public Result delOrgan(@RequestBody @Valid OrganDelBo bo){ - Result result; - try { - organInfoService.delOrgan(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } -} - diff --git a/src/main/java/org/micai/platform/auth/controller/OrganUserController.java b/src/main/java/org/micai/platform/auth/controller/OrganUserController.java deleted file mode 100644 index b7afab9..0000000 --- a/src/main/java/org/micai/platform/auth/controller/OrganUserController.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.micai.platform.auth.controller; - - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 前端控制器 - *

- * - * @author liucong - * @since 2022-01-13 - */ -@RestController -@RequestMapping("/Tb/organUser") -public class OrganUserController { - -} - diff --git a/src/main/java/org/micai/platform/auth/controller/PermissionMenuController.java b/src/main/java/org/micai/platform/auth/controller/PermissionMenuController.java deleted file mode 100644 index 17a8707..0000000 --- a/src/main/java/org/micai/platform/auth/controller/PermissionMenuController.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.micai.platform.auth.controller; - - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.bo.*; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.service.PermissionMenuService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - *

- * 前端控制器 - *

- * - * @author liucong - * @since 2022-01-13 - */ -@RestController -@RequestMapping("/permissionMenu") -@Slf4j -@Api(tags = "权限菜单管理", value = "权限菜单管理") -public class PermissionMenuController extends BaseController{ - @Autowired - private PermissionMenuService permissionMenuService; - - - @ApiOperation(value = "更新角色菜单权限", notes = "更新角色菜单权限") - @PostMapping("/update") - @PreAuthorize("hasAnyAuthority('sys:permissionMenu:update')") - public Result updatePM(@RequestBody @Valid PermissionMenuUpdateBo bo){ - Result result; - try { - permissionMenuService.updatePM(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - @ApiOperation(value = "新增角色菜单权限", notes = "新增角色菜单权限") - @PostMapping("/save") - @PreAuthorize("hasAnyAuthority('sys:permissionMenu:save')") - public Result savePM(@RequestBody @Valid PermissionMenuSaveBo bo){ - Result result; - try { - permissionMenuService.savePM(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - @ApiOperation(value = "删除角色菜单权限", notes = "删除角色菜单权限") - @DeleteMapping("/del") - @PreAuthorize("hasAnyAuthority('sys:permissionMenu:del')") - public Result delPM(@RequestBody @Valid PermissionMenuDelBo bo){ - Result result; - try { - permissionMenuService.delPM(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } -} - diff --git a/src/main/java/org/micai/platform/auth/controller/SysDictController.java b/src/main/java/org/micai/platform/auth/controller/SysDictController.java deleted file mode 100644 index ef77b8a..0000000 --- a/src/main/java/org/micai/platform/auth/controller/SysDictController.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.micai.platform.auth.controller; - - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 前端控制器 - *

- * - * @author liucong - * @since 2021-12-06 - */ -@RestController -@RequestMapping("/Tb/sysDict") -public class SysDictController { - -} - diff --git a/src/main/java/org/micai/platform/auth/controller/SysMenuController.java b/src/main/java/org/micai/platform/auth/controller/SysMenuController.java deleted file mode 100644 index d593be8..0000000 --- a/src/main/java/org/micai/platform/auth/controller/SysMenuController.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.micai.platform.auth.controller; - - -import cn.hutool.core.lang.tree.Tree; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.bo.MenuDelBo; -import org.micai.platform.auth.bo.MenuSaveBo; -import org.micai.platform.auth.bo.MenuUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.service.SysMenuService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - *

- * 前端控制器 - *

- * - * @author liucong - * @since 2021-12-06 - */ -@RestController -@RequestMapping("/sysMenu") -@Api(tags = "菜单管理", value = "菜单管理") -@Slf4j -public class SysMenuController extends BaseController{ - - @Autowired - private SysMenuService sysMenuService; - - - @PostMapping("/list") - @PreAuthorize("hasAnyAuthority('sys:sysMenu:list')") - @ApiOperation(value = "查询菜单", notes = "登录后查询菜单列表") - public Result find() { - Result result; - try { - List> treeList = sysMenuService.find(); - result = new Result(ConstantEnum.SUCCESS,treeList); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - - @ApiOperation(value = "更新菜单", notes = "更新菜单") - @PostMapping("/update") - @PreAuthorize("hasAnyAuthority('sys:sysMenu:update')") - public Result updateMenu(@RequestBody @Valid MenuUpdateBo bo){ - Result result; - try { - sysMenuService.updateMenu(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - @ApiOperation(value = "新增菜单", notes = "新增菜单") - @PostMapping("/save") - @PreAuthorize("hasAnyAuthority('sys:sysMenu:save')") - public Result saveMenu(@RequestBody @Valid MenuSaveBo bo){ - Result result; - try { - sysMenuService.saveMenu(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } - - @ApiOperation(value = "删除菜单", notes = "删除菜单") - @DeleteMapping("/del") - @PreAuthorize("hasAnyAuthority('sys:sysMenu:del')") - public Result delMenu(@RequestBody @Valid MenuDelBo bo){ - Result result; - try { - sysMenuService.delMenu(bo); - result = new Result(ConstantEnum.SUCCESS); - } catch (PlatformException e) { - log.error("error info:",e); - result = new Result(e.getErrorCode(), e.getErrorMessage()); - } catch (Exception e) { - log.error("error info:",e); - result = new Result(ConstantEnum.FAIL); - } - return result; - } -} - diff --git a/src/main/java/org/micai/platform/auth/controller/SysRegionController.java b/src/main/java/org/micai/platform/auth/controller/SysRegionController.java deleted file mode 100644 index 75bc2ab..0000000 --- a/src/main/java/org/micai/platform/auth/controller/SysRegionController.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.micai.platform.auth.controller; - - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.base.result.Result; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.entity.SysRegion; -import org.micai.platform.auth.entity.User; -import org.micai.platform.auth.service.SysRegionService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 区域管理控制层 - * @author yangtao - * @since 2021-12-31 - */ -@Slf4j -@Api(tags = "区域管理", value = "区域管理") -@RestController -@RequestMapping("/sysRegion") -public class SysRegionController { - - @Autowired - private SysRegionService sysRegionService; - - @ApiOperation(value = "根据区域用户名查询",notes = "根据区域用户名查询") - @PostMapping("/findByRegionName") - public Result findByRegionName(@RequestBody SysRegion sysRegion) throws Exception { - SysRegion sysRegion1 = sysRegionService.findByRegionName(sysRegion.getRegionName()); - return new Result(ConstantEnum.SUCCESS); - } - - - @ApiOperation(value = "获取区域列表",notes = "获取区域列表") - @GetMapping("/sysRegionList") - public Map sysRegionList() throws Exception{ - List sysRegions = sysRegionService.findSysRegionList(); - Map map = new HashMap(); - map.put("sysRegions",sysRegions); - return map; - } - - - - - -} - diff --git a/src/main/java/org/micai/platform/auth/entity/OrganInfo.java b/src/main/java/org/micai/platform/auth/entity/OrganInfo.java deleted file mode 100644 index 9064c21..0000000 --- a/src/main/java/org/micai/platform/auth/entity/OrganInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.micai.platform.auth.entity; - -import com.baomidou.mybatisplus.annotation.*; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - *

- * - *

- * - * @author liucong - * @since 2021-12-06 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(value="OrganInfo对象", description="") -public class OrganInfo implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty(value = "主键id") - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - @ApiModelProperty(value = "机构编码") - private String code; - - @ApiModelProperty(value = "机构名称") - private String name; - - @ApiModelProperty(value = "机构类型") - private String type; - - @ApiModelProperty(value = "创建人") - private Long createUserId; - - @ApiModelProperty(value = "创建时间") - @TableField(fill = FieldFill.INSERT) - private Date createTime; - - @ApiModelProperty(value = "修改人") - private Long updateUserId; - - @ApiModelProperty(value = "修改时间") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Date updateTime; - - @ApiModelProperty(value = "状态 默认01 启用") - private String status; - - @ApiModelProperty(value = "版本号") - @Version - private Long version; - - -} diff --git a/src/main/java/org/micai/platform/auth/entity/SysDict.java b/src/main/java/org/micai/platform/auth/entity/SysDict.java deleted file mode 100644 index 59dc14b..0000000 --- a/src/main/java/org/micai/platform/auth/entity/SysDict.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.micai.platform.auth.entity; - -import com.baomidou.mybatisplus.annotation.*; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - *

- * - *

- * - * @author liucong - * @since 2021-12-10 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(value="SysDict对象", description="") -public class SysDict implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty(value = "主键id") - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - @ApiModelProperty(value = "字段名称") - private String dictName; - - @ApiModelProperty(value = "字段编码") - private String dictCode; - - @ApiModelProperty(value = "创建人id") - private Long createUserId; - - @ApiModelProperty(value = "创建时间") - @TableField(fill = FieldFill.INSERT) - private Date createTime; - - @ApiModelProperty(value = "修改人id") - private Long updateUserId; - - @ApiModelProperty(value = "修改时间") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Date updateTime; - - @ApiModelProperty(value = "状态: 01 启用 02停用") - private String status; - - @ApiModelProperty(value = "版本号") - @Version - private Long version; - - -} diff --git a/src/main/java/org/micai/platform/auth/entity/SysMenu.java b/src/main/java/org/micai/platform/auth/entity/SysMenu.java deleted file mode 100644 index 21698c7..0000000 --- a/src/main/java/org/micai/platform/auth/entity/SysMenu.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.micai.platform.auth.entity; - -import com.baomidou.mybatisplus.annotation.*; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - *

- * - *

- * - * @author liucong - * @since 2021-12-06 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(value="SysMenu对象", description="") -public class SysMenu implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty(value = "主键id") - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - @ApiModelProperty(value = "菜单编码") - private String menuCode; - - @ApiModelProperty(value = "菜单名称") - private String menuName; - - @ApiModelProperty(value = "业务系统标识,区分不同业务系统菜单") - private String systemCode; - - @ApiModelProperty(value = "业务系统名称") - private String systemName; - - @ApiModelProperty(value = "终端类型,00:平台") - private String application; - - @ApiModelProperty(value = "父级菜单编码") - private String parentCode; - - @ApiModelProperty(value = "菜单图标") - private String menuIcon; - - @ApiModelProperty(value = "菜单访问路径") - private String url; - - @ApiModelProperty(value = "菜单打开类型,1:路由 2:新标签页 3:iframe") - private String openType; - - @ApiModelProperty(value = "序号") - private Integer sn; - - @ApiModelProperty(value = "创建时间") - @TableField(fill = FieldFill.INSERT) - private Date createTime; - - @ApiModelProperty(value = "创建人") - private Long createUserId; - - @ApiModelProperty(value = "修改人") - private Long updateUserId; - - @ApiModelProperty(value = "修改时间") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Date updateTime; - - @ApiModelProperty(value = "启用标识 01 启用") - private String status; - - @ApiModelProperty(value = "版本号") - @Version - private Long version; - - -} diff --git a/src/main/java/org/micai/platform/auth/entity/SysRegion.java b/src/main/java/org/micai/platform/auth/entity/SysRegion.java deleted file mode 100644 index f3f98e7..0000000 --- a/src/main/java/org/micai/platform/auth/entity/SysRegion.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.micai.platform.auth.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.Version; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - *

- * 区域地址表 - *

- * - * @author yangtao - * @since 2021-12-31 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(value="SysRegion对象", description="区域地址表") -public class SysRegion implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty(value = "区域主键编号") - @TableId(value = "region_id", type = IdType.AUTO) - private String regionId; - - @ApiModelProperty(value = "区域名称") - private String regionName; - - @ApiModelProperty(value = "区域缩写") - private String regionShortName; - - @ApiModelProperty(value = "行政区域编号") - private String regionCode; - - @ApiModelProperty(value = "区域父id") - private String regionParentId; - - @ApiModelProperty(value = "区域级别 1-省、自治区、直辖市 2-地级市、地区、自治州、盟 3-市辖区、县级市、县") - private Integer regionLevel; - - @ApiModelProperty(value = "创建人") - private Long createUserId; - - @ApiModelProperty(value = "创建时间") - private Date createTime; - - @ApiModelProperty(value = "修改人") - private Long updateUserId; - - @ApiModelProperty(value = "修改时间") - private Date updateTime; - - @ApiModelProperty(value = "版本号") - @Version - private Long version; - - -} diff --git a/src/main/java/org/micai/platform/auth/mapper/OrganInfoMapper.java b/src/main/java/org/micai/platform/auth/mapper/OrganInfoMapper.java deleted file mode 100644 index 1c8a58d..0000000 --- a/src/main/java/org/micai/platform/auth/mapper/OrganInfoMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.micai.platform.auth.mapper; - -import org.micai.platform.auth.entity.OrganInfo; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * Mapper 接口 - *

- * - * @author liucong - * @since 2021-12-06 - */ -public interface OrganInfoMapper extends BaseMapper { - -} diff --git a/src/main/java/org/micai/platform/auth/mapper/OrganUserMapper.java b/src/main/java/org/micai/platform/auth/mapper/OrganUserMapper.java deleted file mode 100644 index bc426d3..0000000 --- a/src/main/java/org/micai/platform/auth/mapper/OrganUserMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.micai.platform.auth.mapper; - -import org.micai.platform.auth.entity.OrganUser; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * Mapper 接口 - *

- * - * @author liucong - * @since 2021-12-06 - */ -public interface OrganUserMapper extends BaseMapper { - -} diff --git a/src/main/java/org/micai/platform/auth/mapper/PermissionMenuMapper.java b/src/main/java/org/micai/platform/auth/mapper/PermissionMenuMapper.java deleted file mode 100644 index 501110a..0000000 --- a/src/main/java/org/micai/platform/auth/mapper/PermissionMenuMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.micai.platform.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.micai.platform.auth.entity.PermissionMenu; - -/** - *

- * Mapper 接口 - *

- * - * @author liucong - * @since 2021-12-06 - */ -public interface PermissionMenuMapper extends BaseMapper { - -} diff --git a/src/main/java/org/micai/platform/auth/mapper/SysDictItemMapper.java b/src/main/java/org/micai/platform/auth/mapper/SysDictItemMapper.java deleted file mode 100644 index 78b16fd..0000000 --- a/src/main/java/org/micai/platform/auth/mapper/SysDictItemMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.micai.platform.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.micai.platform.auth.entity.SysDictItem; - -/** - *

- * Mapper 接口 - *

- * - * @author liucong - * @since 2021-12-10 - */ -public interface SysDictItemMapper extends BaseMapper { - -} diff --git a/src/main/java/org/micai/platform/auth/mapper/SysDictMapper.java b/src/main/java/org/micai/platform/auth/mapper/SysDictMapper.java deleted file mode 100644 index 26a634a..0000000 --- a/src/main/java/org/micai/platform/auth/mapper/SysDictMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.micai.platform.auth.mapper; - -import org.micai.platform.auth.entity.SysDict; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * Mapper 接口 - *

- * - * @author liucong - * @since 2021-12-06 - */ -public interface SysDictMapper extends BaseMapper { - -} diff --git a/src/main/java/org/micai/platform/auth/mapper/SysMenuMapper.java b/src/main/java/org/micai/platform/auth/mapper/SysMenuMapper.java deleted file mode 100644 index 7c90b05..0000000 --- a/src/main/java/org/micai/platform/auth/mapper/SysMenuMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.micai.platform.auth.mapper; - -import org.micai.platform.auth.entity.SysMenu; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * Mapper 接口 - *

- * - * @author liucong - * @since 2021-12-06 - */ -public interface SysMenuMapper extends BaseMapper { - -} diff --git a/src/main/java/org/micai/platform/auth/mapper/SysRegionMapper.java b/src/main/java/org/micai/platform/auth/mapper/SysRegionMapper.java deleted file mode 100644 index 91ce651..0000000 --- a/src/main/java/org/micai/platform/auth/mapper/SysRegionMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.micai.platform.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.micai.platform.auth.entity.SysRegion; - - -/** - *

- * 区域地址表 Mapper 接口 - *

- * - * @author yangtao - * @since 2021-12-31 - */ -public interface SysRegionMapper extends BaseMapper { - - SysRegion findByRegionName(String regionName); - -} diff --git a/src/main/java/org/micai/platform/auth/service/OrganInfoService.java b/src/main/java/org/micai/platform/auth/service/OrganInfoService.java deleted file mode 100644 index 5016f2f..0000000 --- a/src/main/java/org/micai/platform/auth/service/OrganInfoService.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.micai.platform.auth.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.micai.platform.auth.bo.OrganDelBo; -import org.micai.platform.auth.bo.OrganFindBo; -import org.micai.platform.auth.bo.OrganSaveBo; -import org.micai.platform.auth.bo.OrganUpdateBo; -import org.micai.platform.auth.entity.OrganInfo; -import com.baomidou.mybatisplus.extension.service.IService; -import org.micai.platform.auth.vo.OrganListVo; - -/** - *

- * 服务类 - *

- * - * @author liucong - * @since 2021-12-06 - */ -public interface OrganInfoService extends IService { - - Page getOrganList(OrganFindBo bo); - - void updateOrgan(OrganUpdateBo bo); - - void saveOrgan(OrganSaveBo bo); - - void delOrgan(OrganDelBo bo); -} diff --git a/src/main/java/org/micai/platform/auth/service/PermissionMenuService.java b/src/main/java/org/micai/platform/auth/service/PermissionMenuService.java deleted file mode 100644 index 68688ce..0000000 --- a/src/main/java/org/micai/platform/auth/service/PermissionMenuService.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.micai.platform.auth.service; - -import org.micai.platform.auth.bo.PermissionMenuDelBo; -import org.micai.platform.auth.bo.PermissionMenuSaveBo; -import org.micai.platform.auth.bo.PermissionMenuUpdateBo; - -/** - * @Author liuCong - * @Date 2022/1/13 16:54 - * @ClassName PermissionMenuService - * @Description - */ -public interface PermissionMenuService { - void updatePM(PermissionMenuUpdateBo bo) throws Exception; - - void savePM(PermissionMenuSaveBo bo) throws Exception; - - void delPM(PermissionMenuDelBo bo) throws Exception; -} diff --git a/src/main/java/org/micai/platform/auth/service/SysMenuService.java b/src/main/java/org/micai/platform/auth/service/SysMenuService.java deleted file mode 100644 index e9bccda..0000000 --- a/src/main/java/org/micai/platform/auth/service/SysMenuService.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.micai.platform.auth.service; - -import cn.hutool.core.lang.tree.Tree; -import com.baomidou.mybatisplus.extension.service.IService; -import org.micai.platform.auth.bo.MenuDelBo; -import org.micai.platform.auth.bo.MenuSaveBo; -import org.micai.platform.auth.bo.MenuUpdateBo; -import org.micai.platform.auth.entity.SysMenu; - -import java.util.List; - -/** - *

- * 服务类 - *

- * - * @author liucong - * @since 2021-12-06 - */ -public interface SysMenuService extends IService { - - List> find() throws Exception; - - void updateMenu(MenuUpdateBo bo) throws Exception; - - void saveMenu(MenuSaveBo bo) throws Exception; - - void delMenu(MenuDelBo bo) throws Exception; -} diff --git a/src/main/java/org/micai/platform/auth/service/SysRegionService.java b/src/main/java/org/micai/platform/auth/service/SysRegionService.java deleted file mode 100644 index df1b234..0000000 --- a/src/main/java/org/micai/platform/auth/service/SysRegionService.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.micai.platform.auth.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.micai.platform.auth.entity.SysRegion; -import org.micai.platform.auth.entity.User; - -import java.util.List; - -/** - *

- * 区域地址表 服务类 - *

- * - * @author yangtao - * @since 2021-12-31 - */ -public interface SysRegionService extends IService { - /** - * 根据区域名称进行查询 - * @param regionName - * @return - */ - SysRegion findByRegionName(String regionName) throws Exception; - - /** - * 获取区域列表 - * @return - */ - List findSysRegionList() throws Exception; - -} diff --git a/src/main/java/org/micai/platform/auth/service/impl/OrganInfoServiceImpl.java b/src/main/java/org/micai/platform/auth/service/impl/OrganInfoServiceImpl.java deleted file mode 100644 index 4960b04..0000000 --- a/src/main/java/org/micai/platform/auth/service/impl/OrganInfoServiceImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.micai.platform.auth.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.micai.platform.auth.bo.OrganDelBo; -import org.micai.platform.auth.bo.OrganFindBo; -import org.micai.platform.auth.bo.OrganSaveBo; -import org.micai.platform.auth.bo.OrganUpdateBo; -import org.micai.platform.auth.entity.OrganInfo; -import org.micai.platform.auth.mapper.OrganInfoMapper; -import org.micai.platform.auth.service.OrganInfoService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.vo.OrganListVo; -import org.springframework.stereotype.Service; - -/** - *

- * 服务实现类 - *

- * - * @author liucong - * @since 2021-12-06 - */ -@Service -public class OrganInfoServiceImpl extends ServiceImpl implements OrganInfoService { - - @Override - public Page getOrganList(OrganFindBo bo) { - return null; - } - - @Override - public void updateOrgan(OrganUpdateBo bo) { - - } - - @Override - public void saveOrgan(OrganSaveBo bo) { - - } - - @Override - public void delOrgan(OrganDelBo bo) { - - } -} diff --git a/src/main/java/org/micai/platform/auth/service/impl/PermissionMenuServiceImpl.java b/src/main/java/org/micai/platform/auth/service/impl/PermissionMenuServiceImpl.java deleted file mode 100644 index 5bf5a2f..0000000 --- a/src/main/java/org/micai/platform/auth/service/impl/PermissionMenuServiceImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.micai.platform.auth.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.bo.PermissionMenuDelBo; -import org.micai.platform.auth.bo.PermissionMenuSaveBo; -import org.micai.platform.auth.bo.PermissionMenuUpdateBo; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.entity.PermissionMenu; -import org.micai.platform.auth.mapper.PermissionMenuMapper; -import org.micai.platform.auth.service.PermissionMenuService; -import org.micai.platform.auth.utils.AuthenticationManger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * @Author liuCong - * @Date 2022/1/13 16:54 - * @ClassName PermissionMenuServiceImpl - * @Description - */ -@Service -public class PermissionMenuServiceImpl extends ServiceImpl implements PermissionMenuService { - @Autowired - private PermissionMenuMapper permissionMenuMapper; - - @Override - public void updatePM(PermissionMenuUpdateBo bo) throws Exception { - PermissionMenu permissionMenu = BeanUtil.copyProperties(bo, PermissionMenu.class); - UserAuthenticationDto authentication = AuthenticationManger.getAuthentication(); - permissionMenu.setUpdateUserId(authentication.getId()); - PermissionMenu permissionMenuEn = permissionMenuMapper.selectById(permissionMenu.getId()); - permissionMenu.setVersion(permissionMenuEn.getVersion()); - permissionMenuMapper.updateById(permissionMenu); - } - - @Override - public void savePM(PermissionMenuSaveBo bo) throws Exception { - PermissionMenu permissionMenu = BeanUtil.copyProperties(bo, PermissionMenu.class); - - //不能有重复的 - List permissionMenus = permissionMenuMapper.selectList(new QueryWrapper().lambda() - .eq(PermissionMenu::getPermissionId, bo.getPermissionId()) - .eq(PermissionMenu::getMenuId, bo.getMenuId())); - - if (ObjectUtil.isNotEmpty(permissionMenus)) { - throw new PlatformException(ConstantEnum.DATA_DUPLICATION); - } - - UserAuthenticationDto authentication = AuthenticationManger.getAuthentication(); - permissionMenu - .setCreateUserId(authentication.getId()) - .setUpdateUserId(authentication.getId()); - permissionMenuMapper.insert(permissionMenu); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void delPM(PermissionMenuDelBo bo) throws Exception { - List idList = bo.getIdList(); - int deleteBatchIds = permissionMenuMapper.deleteBatchIds(idList); - if (idList.size() != deleteBatchIds){ - throw new PlatformException(ConstantEnum.UPDATE_ERROR); - } - } -} diff --git a/src/main/java/org/micai/platform/auth/service/impl/SysMenuServiceImpl.java b/src/main/java/org/micai/platform/auth/service/impl/SysMenuServiceImpl.java deleted file mode 100644 index 8edcb2d..0000000 --- a/src/main/java/org/micai/platform/auth/service/impl/SysMenuServiceImpl.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.micai.platform.auth.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.lang.tree.Tree; -import cn.hutool.core.lang.tree.TreeNodeConfig; -import cn.hutool.core.lang.tree.TreeUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.bo.MenuDelBo; -import org.micai.platform.auth.bo.MenuSaveBo; -import org.micai.platform.auth.bo.MenuUpdateBo; -import org.micai.platform.auth.constant.ConstantCode; -import org.micai.platform.auth.constant.ConstantEnum; -import org.micai.platform.auth.dto.UserAuthenticationDto; -import org.micai.platform.auth.entity.Permission; -import org.micai.platform.auth.entity.PermissionMenu; -import org.micai.platform.auth.entity.SysMenu; -import org.micai.platform.auth.base.exception.PlatformException; -import org.micai.platform.auth.mapper.PermissionMapper; -import org.micai.platform.auth.mapper.PermissionMenuMapper; -import org.micai.platform.auth.mapper.SysMenuMapper; -import org.micai.platform.auth.service.SysMenuService; -import org.micai.platform.auth.utils.AuthenticationManger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -/** - *

- * 服务实现类 - *

- * - * @author liucong - * @since 2021-12-06 - */ -@Service -public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { - - @Autowired - private PermissionMapper permissionMapper; - - @Autowired - private PermissionMenuMapper permissionMenuMapper; - - @Autowired - private SysMenuMapper sysMenuMapper; - - @Override - public List> find() throws Exception{ - UserAuthenticationDto authentication = AuthenticationManger.getAuthentication(); - List permissions = authentication.getPermissions(); - List permissionList = permissionMapper.selectList(new QueryWrapper().lambda().in(Permission::getPermissionCode, permissions)); - List permissionCodeList = permissionList.stream().map(Permission::getId).collect(Collectors.toList()); - List permissionMenus = permissionMenuMapper.selectList(new QueryWrapper().in("permission_id",permissionCodeList)); - if (ObjectUtil.isEmpty(permissionMenus)){ - return null; - } - List menuIds = permissionMenus.stream().map(PermissionMenu::getMenuId).collect(Collectors.toList()); - List menuList = sysMenuMapper.selectList(new QueryWrapper().in("id", menuIds).eq("status", ConstantCode.STR_Z_ONE)); - if (ObjectUtil.isNotEmpty(menuList)){ - //配置 - TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); - // 自定义属性名 都要默认值的 - treeNodeConfig.setWeightKey("order"); - treeNodeConfig.setIdKey("rid"); - // 最大递归深度 - treeNodeConfig.setDeep(ConstantCode.INT_THREE); - //转换器 00代表根目录 - return TreeUtil.build(menuList, ConstantCode.STR_DOUBLE_ZONE, treeNodeConfig, - (treeNode, tree) -> { - tree.setId(treeNode.getMenuCode()); - tree.setParentId(treeNode.getParentCode()); - tree.setWeight(treeNode.getSn()); - // 扩展属性 ... - tree.putExtra("menuIcon", treeNode.getMenuIcon()); - tree.putExtra("url", treeNode.getUrl()); - tree.putExtra("openType", treeNode.getOpenType()); - tree.putExtra("sn", treeNode.getSn()); - tree.putExtra("menuName", treeNode.getMenuName()); - tree.putExtra("menuCode", treeNode.getMenuCode()); - }); - } - - return null; - } - - @Override - public void updateMenu(MenuUpdateBo bo) throws Exception { - SysMenu sysMenu = BeanUtil.copyProperties(bo, SysMenu.class); - UserAuthenticationDto authentication = AuthenticationManger.getAuthentication(); - sysMenu.setUpdateUserId(authentication.getId()); - SysMenu sysMenuEn = sysMenuMapper.selectById(sysMenu.getId()); - sysMenu.setVersion(sysMenuEn.getVersion()); - int i = sysMenuMapper.updateById(sysMenu); - if (ConstantCode.INT_ONE != i){ - throw new PlatformException(ConstantEnum.UPDATE_ERROR); - } - } - - @Override - public void saveMenu(MenuSaveBo bo) throws Exception { - SysMenu sysMenu = BeanUtil.copyProperties(bo, SysMenu.class); - UserAuthenticationDto authentication = AuthenticationManger.getAuthentication(); - sysMenu.setMenuCode(RandomUtil.randomString(ConstantCode.INT_TEN)) - .setCreateUserId(authentication.getId()) - .setUpdateUserId(authentication.getId()) - .setStatus(ConstantCode.STR_Z_ONE); - int i = sysMenuMapper.insert(sysMenu); - if (ConstantCode.INT_ONE != i){ - throw new PlatformException(ConstantEnum.UPDATE_ERROR); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void delMenu(MenuDelBo bo) throws Exception { - List idList = bo.getIdList(); - int deleteBatchIds = permissionMapper.deleteBatchIds(idList); - if (idList.size() != deleteBatchIds){ - throw new PlatformException(ConstantEnum.UPDATE_ERROR); - } - } -} diff --git a/src/main/java/org/micai/platform/auth/service/impl/SysRegionServiceImpl.java b/src/main/java/org/micai/platform/auth/service/impl/SysRegionServiceImpl.java deleted file mode 100644 index cc2de03..0000000 --- a/src/main/java/org/micai/platform/auth/service/impl/SysRegionServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.micai.platform.auth.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.micai.platform.auth.entity.SysRegion; -import org.micai.platform.auth.entity.User; -import org.micai.platform.auth.mapper.SysRegionMapper; -import org.micai.platform.auth.service.SysRegionService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - *

- * 区域地址表 服务实现类 - *

- * - * @author yangtao - * @since 2021-12-31 - */ -@Service -public class SysRegionServiceImpl extends ServiceImpl implements SysRegionService { - - @Autowired - private SysRegionMapper sysRegionMapper; - - @Override - public SysRegion findByRegionName(String regionName) { - if (ObjectUtil.isNotEmpty(regionName)){ - SysRegion sysRegion = sysRegionMapper.selectOne(new QueryWrapper().lambda().eq(SysRegion::getRegionName, regionName)); - return sysRegion; - } - return null; - } - - @Override - public List findSysRegionList() { - List sysRegionList = sysRegionMapper.selectList(Wrappers.lambdaQuery()); - return sysRegionList; - } -} diff --git a/src/test/java/org/micai/platform/auth/LogTests.java b/src/test/java/org/micai/platform/auth/LogTests.java deleted file mode 100644 index c9d5418..0000000 --- a/src/test/java/org/micai/platform/auth/LogTests.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.micai.platform.auth; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * @Author zhaoxinguo - * @Date 2021-12-13 15:34 - * @ClassName LogTests - * @Description 日志输出测试类 - */ -@SpringBootTest -@RunWith(SpringJUnit4ClassRunner.class) -public class LogTests { - - Logger logger = LoggerFactory.getLogger(Logger.class); - - @Test - public void contextLoad() { - // 可以调整日志级别、日志的输出会按照这个配置的级别及以上的级别生效 - // 日志级别从低到高分为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL - logger.trace("这是trace日志......"); - logger.debug("这是debug日志......"); - logger.info("这是info日志......"); - logger.warn("这是warn日志......"); - logger.error("这是error日志......"); - } - - -} diff --git a/src/test/java/org/micai/platform/auth/MicaiPlatformAuthApplicationTests.java b/src/test/java/org/micai/platform/auth/MicaiPlatformAuthApplicationTests.java deleted file mode 100644 index 6a6b48f..0000000 --- a/src/test/java/org/micai/platform/auth/MicaiPlatformAuthApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.micai.platform.auth; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class MicaiPlatformAuthApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties deleted file mode 100644 index c921663..0000000 --- a/src/test/resources/application.properties +++ /dev/null @@ -1,42 +0,0 @@ -# MySQL -spring.datasource.driverClassName=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/security?prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8&allowMultiQueries=true -spring.datasource.username=root -spring.datasource.password=root - -# JPA -#spring.jpa.hibernate.ddl-auto=update -#spring.jpa.show-sql=true -#spring.jackson.serialization.indent_output=true -spring.mvc.pathmatch.matching-strategy=ant_path_matcher - -# JWT Config -jwt.header=Authorization -jwt.secret=NDU0NTY4amhmc3NkeHp6eGNxdzIlMjFAJTIxQCUyM2ZmNQ== -jwt.expiration=7200000 - -#mybatis-plus -mybatis-plus.global-config.db-config.insert-strategy=not_empty -mybatis-plus.global-config.db-config.update-strategy=not_empty -mybatis-plus.global-config.db-config.where-strategy=not_empty -#mybatis-plus.mapper-locations= -mybatis-plus.global-config.db-config.id-type=auto -mybatis-plus.configuration.map-underscore-to-camel-case=true -mybatis-plus.global-config.db-config.table-prefix=tb_ -mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl - -#log level config -logging.level.org.micai.platform.auto=warn -logging.level.org.springframework.web=debug -#logging.level.org.hibernate=error -logging.file.name=auth.log -logging.file.path=/opt/auth/logs - -site.location=${user.dir} -site.options.storage_max_width=800 -site.options.storage_limit_size=2 -site.options.thumbnail_channel_size=200x112 -site.options.thumbnail_post_size=360x200 - - - -- Gitee From bcc2642051d7b4bd5276ab2d295ce1554d00fced Mon Sep 17 00:00:00 2001 From: liucong Date: Mon, 12 Dec 2022 14:44:56 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A4=A7=E4=BD=93?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0-=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=AE=9E=E7=8E=B0jwt=E5=92=8Coauth22?= =?UTF-8?q?=E7=A7=8D=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthorizationServerConfiguration.java | 29 ++--- .../authserver/config/TokenConfig.java | 2 +- .../authserver/filter/JWTLoginFilter.java | 2 +- .../base/exception/DefaultException.java | 26 ----- .../exception/GlobalExceptionHandler.java | 19 +++ .../resourcesserver/config/CodeGenerator.java | 3 +- .../config/RequestMatcherConfig.java | 52 +++++++++ .../config/ResourceServerConfig.java | 108 ++++++++++++++++++ .../resourcesserver/config/SwaggerConfig.java | 5 +- .../config/WebSecurityConfig.java | 105 +---------------- .../filter/AuthHeaderFilter.java | 90 +++++++++++++++ .../filter/JWTAuthenticationFilter.java | 8 +- .../src/main/resources/application-dev.yml | 8 ++ .../src/main/resources/logback-spring.xml | 6 +- 14 files changed, 305 insertions(+), 158 deletions(-) delete mode 100644 platform-common/src/main/java/org/micai/platform/common/base/exception/DefaultException.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java create mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java index f81103f..d35df53 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java @@ -11,7 +11,6 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.A import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; -import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices; import org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices; @@ -62,7 +61,7 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu /** * @Author : liuCong * @Date : 2022/11/24 下午 2:50 - * @Description :在认证管理器的令牌端点配置中添加---用在密码模式授权 + * @Description :用来配置授权(authorization)以及令牌(token)的访问端点和令牌服务(token services)。 * @Throws : // * @Params : [endpoints] * @Return : void @@ -93,6 +92,12 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu } } + /** + * 用来配置令牌端点(Token Endpoint)的安全约束 + * + * @param security 安全 + * @throws Exception 异常 + */ @Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { // 获取密钥需要身份认证,使用单点登录时必须配置 @@ -103,25 +108,15 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu .allowFormAuthenticationForClients(); } - - /** - * 基于jdbc存储客户端信息,需要先进行配置 - * - * @return - */ - public ClientDetailsService clientDetailsService() { - return new JdbcClientDetailsService(dataSource); - } - /** - * 配置客户端信息 - * 数据库模式 - * @param clients - * @throws Exception + * 用来配置客户端详情服务(ClientDetailsService),客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息。 + * 包含3种方法 withClientDetails() inMemory() jdbc() + * @param clients 客户 + * @throws Exception 异常 */ @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { - clients.withClientDetails(clientDetailsService()); + clients.withClientDetails(new JdbcClientDetailsService(dataSource)); } } diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java index 30dd59e..0ee57c3 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java @@ -26,7 +26,7 @@ public class TokenConfig { * @Throws : // * @Params : [] * @Return : org.springframework.security.oauth2.provider.token.store.JwtTokenStore - * 默认使用的是InMemoryTokenStore来存储,如果用数据库,那么每次token服务查询、存储,都需要SQL操作。这里重点 JdbcTokenStore。 + * 默认使用的是InMemoryTokenStore来存储,如果用数据库,那么每次token服务查询、存储,都需要SQL操作。 **/ @Bean public JwtTokenStore jwtTokenStore(){ diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java index dcd24ff..d2bf16a 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java @@ -150,7 +150,7 @@ public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { writer.flush(); writer.close(); } catch (Exception e) { - log.error("successfulAuthentication error:" + e); + log.error("successfulAuthentication error:{}",e.toString()); } } diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/DefaultException.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/DefaultException.java deleted file mode 100644 index 621c06e..0000000 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/DefaultException.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.micai.platform.common.base.exception; - -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.common.base.constant.ConstantEnum; -import org.micai.platform.common.base.result.Result; -import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import java.util.stream.Collectors; - -@RestControllerAdvice -@Slf4j -public class DefaultException { - - @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseBody - public Result methodArgumentNotValidException(MethodArgumentNotValidException exception) { - log.info("捕获异常MethodArgumentNotValidException"); - String message = exception.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); - return new Result(ConstantEnum.FAIL,message); - } - -} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index c40349d..e113cad 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -1,10 +1,13 @@ package org.micai.platform.common.base.exception; +import io.jsonwebtoken.SignatureException; import lombok.extern.slf4j.Slf4j; import org.micai.platform.common.base.constant.ConstantEnum; import org.micai.platform.common.base.result.Result; +import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.dao.DuplicateKeyException; import org.springframework.security.access.AccessDeniedException; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @@ -12,6 +15,7 @@ import org.springframework.web.client.ResourceAccessException; import org.springframework.web.servlet.NoHandlerFoundException; import java.net.ConnectException; +import java.util.stream.Collectors; /** * @ClassName GlobalExceptionHandler @@ -54,4 +58,19 @@ public class GlobalExceptionHandler { log.error(e.getMessage(), e); return new Result(ConstantEnum.ACCESS_DENIED); } + + @ExceptionHandler(value = SignatureException.class) + @ResponseBody + public Result signatureException(AccessDeniedException e) { + log.error(e.getMessage(), e); + return new Result(ConstantEnum.SIGNATURE_EX); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public Result methodArgumentNotValidException(MethodArgumentNotValidException exception) { + log.info("捕获异常MethodArgumentNotValidException"); + String message = exception.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); + return new Result(ConstantEnum.FAIL,message); + } } diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/CodeGenerator.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/CodeGenerator.java index 752af62..e5706a7 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/CodeGenerator.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/CodeGenerator.java @@ -25,8 +25,7 @@ public class CodeGenerator { // 2、全局配置 GlobalConfig gc = new GlobalConfig(); - String projectPath = System.getProperty("user.dir"); - gc.setOutputDir(projectPath + "/src/main/java"); + gc.setOutputDir("D:\\AStudySpace\\springsecurity-oauth2\\oauth-sso-server\\src\\main\\java"); gc.setAuthor("liucong"); gc.setOpen(false); //生成后是否打开资源管理器 gc.setFileOverride(false); //重新生成时文件是否覆盖 diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java new file mode 100644 index 0000000..b11baf9 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java @@ -0,0 +1,52 @@ +package org.micai.platform.resourcesserver.config; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author liuCong + * @Date 2022/12/12 下午 2:01 + * @ClassName RequestMatcherConfig + * @Description + */ +@Component +@Slf4j +@ConfigurationProperties(prefix = "request.matcher") +@Data +public class RequestMatcherConfig { + + private List authJwtRequestMatcher = new ArrayList<>(); + + private List authOAuth2RequestMatcher = new ArrayList<>(); + + + private List jwtAuthList; + + private List oauth2AuthList; + + @PostConstruct + public void initMatcher() { + if (ObjectUtil.isNotEmpty(jwtAuthList)) { + for (String jwtAuth : jwtAuthList) { + authJwtRequestMatcher.add(new AntPathRequestMatcher(jwtAuth)); + } + } + + if (ObjectUtil.isNotEmpty(oauth2AuthList)) { + for (String oauth2Auth : oauth2AuthList) { + authOAuth2RequestMatcher.add(new AntPathRequestMatcher(oauth2Auth)); + } + } + log.info("init request matcher list:==========================>>>>>>>>>>>>>>>>> \n" + + "authJwtRequestMatcher:{},authOAuth2RequestMatcher{} " + , authJwtRequestMatcher, authOAuth2RequestMatcher); + } +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java index 7213971..db2d2a7 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java @@ -1,12 +1,28 @@ package org.micai.platform.resourcesserver.config; +import org.micai.platform.common.base.constant.ConstantCode; +import org.micai.platform.resourcesserver.filter.AuthHeaderFilter; +import org.micai.platform.resourcesserver.filter.JWTAuthenticationFilter; +import org.micai.platform.resourcesserver.handler.Http401AuthenticationEntryPoint; +import org.micai.platform.resourcesserver.provider.CustomAuthenticationProvider; +import org.micai.platform.resourcesserver.service.PermissionService; +import org.micai.platform.resourcesserver.service.RolePermissionService; +import org.micai.platform.resourcesserver.service.RoleService; +import org.micai.platform.resourcesserver.service.UserRoleService; +import org.micai.platform.resourcesserver.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; +import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter; +import org.springframework.security.web.authentication.preauth.x509.X509AuthenticationFilter; /** * @Author liuCong @@ -18,12 +34,63 @@ import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { + /** + * 需要放行的URL + */ + private static final String[] AUTH_WHITELIST = { + // -- register url + "/users/signup", + "/upload/store", + + // -- swagger ui + "/v2/api-docs", + "/swagger-resources", + "/swagger-resources/**", + "/webjars/**", + "/doc.html", + + // other public endpoints of your API may be appended to this array + }; + @Autowired private JwtTokenStore jwtTokenStore; @Value("${resource-ids}") private String resourceIds; + @Value("${jwt.sign.key}") + private String signKey; + + @Autowired + private UserService userService; + + @Autowired + private BCryptPasswordEncoder bCryptPasswordEncoder; + + @Autowired + private UserRoleService userRoleService; + + @Autowired + private RoleService roleService; + + @Autowired + private RolePermissionService rolePermissionService; + + @Autowired + private PermissionService permissionService; + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private RequestMatcherConfig requestMatcherConfig; + + /** + * 配置:设置oauth2验证规则 + * + * @param resources 资源 + * @throws Exception 异常 + */ @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources @@ -32,4 +99,45 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { ; } + + /** + * 设置 HTTP 验证规则 + * + * @param http + * @throws Exception + */ + @Override + public void configure(HttpSecurity http) throws Exception { + http + .cors().and().csrf().disable()//禁止跨域 + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)//session管理机制: 不会保存session状态 + + .and() + .exceptionHandling()// 自定义异常处理 + .authenticationEntryPoint(new Http401AuthenticationEntryPoint(ConstantCode.BASE_REALM)) // 未登录处理 + + .and() + // 自定义过滤器 + //.addFilter(new JWTAuthenticationFilter(authenticationManager, signKey)) + .authorizeRequests()// 验证策略 + .antMatchers(AUTH_WHITELIST).permitAll()// 无需验证路径 + .anyRequest().authenticated() // 所有请求需要身份认证 + + .and() + .logout() // 默认注销行为为logout,可以通过下面的方式来修改 + .logoutUrl("/logout") + .logoutSuccessUrl("/")// 设置注销成功后跳转页面,默认是跳转到登录页面; + .permitAll(); + + AuthHeaderFilter authHeaderFilter = new AuthHeaderFilter(); + authHeaderFilter.setAuthHeaderRequestMatcher(requestMatcherConfig.getAuthJwtRequestMatcher(), requestMatcherConfig.getAuthOAuth2RequestMatcher()); + //为什么要在after + //因为OAuth2AuthenticationProcessingFilter.doFilter()包含了SecurityContextHolder.clearContext(); + http.addFilterAfter(new JWTAuthenticationFilter(authenticationManager,signKey), AbstractPreAuthenticatedProcessingFilter.class); + http.addFilterAfter(authHeaderFilter, X509AuthenticationFilter.class); + // 使用自定义身份验证组件 + http.authenticationProvider(new CustomAuthenticationProvider(userService, bCryptPasswordEncoder,userRoleService, + roleService,rolePermissionService,permissionService)); + } + } diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java index 45294c8..e0cac6e 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java @@ -42,16 +42,15 @@ public class SwaggerConfig { List pars = new ArrayList(); tokenPar.name("Authorization").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(true).build(); pars.add(tokenPar.build()); - Docket docket = new Docket(DocumentationType.SWAGGER_2) + return new Docket(DocumentationType.SWAGGER_2) .select() - .apis(RequestHandlerSelectors.basePackage("org.micai.platform.auth.controller")) + .apis(RequestHandlerSelectors.basePackage("org.micai.platform.resourcesserver.controller")) .paths(PathSelectors.ant("/**")) .build() .globalOperationParameters(pars) .apiInfo(apiInfo()) .useDefaultResponseMessages(false) .globalResponseMessage(RequestMethod.GET, newArrayList(new ResponseMessageBuilder().code(500).message("500 queue").responseModel(new ModelRef("Error")).build(), new ResponseMessageBuilder().code(403).message("Forbidden!!!!!").build())); - return docket; } private ApiInfo apiInfo() { diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/WebSecurityConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/WebSecurityConfig.java index aedabf1..9092654 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/WebSecurityConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/WebSecurityConfig.java @@ -1,23 +1,11 @@ package org.micai.platform.resourcesserver.config; -import org.micai.platform.common.base.constant.ConstantCode; -import org.micai.platform.resourcesserver.filter.JWTAuthenticationFilter; -import org.micai.platform.resourcesserver.handler.CustomAuthenticationFailureHandler; -import org.micai.platform.resourcesserver.handler.Http401AuthenticationEntryPoint; -import org.micai.platform.resourcesserver.provider.CustomAuthenticationProvider; -import org.micai.platform.resourcesserver.service.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * SpringSecurity的配置 @@ -30,101 +18,10 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - /** - * 需要放行的URL - */ - private static final String[] AUTH_WHITELIST = { - // -- register url - "/users/signup", - "/upload/store", - - // -- swagger ui - "/v2/api-docs", - "/swagger-resources", - "/swagger-resources/**", - "/webjars/**", - "/doc.html", - - // other public endpoints of your API may be appended to this array - //oauth2 - }; - - @Autowired - private UserService userService; - - @Autowired - private BCryptPasswordEncoder bCryptPasswordEncoder; - - @Autowired - private UserRoleService userRoleService; - - @Autowired - private RoleService roleService; - - @Autowired - private RolePermissionService rolePermissionService; - - @Autowired - private PermissionService permissionService; - - @Autowired - private CustomAuthenticationFailureHandler customAuthenticationFailureHandler; - - @Value("${jwt.sign.key}") - private String signKey; - - @Value("${jwt.expiration.time}") - private int expirationTime; - @Bean @Override protected AuthenticationManager authenticationManager() throws Exception { - return super.authenticationManager(); - } - - /** - * 设置 HTTP 验证规则 - * - * @param http - * @throws Exception - */ - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .cors().and().csrf().disable()//禁止跨域 - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)//session管理机制: 不会保存session状态 - - .and() - .exceptionHandling()// 自定义异常处理 - .authenticationEntryPoint(new Http401AuthenticationEntryPoint(ConstantCode.BASE_REALM)) // 未登录处理 -// .and()//权限不足处理.exceptionHandling().accessDeniedHandler(customAccessDeniedHandler) // 自定义访问失败处理器 - - .and() - // 自定义过滤器 - .addFilter(new JWTAuthenticationFilter(authenticationManager(), signKey)) - .authorizeRequests()// 验证策略 - .antMatchers(AUTH_WHITELIST).permitAll()// 无需验证路径 - .anyRequest().authenticated() // 所有请求需要身份认证 - - .and() - .logout() // 默认注销行为为logout,可以通过下面的方式来修改 - .logoutUrl("/logout") - .logoutSuccessUrl("/login")// 设置注销成功后跳转页面,默认是跳转到登录页面; -// .logoutSuccessHandler(customLogoutSuccessHandler) - .permitAll(); + return super.authenticationManager(); } - - /** - * 该方法是登录的时候会进入 - * - * @param auth - * @throws Exception - */ - @Override - public void configure(AuthenticationManagerBuilder auth) throws Exception { - // 使用自定义身份验证组件 - auth.authenticationProvider(new CustomAuthenticationProvider(userService, bCryptPasswordEncoder,userRoleService, - roleService,rolePermissionService,permissionService)); - } } diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java new file mode 100644 index 0000000..9fa2360 --- /dev/null +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java @@ -0,0 +1,90 @@ +package org.micai.platform.resourcesserver.filter; + +import cn.hutool.core.util.ObjectUtil; +import org.micai.platform.common.base.constant.ConstantCode; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.util.Assert; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.IOException; +import java.util.Enumeration; +import java.util.List; +import java.util.Vector; + +/** + * @Author liuCong + * @Date 2022/12/12 上午 9:58 + * @ClassName AuthHeaderFilter + * @Description + */ +public class AuthHeaderFilter implements Filter { + + //拦截接口让JWTAuthenticationFilter去验证 + private List authJwtRequestMatcher; + + //拦截接口让OAuth2AuthenticationProcessingFilter去验证 + private List authOAuth2RequestMatcher; + + public void setAuthHeaderRequestMatcher(List authJwtRequestMatcher, List authOAuth2RequestMatcher) { + Assert.notNull(authJwtRequestMatcher, "authJwtRequestMatcher cannot be null"); + Assert.notNull(authOAuth2RequestMatcher, "authOAuth2RequestMatcher cannot be null"); + this.authJwtRequestMatcher = authJwtRequestMatcher; + this.authOAuth2RequestMatcher = authOAuth2RequestMatcher; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) servletRequest) { + + + /** + * 得到头 + *为了让在 + *JWTAuthenticationFilter 获取token时为空 + * @param name 名字 + * @return {@link String} + */ + @Override + public String getHeader(String name) { + if (ObjectUtil.isNotEmpty(authJwtRequestMatcher)) { + for (AntPathRequestMatcher antPathRequestMatcher : authJwtRequestMatcher) { + if (antPathRequestMatcher.matches(request) && ConstantCode.AUTHORIZATION.equalsIgnoreCase(name)) { + return super.getHeader(name); + } + } + } + return null; + + } + + /** + * 重写得到头方法 + * 为了让在 + * OAuth2AuthenticationProcessingFilter + * org.springframework.security.oauth2.provider.authentication.BearerTokenExtractor#extractHeaderToken(javax.servlet.http.HttpServletRequest) + * 获取的token时候为空 + * @param name 名字 + * @return {@link Enumeration}<{@link String}> + */ + @Override + public Enumeration getHeaders(String name) { + if (ObjectUtil.isNotEmpty(authOAuth2RequestMatcher)) { + for (AntPathRequestMatcher antPathRequestMatcher : authOAuth2RequestMatcher) { + if (antPathRequestMatcher.matches(request) && ConstantCode.AUTHORIZATION.equalsIgnoreCase(name)) { + return super.getHeaders(name); + } + } + } + return new Vector().elements(); + } + }; + filterChain.doFilter(requestWrapper, servletResponse); + } +} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java index 2155e9c..5e80b66 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java @@ -2,7 +2,13 @@ package org.micai.platform.resourcesserver.filter; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; -import io.jsonwebtoken.*; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.SignatureException; +import io.jsonwebtoken.UnsupportedJwtException; import lombok.extern.slf4j.Slf4j; import org.micai.platform.common.base.constant.ConstantCode; import org.micai.platform.common.base.constant.ConstantEnum; diff --git a/platform-resources-server/src/main/resources/application-dev.yml b/platform-resources-server/src/main/resources/application-dev.yml index c4ec76e..0dcb455 100644 --- a/platform-resources-server/src/main/resources/application-dev.yml +++ b/platform-resources-server/src/main/resources/application-dev.yml @@ -20,3 +20,11 @@ jwt: time: 15 resource-ids: user + +request: + matcher: + jwtAuthList: + - /user/info + - /user/list + oauth2AuthList: + - /demo diff --git a/platform-resources-server/src/main/resources/logback-spring.xml b/platform-resources-server/src/main/resources/logback-spring.xml index 4a1d217..896f83d 100644 --- a/platform-resources-server/src/main/resources/logback-spring.xml +++ b/platform-resources-server/src/main/resources/logback-spring.xml @@ -26,8 +26,8 @@ - - trace + debug + ${PATTERN_COLOR} @@ -42,7 +42,7 @@ - + -- Gitee From 13a238546a32ddf628c7c7bd6ea56a0957e1e2b2 Mon Sep 17 00:00:00 2001 From: liucong Date: Mon, 12 Dec 2022 17:24:37 +0800 Subject: [PATCH 04/16] =?UTF-8?q?platform-common=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8=E8=A3=85=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/base/WebStarterAutoConfig.java | 20 +++++++ .../base/controller/ExceptionController.java | 56 +++++++++++++++++++ .../exception/GlobalExceptionHandler.java | 14 +++-- .../main/resources/META-INF/spring.factories | 3 + pom.xml | 6 +- 5 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 platform-common/src/main/java/org/micai/platform/common/base/WebStarterAutoConfig.java create mode 100644 platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java create mode 100644 platform-common/src/main/resources/META-INF/spring.factories diff --git a/platform-common/src/main/java/org/micai/platform/common/base/WebStarterAutoConfig.java b/platform-common/src/main/java/org/micai/platform/common/base/WebStarterAutoConfig.java new file mode 100644 index 0000000..6924fa4 --- /dev/null +++ b/platform-common/src/main/java/org/micai/platform/common/base/WebStarterAutoConfig.java @@ -0,0 +1,20 @@ +package org.micai.platform.common.base; + +import org.micai.platform.common.base.controller.ExceptionController; +import org.micai.platform.common.base.exception.GlobalExceptionHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * @Author liuCong + * @Date 2022/12/12 下午 3:55 + * @ClassName WebStarterAutoConfig + * @Description + */ +@Configuration +@Import({GlobalExceptionHandler.class, ExceptionController.class}) +public class WebStarterAutoConfig { + + public WebStarterAutoConfig() { + } +} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java b/platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java new file mode 100644 index 0000000..1b3ccc1 --- /dev/null +++ b/platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java @@ -0,0 +1,56 @@ +package org.micai.platform.common.base.controller; + +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.UnsupportedJwtException; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.security.SignatureException; + +/** + * @Author liuCong + * @Date 2022/12/12 下午 3:24 + * @ClassName ExceptionController + * @Description + */ +@RestController +public class ExceptionController { + + @RequestMapping("/expiredJwtException") + public void expiredJwtException(HttpServletRequest request) throws ExpiredJwtException { + if (request.getAttribute("expiredJwtException") instanceof ExpiredJwtException) { + throw ((ExpiredJwtException) request.getAttribute("expiredJwtException")); + } + } + + @RequestMapping("/unsupportedJwtException") + public void unsupportedJwtException(HttpServletRequest request) throws UnsupportedJwtException { + if (request.getAttribute("unsupportedJwtException") instanceof UnsupportedJwtException) { + throw ((UnsupportedJwtException) request.getAttribute("unsupportedJwtException")); + } + } + + @RequestMapping("/signatureException") + public void signatureException(HttpServletRequest request) throws SignatureException { + if (request.getAttribute("signatureException") instanceof SignatureException) { + throw ((SignatureException) request.getAttribute("signatureException")); + } + } + + @RequestMapping("/illegalArgumentException") + public void illegalArgumentException(HttpServletRequest request) throws IllegalArgumentException { + if (request.getAttribute("illegalArgumentException") instanceof IllegalArgumentException) { + throw ((IllegalArgumentException) request.getAttribute("illegalArgumentException")); + } + } + + @RequestMapping("/malformedJwtException") + public void malformedJwtException(HttpServletRequest request) throws MalformedJwtException { + if (request.getAttribute("malformedJwtException") instanceof MalformedJwtException) { + throw ((MalformedJwtException) request.getAttribute("malformedJwtException")); + } + } + +} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index e113cad..b1f96b7 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -8,9 +8,8 @@ import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.dao.DuplicateKeyException; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.servlet.NoHandlerFoundException; @@ -24,7 +23,7 @@ import java.util.stream.Collectors; * @Date 2021/11/26 15:59 * @Version 1.0 */ -@ControllerAdvice +@RestControllerAdvice @Slf4j public class GlobalExceptionHandler { @@ -53,24 +52,27 @@ public class GlobalExceptionHandler { } @ExceptionHandler(value = AccessDeniedException.class) - @ResponseBody public Result accessDeniedException(AccessDeniedException e) { log.error(e.getMessage(), e); return new Result(ConstantEnum.ACCESS_DENIED); } @ExceptionHandler(value = SignatureException.class) - @ResponseBody public Result signatureException(AccessDeniedException e) { log.error(e.getMessage(), e); return new Result(ConstantEnum.SIGNATURE_EX); } @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseBody public Result methodArgumentNotValidException(MethodArgumentNotValidException exception) { log.info("捕获异常MethodArgumentNotValidException"); String message = exception.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); return new Result(ConstantEnum.FAIL,message); } + + @ExceptionHandler(value = Exception.class) + public Result exception(Exception e) { + log.error(e.getMessage(), e); + return new Result(ConstantEnum.FAIL); + } } diff --git a/platform-common/src/main/resources/META-INF/spring.factories b/platform-common/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..a4bf2f1 --- /dev/null +++ b/platform-common/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configure +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.micai.platform.common.base.WebStarterAutoConfig \ No newline at end of file diff --git a/pom.xml b/pom.xml index 18fe870..d442899 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,9 @@ platform-common - 1.8 + 8 + 8 + UTF-8 5.1.30 0.7.0 1.2.78 @@ -197,7 +199,7 @@ - + spring-milestones -- Gitee From 95cd4cb38dca61d236e73f26ddf4b63956e17a49 Mon Sep 17 00:00:00 2001 From: liucong Date: Mon, 12 Dec 2022 17:40:40 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index b1f96b7..7c5b9b0 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -1,6 +1,9 @@ package org.micai.platform.common.base.exception; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.MalformedJwtException; import io.jsonwebtoken.SignatureException; +import io.jsonwebtoken.UnsupportedJwtException; import lombok.extern.slf4j.Slf4j; import org.micai.platform.common.base.constant.ConstantEnum; import org.micai.platform.common.base.result.Result; @@ -51,18 +54,43 @@ public class GlobalExceptionHandler { return new Result(ConstantEnum.RESOURCE_ACCESS); } - @ExceptionHandler(value = AccessDeniedException.class) + @ExceptionHandler(AccessDeniedException.class) public Result accessDeniedException(AccessDeniedException e) { log.error(e.getMessage(), e); return new Result(ConstantEnum.ACCESS_DENIED); } - @ExceptionHandler(value = SignatureException.class) + @ExceptionHandler(SignatureException.class) public Result signatureException(AccessDeniedException e) { log.error(e.getMessage(), e); return new Result(ConstantEnum.SIGNATURE_EX); } + @ExceptionHandler(ExpiredJwtException.class) + public Result expiredJwtException(ExpiredJwtException e) { + log.error(e.getMessage(), e); + return new Result(ConstantEnum.EXPIRED_JWT); + } + + @ExceptionHandler(UnsupportedJwtException.class) + public Result unsupportedJwtException(UnsupportedJwtException e) { + log.error(e.getMessage(), e); + return new Result(ConstantEnum.TOKEN_ERROR); + } + + @ExceptionHandler(MalformedJwtException.class) + public Result MalformedJwtException(MalformedJwtException e) { + log.error(e.getMessage(), e); + return new Result(ConstantEnum.ACCESS_DENIED); + } + + @ExceptionHandler(IllegalArgumentException.class) + public Result illegalArgumentException(IllegalArgumentException e) { + log.error(e.getMessage(), e); + return new Result(ConstantEnum.ACCESS_DENIED); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) public Result methodArgumentNotValidException(MethodArgumentNotValidException exception) { log.info("捕获异常MethodArgumentNotValidException"); -- Gitee From a4a85d6adccc8271a6307bf7ea2e44a8dfdd748d Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 13 Dec 2022 14:47:43 +0800 Subject: [PATCH 06/16] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=B1=BB,=E5=B9=B6=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthorizationServerConfiguration.java | 14 ++ .../authserver/config/TokenConfig.java | 8 +- .../authserver/config/WebSecurityConfig.java | 19 +- .../filter/JWTAuthenticationFilter.java | 22 +- .../authserver/filter/JWTLoginFilter.java | 38 ++-- .../src/main/resources/application-dev.yml | 20 ++ .../src/main/resources/application.yml | 6 - .../base/config/MicaiPlatformOauthConfig.java | 35 +++ .../config/MicaiPlatformRequestMatcher.java | 21 ++ .../config/MicaiPlatformResourcesConfig.java | 23 ++ .../base/config/MicaiPlatformTokenConfig.java | 31 +++ .../exception/GlobalExceptionHandler.java | 2 +- .../main/resources/META-INF/spring.factories | 5 +- .../config/RequestMatcherConfig.java | 52 ----- .../config/ResourceServerConfig.java | 20 +- .../resourcesserver/config/TokenConfig.java | 7 +- .../filter/AuthHeaderFilter.java | 26 ++- .../filter/JWTAuthenticationFilter.java | 22 +- .../resourcesserver/utils/JwtHelper.java | 212 +++++++++--------- .../src/main/resources/application-dev.yml | 41 ++-- .../src/main/resources/application.yml | 6 - 21 files changed, 377 insertions(+), 253 deletions(-) create mode 100644 platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformOauthConfig.java create mode 100644 platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java create mode 100644 platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java create mode 100644 platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformTokenConfig.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java index d35df53..bc8c96c 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java @@ -1,6 +1,7 @@ package org.micai.platform.authserver.config; import org.micai.platform.authserver.handler.AuthApprovalHandler; +import org.micai.platform.common.base.config.MicaiPlatformOauthConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -14,6 +15,7 @@ import org.springframework.security.oauth2.config.annotation.web.configurers.Aut import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices; import org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices; +import org.springframework.security.oauth2.provider.token.DefaultTokenServices; import org.springframework.security.oauth2.provider.token.TokenEnhancer; import org.springframework.security.oauth2.provider.token.TokenEnhancerChain; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; @@ -52,6 +54,9 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu @Autowired private JwtTokenEnhancer jwtTokenEnhancer; + @Autowired + private MicaiPlatformOauthConfig micaiPlatformOauthConfig; + @Bean public AuthorizationCodeServices jdbcAuthorizationCodeServices() { // JDBC方式保存授权码到 oauth_code 表中 @@ -90,6 +95,15 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu enhancerChain.setTokenEnhancers(enhancers); endpoints.tokenEnhancer(enhancerChain); } + + DefaultTokenServices tokenServices = new DefaultTokenServices(); + tokenServices.setTokenStore(endpoints.getTokenStore()); + tokenServices.setSupportRefreshToken(true); + tokenServices.setClientDetailsService(endpoints.getClientDetailsService()); + tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer()); + tokenServices.setAccessTokenValiditySeconds(micaiPlatformOauthConfig.getTokenTimeout()); + tokenServices.setRefreshTokenValiditySeconds(micaiPlatformOauthConfig.getRefreshTimeout()); + endpoints.tokenServices(tokenServices); } /** diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java index 0ee57c3..2c3a9fb 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/TokenConfig.java @@ -1,5 +1,7 @@ package org.micai.platform.authserver.config; +import org.micai.platform.common.base.config.MicaiPlatformOauthConfig; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; @@ -15,8 +17,8 @@ import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; public class TokenConfig { - // jwt模式token - private static final String SIGN_KEY = "2728689210118790161"; + @Autowired + private MicaiPlatformOauthConfig micaiPlatformOauthConfig; /** @@ -44,7 +46,7 @@ public class TokenConfig { @Bean public JwtAccessTokenConverter jwtAccessTokenConverter(){ JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); - converter.setSigningKey(SIGN_KEY); + converter.setSigningKey(micaiPlatformOauthConfig.getSignKey()); return converter; } } diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java index b8d764e..3107519 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/WebSecurityConfig.java @@ -6,11 +6,15 @@ import org.micai.platform.authserver.filter.JWTLoginFilter; import org.micai.platform.authserver.handler.CustomAuthenticationFailureHandler; import org.micai.platform.authserver.handler.Http401AuthenticationEntryPoint; import org.micai.platform.authserver.provider.CustomAuthenticationProvider; -import org.micai.platform.authserver.service.*; +import org.micai.platform.authserver.service.PermissionService; +import org.micai.platform.authserver.service.RolePermissionService; +import org.micai.platform.authserver.service.RoleService; +import org.micai.platform.authserver.service.UserRoleService; +import org.micai.platform.authserver.service.UserService; import org.micai.platform.authserver.service.impl.UserDetailsServiceImpl; +import org.micai.platform.common.base.config.MicaiPlatformTokenConfig; import org.micai.platform.common.base.constant.ConstantCode; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; @@ -55,11 +59,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationFailureHandler customAuthenticationFailureHandler; - @Value("${jwt.sign.key}") - private String signKey; - - @Value("${jwt.expiration.time}") - private int expirationTime; + @Autowired + private MicaiPlatformTokenConfig micaiPlatformTokenConfig; @Bean @Override @@ -86,8 +87,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .and() // 自定义过滤器 - .addFilter(new JWTLoginFilter(authenticationManager(), signKey, expirationTime, customAuthenticationFailureHandler)) - .addFilter(new JWTAuthenticationFilter(authenticationManager(), signKey)) + .addFilter(new JWTLoginFilter(authenticationManager(), micaiPlatformTokenConfig, customAuthenticationFailureHandler)) + .addFilter(new JWTAuthenticationFilter(authenticationManager(), micaiPlatformTokenConfig)) .authorizeRequests()// 验证策略 .anyRequest().authenticated() // 所有请求需要身份认证 diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTAuthenticationFilter.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTAuthenticationFilter.java index 7fc83f1..426fdef 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTAuthenticationFilter.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTAuthenticationFilter.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON; import io.jsonwebtoken.*; import lombok.extern.slf4j.Slf4j; import org.micai.platform.authserver.service.impl.GrantedAuthorityImpl; +import org.micai.platform.common.base.config.MicaiPlatformTokenConfig; import org.micai.platform.common.base.constant.ConstantCode; import org.micai.platform.common.base.constant.ConstantEnum; import org.micai.platform.common.base.exception.PlatformException; @@ -34,17 +35,17 @@ import java.util.List; @Slf4j public class JWTAuthenticationFilter extends BasicAuthenticationFilter { - private final String signKey; + private final MicaiPlatformTokenConfig micaiPlatformTokenConfig; - public JWTAuthenticationFilter(AuthenticationManager authenticationManager, String signKey) { + public JWTAuthenticationFilter(AuthenticationManager authenticationManager, MicaiPlatformTokenConfig micaiPlatformTokenConfig) { super(authenticationManager); - this.signKey = signKey; + this.micaiPlatformTokenConfig = micaiPlatformTokenConfig; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { - String header = request.getHeader(ConstantCode.AUTHORIZATION); - if (ObjectUtil.isEmpty(header) || !header.startsWith(ConstantCode.HEADER_BEARER)) { + String header = request.getHeader(micaiPlatformTokenConfig.getTokenName()); + if (ObjectUtil.isEmpty(header) || !header.startsWith(micaiPlatformTokenConfig.getTokenPrefix())) { chain.doFilter(request, response); return; } @@ -56,13 +57,16 @@ public class JWTAuthenticationFilter extends BasicAuthenticationFilter { private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { long start = System.currentTimeMillis(); - String token = request.getHeader(ConstantCode.AUTHORIZATION); + String token = request.getHeader(micaiPlatformTokenConfig.getTokenName()); if (ObjectUtil.isEmpty(token)) { throw new PlatformException(ConstantEnum.TOKEN_MISS); } // parse the token. String user = null; - Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token.replace(ConstantCode.HEADER_BEARER, "")).getBody(); + Claims claims = Jwts.parser() + .setSigningKey(micaiPlatformTokenConfig.getSignKey()) + .parseClaimsJws(token.replace(micaiPlatformTokenConfig.getTokenPrefix(), "")) + .getBody(); log.info("相关信息 : {}",claims.getSubject()); // token签发时间 long issuedAt = claims.getIssuedAt().getTime(); @@ -88,7 +92,7 @@ public class JWTAuthenticationFilter extends BasicAuthenticationFilter { .setSubject(claims.getSubject()) .setIssuedAt(now)//签发时间 .setExpiration(time)//过期时间 - .signWith(SignatureAlgorithm.HS512, signKey) //采用什么算法是可以自己选择的,不一定非要采用HS512 + .signWith(SignatureAlgorithm.HS512, micaiPlatformTokenConfig.getSignKey()) //采用什么算法是可以自己选择的,不一定非要采用HS512 .compact(); // 重新生成token end @@ -96,7 +100,7 @@ public class JWTAuthenticationFilter extends BasicAuthenticationFilter { response.addHeader(ConstantCode.REFRESH_TOKEN, refreshToken); } long end = System.currentTimeMillis(); - logger.info("执行时间: " + (end - start) + " 毫秒"); + log.info("执行时间: " + (end - start) + " 毫秒"); user = claims.getSubject(); if (ObjectUtil.isNotEmpty(user)) { String authStr = user.split("-")[ConstantCode.INT_TWO]; diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java index d2bf16a..59ecd4b 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/filter/JWTLoginFilter.java @@ -7,6 +7,7 @@ import io.jsonwebtoken.SignatureAlgorithm; import lombok.extern.slf4j.Slf4j; import org.micai.platform.authserver.bo.UserQueryBo; import org.micai.platform.authserver.handler.CustomAuthenticationFailureHandler; +import org.micai.platform.common.base.config.MicaiPlatformTokenConfig; import org.micai.platform.common.base.constant.ConstantCode; import org.micai.platform.common.base.constant.ConstantEnum; import org.micai.platform.common.base.result.Result; @@ -23,7 +24,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 自定义JWT登录过滤器 @@ -31,6 +38,7 @@ import java.util.*; * 该类继承自UsernamePasswordAuthenticationFilter,重写了其中的2个方法 * attemptAuthentication :接收并解析用户凭证。 * successfulAuthentication :用户成功登录后,这个方法会被调用,我们在这个方法里生成token。 + * * @author zhaoxinguo on 2017/9/12. */ @Slf4j @@ -38,22 +46,19 @@ public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; - private final String signKey; - - private final int expirationTime; + private final MicaiPlatformTokenConfig micaiPlatformTokenConfig; private final CustomAuthenticationFailureHandler customAuthenticationFailureHandler; - public JWTLoginFilter(AuthenticationManager authenticationManager, String signKey, int expirationTime, - CustomAuthenticationFailureHandler customAuthenticationFailureHandler) { + public JWTLoginFilter(AuthenticationManager authenticationManager, MicaiPlatformTokenConfig micaiPlatformTokenConfig, CustomAuthenticationFailureHandler customAuthenticationFailureHandler) { this.authenticationManager = authenticationManager; - this.signKey = signKey; - this.expirationTime = expirationTime; + this.micaiPlatformTokenConfig = micaiPlatformTokenConfig; this.customAuthenticationFailureHandler = customAuthenticationFailureHandler; } /** * 尝试身份认证(接收并解析用户凭证) + * * @param req * @param res * @return @@ -63,7 +68,7 @@ public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) { Authentication authenticate = null; try { - Map requestMap = new ObjectMapper().readValue(req.getInputStream(), HashMap.class); + Map requestMap = new ObjectMapper().readValue(req.getInputStream(), HashMap.class); UserQueryBo userQueryBo = new UserQueryBo() .setUsername(requestMap.get(ConstantCode.USERNAME)) .setPassword(requestMap.get(ConstantCode.PASSWORD)); @@ -73,9 +78,9 @@ public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { userQueryBo.getPassword(), new ArrayList<>()) ); - }catch (AuthenticationException e) { + } catch (AuthenticationException e) { try { - customAuthenticationFailureHandler.onAuthenticationFailure(req,res,e); + customAuthenticationFailureHandler.onAuthenticationFailure(req, res, e); } catch (IOException ex) { log.error("IOException:", ex); } catch (ServletException ex) { @@ -101,6 +106,7 @@ public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { /** * 认证成功(用户成功登录后,这个方法会被调用,我们在这个方法里生成token) + * * @param request * @param response * @param chain @@ -122,26 +128,26 @@ public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { for (GrantedAuthority grantedAuthority : authorities) { roleList.add(grantedAuthority.getAuthority()); } - + // 生成token start Calendar calendar = Calendar.getInstance(); Date now = calendar.getTime(); // 设置签发时间 calendar.setTime(new Date()); // 设置过期时间 - calendar.add(Calendar.MINUTE, expirationTime);// 5分钟 + calendar.add(Calendar.SECOND, micaiPlatformTokenConfig.getTimeout()); Date time = calendar.getTime(); String rolesStr = JSON.toJSONString(roleList); token = Jwts.builder() .setSubject(auth.getName() + "-" + rolesStr) .setIssuedAt(now)//签发时间 .setExpiration(time)//过期时间 - .signWith(SignatureAlgorithm.HS512, signKey) //采用什么算法是可以自己选择的,不一定非要采用HS512 + .signWith(SignatureAlgorithm.HS512, micaiPlatformTokenConfig.getSignKey()) //采用什么算法是可以自己选择的,不一定非要采用HS512 .compact(); // 生成token end // 登录成功后,返回token到body里面 Map resultMap = new HashMap<>(); - resultMap.put(ConstantCode.AUTHORIZATION, ConstantCode.HEADER_BEARER + token); + resultMap.put(micaiPlatformTokenConfig.getTokenName(), micaiPlatformTokenConfig.getTokenPrefix() + " " + token); Result result = new Result(ConstantEnum.SUCCESS, resultMap); response.setContentType(ConstantCode.CONTENT_TYPE_JSON); response.setStatus(HttpServletResponse.SC_OK); @@ -150,7 +156,7 @@ public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { writer.flush(); writer.close(); } catch (Exception e) { - log.error("successfulAuthentication error:{}",e.toString()); + log.error("successfulAuthentication error:{}", e.toString()); } } diff --git a/platform-auth-server/src/main/resources/application-dev.yml b/platform-auth-server/src/main/resources/application-dev.yml index 4d1326a..06768b5 100644 --- a/platform-auth-server/src/main/resources/application-dev.yml +++ b/platform-auth-server/src/main/resources/application-dev.yml @@ -18,3 +18,23 @@ jwt: #jwt 过期时间 expiration: time: 15 + +micai-platform-auth: + #jwt相关配置 + token: + #sign key + sign-key: micai-security-@Jwt!&Secret^# + #jwt 过期时间 单位:分钟 + timeout: 60 + # token名称 + token-name: Authorization + # token前缀 + token-prefix: Bearer + + oauth-auth: + #sign key + sign-key: micai-oauth2-@Jwt!&Secret^# + #oauth 过期时间 单位:分钟 + token-timeout: 60 + #刷新token + refresh-timeout: 60 diff --git a/platform-auth-server/src/main/resources/application.yml b/platform-auth-server/src/main/resources/application.yml index f57047c..99f2ad1 100644 --- a/platform-auth-server/src/main/resources/application.yml +++ b/platform-auth-server/src/main/resources/application.yml @@ -21,9 +21,3 @@ mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - -#jwt config -jwt: - header: Authorization - secret: NDU0NTY4amhmc3NkeHp6eGNxdzIlMjFAJTIxQCUyM2ZmNQ== - expiration: 7200000 diff --git a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformOauthConfig.java b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformOauthConfig.java new file mode 100644 index 0000000..4e199a3 --- /dev/null +++ b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformOauthConfig.java @@ -0,0 +1,35 @@ +package org.micai.platform.common.base.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @Author liuCong + * @Date 2022/12/13 上午 9:38 + * @ClassName MicaiPlatformAuthConfig + * @Description + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "micai-platform-auth.oauth-auth") +public class MicaiPlatformOauthConfig { + + /** JWT*/ + private String signKey; + + /** access_token的长久有效期(单位:分钟) 默认1分钟*/ + private Integer tokenTimeout = 1; + + /** refresh_token的长久有效期(单位:分钟) 默认1分钟*/ + private Integer refreshTimeout = 1; + + public Integer getTokenTimeout() { + return tokenTimeout; + } + + public Integer getRefreshTimeout() { + return refreshTimeout; + } + +} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java new file mode 100644 index 0000000..fdd0c9d --- /dev/null +++ b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java @@ -0,0 +1,21 @@ +package org.micai.platform.common.base.config; + +import lombok.Data; + +import java.util.List; + +/** + * @Author liuCong + * @Date 2022/12/13 下午 2:08 + * @ClassName MicaiPlatformRequestMatcher + * @Description + */ +@Data +public class MicaiPlatformRequestMatcher { + + private List jwtAuth; + private List oauth2Auth; + + + +} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java new file mode 100644 index 0000000..c3b3268 --- /dev/null +++ b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java @@ -0,0 +1,23 @@ +package org.micai.platform.common.base.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @Author liuCong + * @Date 2022/12/13 上午 9:38 + * @ClassName MicaiPlatformAuthConfig + * @Description + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "micai-platform-auth.oauth-resources") +public class MicaiPlatformResourcesConfig { + + /** JWT*/ + private String signKey; + private String resourceIds; + private MicaiPlatformRequestMatcher requestMatcher; + +} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformTokenConfig.java b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformTokenConfig.java new file mode 100644 index 0000000..4386710 --- /dev/null +++ b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformTokenConfig.java @@ -0,0 +1,31 @@ +package org.micai.platform.common.base.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @Author liuCong + * @Date 2022/12/13 上午 9:38 + * @ClassName MicaiPlatformAuthConfig + * @Description + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "micai-platform-auth.token") +public class MicaiPlatformTokenConfig { + + /** JWT */ + private String signKey; + /** token的长久有效期(单位:分钟) 默认1分钟*/ + private Integer timeout = 1; + /** token名称 (同时也是cookie名称) */ + private String tokenName; + /** token前缀*/ + private String tokenPrefix; + + + public Integer getTimeout() { + return timeout * 60; + } +} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index 7c5b9b0..6d8790b 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -61,7 +61,7 @@ public class GlobalExceptionHandler { } @ExceptionHandler(SignatureException.class) - public Result signatureException(AccessDeniedException e) { + public Result signatureException(SignatureException e) { log.error(e.getMessage(), e); return new Result(ConstantEnum.SIGNATURE_EX); } diff --git a/platform-common/src/main/resources/META-INF/spring.factories b/platform-common/src/main/resources/META-INF/spring.factories index a4bf2f1..de58a04 100644 --- a/platform-common/src/main/resources/META-INF/spring.factories +++ b/platform-common/src/main/resources/META-INF/spring.factories @@ -1,3 +1,6 @@ # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.micai.platform.common.base.WebStarterAutoConfig \ No newline at end of file +org.micai.platform.common.base.WebStarterAutoConfig,\ +org.micai.platform.common.base.config.MicaiPlatformOauthConfig,\ +org.micai.platform.common.base.config.MicaiPlatformTokenConfig,\ +org.micai.platform.common.base.config.MicaiPlatformResourcesConfig \ No newline at end of file diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java deleted file mode 100644 index b11baf9..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/RequestMatcherConfig.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.micai.platform.resourcesserver.config; - -import cn.hutool.core.util.ObjectUtil; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.ArrayList; -import java.util.List; - -/** - * @Author liuCong - * @Date 2022/12/12 下午 2:01 - * @ClassName RequestMatcherConfig - * @Description - */ -@Component -@Slf4j -@ConfigurationProperties(prefix = "request.matcher") -@Data -public class RequestMatcherConfig { - - private List authJwtRequestMatcher = new ArrayList<>(); - - private List authOAuth2RequestMatcher = new ArrayList<>(); - - - private List jwtAuthList; - - private List oauth2AuthList; - - @PostConstruct - public void initMatcher() { - if (ObjectUtil.isNotEmpty(jwtAuthList)) { - for (String jwtAuth : jwtAuthList) { - authJwtRequestMatcher.add(new AntPathRequestMatcher(jwtAuth)); - } - } - - if (ObjectUtil.isNotEmpty(oauth2AuthList)) { - for (String oauth2Auth : oauth2AuthList) { - authOAuth2RequestMatcher.add(new AntPathRequestMatcher(oauth2Auth)); - } - } - log.info("init request matcher list:==========================>>>>>>>>>>>>>>>>> \n" + - "authJwtRequestMatcher:{},authOAuth2RequestMatcher{} " - , authJwtRequestMatcher, authOAuth2RequestMatcher); - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java index db2d2a7..cb7b16e 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java @@ -1,5 +1,7 @@ package org.micai.platform.resourcesserver.config; +import org.micai.platform.common.base.config.MicaiPlatformResourcesConfig; +import org.micai.platform.common.base.config.MicaiPlatformTokenConfig; import org.micai.platform.common.base.constant.ConstantCode; import org.micai.platform.resourcesserver.filter.AuthHeaderFilter; import org.micai.platform.resourcesserver.filter.JWTAuthenticationFilter; @@ -11,7 +13,6 @@ import org.micai.platform.resourcesserver.service.RoleService; import org.micai.platform.resourcesserver.service.UserRoleService; import org.micai.platform.resourcesserver.service.UserService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -55,12 +56,6 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Autowired private JwtTokenStore jwtTokenStore; - @Value("${resource-ids}") - private String resourceIds; - - @Value("${jwt.sign.key}") - private String signKey; - @Autowired private UserService userService; @@ -83,7 +78,10 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { private AuthenticationManager authenticationManager; @Autowired - private RequestMatcherConfig requestMatcherConfig; + private MicaiPlatformResourcesConfig micaiPlatformResourcesConfig; + + @Autowired + private MicaiPlatformTokenConfig micaiPlatformTokenConfig; /** * 配置:设置oauth2验证规则 @@ -94,7 +92,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources - .resourceId(resourceIds)//设置资源id + .resourceId(micaiPlatformResourcesConfig.getResourceIds())//设置资源id .tokenStore(jwtTokenStore) ; } @@ -130,10 +128,10 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { .permitAll(); AuthHeaderFilter authHeaderFilter = new AuthHeaderFilter(); - authHeaderFilter.setAuthHeaderRequestMatcher(requestMatcherConfig.getAuthJwtRequestMatcher(), requestMatcherConfig.getAuthOAuth2RequestMatcher()); + authHeaderFilter.setAuthHeaderRequestMatcher(micaiPlatformResourcesConfig.getRequestMatcher().getJwtAuth(), micaiPlatformResourcesConfig.getRequestMatcher().getOauth2Auth()); //为什么要在after //因为OAuth2AuthenticationProcessingFilter.doFilter()包含了SecurityContextHolder.clearContext(); - http.addFilterAfter(new JWTAuthenticationFilter(authenticationManager,signKey), AbstractPreAuthenticatedProcessingFilter.class); + http.addFilterAfter(new JWTAuthenticationFilter(authenticationManager,micaiPlatformTokenConfig), AbstractPreAuthenticatedProcessingFilter.class); http.addFilterAfter(authHeaderFilter, X509AuthenticationFilter.class); // 使用自定义身份验证组件 http.authenticationProvider(new CustomAuthenticationProvider(userService, bCryptPasswordEncoder,userRoleService, diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java index 7b0bbcd..af7b49a 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/TokenConfig.java @@ -1,5 +1,7 @@ package org.micai.platform.resourcesserver.config; +import org.micai.platform.common.base.config.MicaiPlatformResourcesConfig; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; @@ -16,7 +18,8 @@ public class TokenConfig { // jwt模式token - private static final String SIGN_KEY = "2728689210118790161"; + @Autowired + private MicaiPlatformResourcesConfig micaiPlatformResourcesConfig; @Bean public JwtTokenStore jwtTokenStore(){ @@ -35,7 +38,7 @@ public class TokenConfig { @Bean public JwtAccessTokenConverter jwtAccessTokenConverter(){ JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); - converter.setSigningKey(SIGN_KEY); + converter.setSigningKey(micaiPlatformResourcesConfig.getSignKey()); return converter; } } diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java index 9fa2360..32012ef 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java @@ -1,6 +1,7 @@ package org.micai.platform.resourcesserver.filter; import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; import org.micai.platform.common.base.constant.ConstantCode; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.util.Assert; @@ -13,6 +14,7 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.IOException; +import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Vector; @@ -23,19 +25,33 @@ import java.util.Vector; * @ClassName AuthHeaderFilter * @Description */ +@Slf4j public class AuthHeaderFilter implements Filter { //拦截接口让JWTAuthenticationFilter去验证 - private List authJwtRequestMatcher; + private final List authJwtRequestMatcher = new ArrayList<>(); //拦截接口让OAuth2AuthenticationProcessingFilter去验证 - private List authOAuth2RequestMatcher; + private final List authOAuth2RequestMatcher = new ArrayList<>(); - public void setAuthHeaderRequestMatcher(List authJwtRequestMatcher, List authOAuth2RequestMatcher) { + public void setAuthHeaderRequestMatcher(List jwtAuthList, List oauth2AuthList) { Assert.notNull(authJwtRequestMatcher, "authJwtRequestMatcher cannot be null"); Assert.notNull(authOAuth2RequestMatcher, "authOAuth2RequestMatcher cannot be null"); - this.authJwtRequestMatcher = authJwtRequestMatcher; - this.authOAuth2RequestMatcher = authOAuth2RequestMatcher; + + if (ObjectUtil.isNotEmpty(jwtAuthList)) { + for (String jwtAuth : jwtAuthList) { + authJwtRequestMatcher.add(new AntPathRequestMatcher(jwtAuth)); + } + } + + if (ObjectUtil.isNotEmpty(oauth2AuthList)) { + for (String oauth2Auth : oauth2AuthList) { + authOAuth2RequestMatcher.add(new AntPathRequestMatcher(oauth2Auth)); + } + } + log.info("init request matcher list:==========================>>>>>>>>>>>>>>>>> \n" + + "authJwtRequestMatcher:{},authOAuth2RequestMatcher{} " + , authJwtRequestMatcher, authOAuth2RequestMatcher); } @Override diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java index 5e80b66..aecfc42 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/JWTAuthenticationFilter.java @@ -10,6 +10,7 @@ import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureException; import io.jsonwebtoken.UnsupportedJwtException; import lombok.extern.slf4j.Slf4j; +import org.micai.platform.common.base.config.MicaiPlatformTokenConfig; import org.micai.platform.common.base.constant.ConstantCode; import org.micai.platform.common.base.constant.ConstantEnum; import org.micai.platform.common.base.exception.PlatformException; @@ -40,17 +41,17 @@ import java.util.List; @Slf4j public class JWTAuthenticationFilter extends BasicAuthenticationFilter { - private final String signKey; + private final MicaiPlatformTokenConfig micaiPlatformTokenConfig; - public JWTAuthenticationFilter(AuthenticationManager authenticationManager, String signKey) { + public JWTAuthenticationFilter(AuthenticationManager authenticationManager, MicaiPlatformTokenConfig micaiPlatformTokenConfig) { super(authenticationManager); - this.signKey = signKey; + this.micaiPlatformTokenConfig = micaiPlatformTokenConfig; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { - String header = request.getHeader(ConstantCode.AUTHORIZATION); - if (ObjectUtil.isEmpty(header) || !header.startsWith(ConstantCode.HEADER_BEARER)) { + String header = request.getHeader(micaiPlatformTokenConfig.getTokenName()); + if (ObjectUtil.isEmpty(header) || !header.startsWith(micaiPlatformTokenConfig.getTokenPrefix())) { chain.doFilter(request, response); return; } @@ -62,13 +63,16 @@ public class JWTAuthenticationFilter extends BasicAuthenticationFilter { private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { long start = System.currentTimeMillis(); - String token = request.getHeader(ConstantCode.AUTHORIZATION); + String token = request.getHeader(micaiPlatformTokenConfig.getTokenName()); if (ObjectUtil.isEmpty(token)) { throw new PlatformException(ConstantEnum.TOKEN_MISS); } // parse the token. String user = null; - Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token.replace(ConstantCode.HEADER_BEARER, "")).getBody(); + Claims claims = Jwts.parser() + .setSigningKey(micaiPlatformTokenConfig.getSignKey()) + .parseClaimsJws(token.replace(micaiPlatformTokenConfig.getTokenPrefix(), "")) + .getBody(); log.info("相关信息 : {}",claims.getSubject()); // token签发时间 long issuedAt = claims.getIssuedAt().getTime(); @@ -94,7 +98,7 @@ public class JWTAuthenticationFilter extends BasicAuthenticationFilter { .setSubject(claims.getSubject()) .setIssuedAt(now)//签发时间 .setExpiration(time)//过期时间 - .signWith(SignatureAlgorithm.HS512, signKey) //采用什么算法是可以自己选择的,不一定非要采用HS512 + .signWith(SignatureAlgorithm.HS512, micaiPlatformTokenConfig.getSignKey()) //采用什么算法是可以自己选择的,不一定非要采用HS512 .compact(); // 重新生成token end @@ -102,7 +106,7 @@ public class JWTAuthenticationFilter extends BasicAuthenticationFilter { response.addHeader(ConstantCode.REFRESH_TOKEN, refreshToken); } long end = System.currentTimeMillis(); - logger.info("执行时间: " + (end - start) + " 毫秒"); + log.info("执行时间: " + (end - start) + " 毫秒"); user = claims.getSubject(); if (ObjectUtil.isNotEmpty(user)) { String authStr = user.split("-")[ConstantCode.INT_TWO]; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/JwtHelper.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/JwtHelper.java index a0fd9c0..cc37c4d 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/JwtHelper.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/JwtHelper.java @@ -1,106 +1,106 @@ -package org.micai.platform.resourcesserver.utils; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.JwtBuilder; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import org.springframework.beans.factory.annotation.Value; - -import javax.crypto.spec.SecretKeySpec; -import javax.xml.bind.DatatypeConverter; -import java.security.Key; -import java.util.Date; - -/** - * @FileName: JwtHelper - * @Author: zhaoxinguo - * @Date: 2018/12/10 19:39 - * @Description: 实现Jwt - */ -public class JwtHelper { - - //token超时时间 - @Value("${jwt.expiration}") - public long expiration; - - //生成token的秘钥 - @Value("${jwt.secret}") - public String base64Security; - - /** - * 解析token - * @param jsonWebToken - * @return - */ - public Claims parseToken(String jsonWebToken) { - Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(base64Security)).parseClaimsJws(jsonWebToken).getBody(); - return claims; - } - - /** - * 新建token - * @param audience - * @param issuer - * @return - */ - public String createToken(String audience, String issuer) { - SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; - - long nowMillis = System.currentTimeMillis(); - Date now = new Date(nowMillis); - - // 生成签名密钥 - byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security); - Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); - - // 添加构成JWT的参数 - JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT").setIssuer(issuer).setAudience(audience) - .signWith(signatureAlgorithm, signingKey); - - // 添加Token签发时间 - builder.setIssuedAt(now); - // 添加Token过期时间 - if (expiration >= 0) { - long expMillis = nowMillis + expiration; - Date exp = new Date(expMillis); - builder.setExpiration(exp).setNotBefore(now); - } - - // 生成JWT - return builder.compact(); - } - - /** - * 刷新令牌 - * - * @param claims - * @return - */ - public String refreshToken(Claims claims) { - SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; - - long nowMillis = System.currentTimeMillis(); - Date now = new Date(nowMillis); - - // 生成签名密钥 - byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security); - Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); - - // 添加构成JWT的参数 - JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT") - .setIssuer((String) claims.get("iss")).setAudience((String) claims.get("aud")) - .signWith(signatureAlgorithm, signingKey); - - // 添加Token签发时间 - builder.setIssuedAt(now); - // 添加Token过期时间 - if (expiration >= 0) { - long expMillis = nowMillis + expiration; - Date exp = new Date(expMillis); - builder.setExpiration(exp).setNotBefore(now); - } - - // 生成Token - return builder.compact(); - } -} +//package org.micai.platform.resourcesserver.utils; +// +//import io.jsonwebtoken.Claims; +//import io.jsonwebtoken.JwtBuilder; +//import io.jsonwebtoken.Jwts; +//import io.jsonwebtoken.SignatureAlgorithm; +//import org.springframework.beans.factory.annotation.Value; +// +//import javax.crypto.spec.SecretKeySpec; +//import javax.xml.bind.DatatypeConverter; +//import java.security.Key; +//import java.util.Date; +// +///** +// * @FileName: JwtHelper +// * @Author: zhaoxinguo +// * @Date: 2018/12/10 19:39 +// * @Description: 实现Jwt +// */ +//public class JwtHelper { +// +// //token超时时间 +// @Value("${jwt.expiration}") +// public long expiration; +// +// //生成token的秘钥 +// @Value("${jwt.secret}") +// public String base64Security; +// +// /** +// * 解析token +// * @param jsonWebToken +// * @return +// */ +// public Claims parseToken(String jsonWebToken) { +// Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(base64Security)).parseClaimsJws(jsonWebToken).getBody(); +// return claims; +// } +// +// /** +// * 新建token +// * @param audience +// * @param issuer +// * @return +// */ +// public String createToken(String audience, String issuer) { +// SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; +// +// long nowMillis = System.currentTimeMillis(); +// Date now = new Date(nowMillis); +// +// // 生成签名密钥 +// byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security); +// Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); +// +// // 添加构成JWT的参数 +// JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT").setIssuer(issuer).setAudience(audience) +// .signWith(signatureAlgorithm, signingKey); +// +// // 添加Token签发时间 +// builder.setIssuedAt(now); +// // 添加Token过期时间 +// if (expiration >= 0) { +// long expMillis = nowMillis + expiration; +// Date exp = new Date(expMillis); +// builder.setExpiration(exp).setNotBefore(now); +// } +// +// // 生成JWT +// return builder.compact(); +// } +// +// /** +// * 刷新令牌 +// * +// * @param claims +// * @return +// */ +// public String refreshToken(Claims claims) { +// SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; +// +// long nowMillis = System.currentTimeMillis(); +// Date now = new Date(nowMillis); +// +// // 生成签名密钥 +// byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security); +// Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); +// +// // 添加构成JWT的参数 +// JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT") +// .setIssuer((String) claims.get("iss")).setAudience((String) claims.get("aud")) +// .signWith(signatureAlgorithm, signingKey); +// +// // 添加Token签发时间 +// builder.setIssuedAt(now); +// // 添加Token过期时间 +// if (expiration >= 0) { +// long expMillis = nowMillis + expiration; +// Date exp = new Date(expMillis); +// builder.setExpiration(exp).setNotBefore(now); +// } +// +// // 生成Token +// return builder.compact(); +// } +//} diff --git a/platform-resources-server/src/main/resources/application-dev.yml b/platform-resources-server/src/main/resources/application-dev.yml index 0dcb455..047f682 100644 --- a/platform-resources-server/src/main/resources/application-dev.yml +++ b/platform-resources-server/src/main/resources/application-dev.yml @@ -10,21 +10,28 @@ spring: username: root password: ly1218 -#jwt相关配置 -jwt: - #sign key - sign: - key: spring-security-@Jwt!&Secret^# - #jwt 过期时间 - expiration: - time: 15 +micai-platform-auth: + #jwt相关配置 + token: + #sign key + sign-key: micai-security-@Jwt!&Secret^# + #jwt 过期时间 单位:分钟 + timeout: 60 + # token名称 + token-name: Authorization + # token前缀 + token-prefix: Bearer -resource-ids: user - -request: - matcher: - jwtAuthList: - - /user/info - - /user/list - oauth2AuthList: - - /demo + oauth-resources: + #sign key + sign-key: micai-oauth2-@Jwt!&Secret^# + #资源id + resource-ids: resources-server + #过滤器匹配路径 可以使用** + request-matcher: + jwt-auth: + - /user/info + - /user/list + oauth2-auth: + - /demo + - /user/list111 diff --git a/platform-resources-server/src/main/resources/application.yml b/platform-resources-server/src/main/resources/application.yml index 7d53115..9111316 100644 --- a/platform-resources-server/src/main/resources/application.yml +++ b/platform-resources-server/src/main/resources/application.yml @@ -22,12 +22,6 @@ mybatis-plus: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl -#jwt config -jwt: - header: Authorization - secret: NDU0NTY4amhmc3NkeHp6eGNxdzIlMjFAJTIxQCUyM2ZmNQ== - expiration: 7200000 - site: location: ${user.dir} options: -- Gitee From 755b4617cd241e462b78a0c692b17ee386bdc64c Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 13 Dec 2022 16:46:12 +0800 Subject: [PATCH 07/16] =?UTF-8?q?=E4=BF=AE=E6=94=B9SignatureException?= =?UTF-8?q?=E7=9A=84=E5=8C=85import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/controller/ExceptionController.java | 2 +- .../exception/GlobalExceptionHandler.java | 6 ---- .../config/ResourceServerConfig.java | 2 ++ .../CustomAuthenticationFailureHandler.java | 34 ------------------- 4 files changed, 3 insertions(+), 41 deletions(-) delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java diff --git a/platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java b/platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java index 1b3ccc1..73c6e77 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/controller/ExceptionController.java @@ -2,12 +2,12 @@ package org.micai.platform.common.base.controller; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.SignatureException; import io.jsonwebtoken.UnsupportedJwtException; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; -import java.security.SignatureException; /** * @Author liuCong diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index 6d8790b..b231c2e 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -97,10 +97,4 @@ public class GlobalExceptionHandler { String message = exception.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); return new Result(ConstantEnum.FAIL,message); } - - @ExceptionHandler(value = Exception.class) - public Result exception(Exception e) { - log.error(e.getMessage(), e); - return new Result(ConstantEnum.FAIL); - } } diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java index cb7b16e..621aa10 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java @@ -50,6 +50,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { "/webjars/**", "/doc.html", + "/exception/**", + // other public endpoints of your API may be appended to this array }; diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java deleted file mode 100644 index 25cc053..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/handler/CustomAuthenticationFailureHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.micai.platform.resourcesserver.handler; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.micai.platform.common.base.constant.ConstantCode; -import org.micai.platform.common.base.result.Result; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; -import org.springframework.stereotype.Component; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * @Author liuCong - * @Date 2022/1/4 17:20 - * @ClassName CustomAuthenticationFailureHandler - * @Description - */ -@Component -public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { - @Override - public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType(ConstantCode.CONTENT_TYPE_JSON); - Result result = new Result(HttpServletResponse.SC_UNAUTHORIZED,exception.getMessage()); - PrintWriter out = response.getWriter(); - out.write(new ObjectMapper().writeValueAsString(result)); - out.flush(); - out.close(); - } -} -- Gitee From dfd8a2a6fd856448e7f3dc96c2a21cb8eecaaaab Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 13 Dec 2022 16:46:59 +0800 Subject: [PATCH 08/16] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=94=BE=E5=BC=80=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/resourcesserver/config/ResourceServerConfig.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java index 621aa10..cb7b16e 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java @@ -50,8 +50,6 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { "/webjars/**", "/doc.html", - "/exception/**", - // other public endpoints of your API may be appended to this array }; -- Gitee From 11396f7ee1d3bb60fffd8246dffcfadabe041792 Mon Sep 17 00:00:00 2001 From: liucong Date: Sat, 17 Dec 2022 12:16:05 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E5=BC=83=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81-=E6=94=B9=E7=94=A8=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthorizationServerConfiguration.java | 13 +---- .../handler/AuthApprovalHandler.java | 51 ------------------- .../src/main/resources/application-dev.yml | 4 -- 3 files changed, 1 insertion(+), 67 deletions(-) delete mode 100644 platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java index bc8c96c..2f8a121 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/AuthorizationServerConfiguration.java @@ -1,6 +1,5 @@ package org.micai.platform.authserver.config; -import org.micai.platform.authserver.handler.AuthApprovalHandler; import org.micai.platform.common.base.config.MicaiPlatformOauthConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -15,7 +14,6 @@ import org.springframework.security.oauth2.config.annotation.web.configurers.Aut import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices; import org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices; -import org.springframework.security.oauth2.provider.token.DefaultTokenServices; import org.springframework.security.oauth2.provider.token.TokenEnhancer; import org.springframework.security.oauth2.provider.token.TokenEnhancerChain; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; @@ -83,7 +81,7 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu // 授权码使用 .authorizationCodeServices(jdbcAuthorizationCodeServices()) //实现自动授权 不需要用户点击授权 - .userApprovalHandler(new AuthApprovalHandler()) +// .userApprovalHandler(new AuthApprovalHandler()) ; if (jwtTokenEnhancer != null ){ @@ -95,15 +93,6 @@ public class AuthorizationServerConfiguration extends AuthorizationServerConfigu enhancerChain.setTokenEnhancers(enhancers); endpoints.tokenEnhancer(enhancerChain); } - - DefaultTokenServices tokenServices = new DefaultTokenServices(); - tokenServices.setTokenStore(endpoints.getTokenStore()); - tokenServices.setSupportRefreshToken(true); - tokenServices.setClientDetailsService(endpoints.getClientDetailsService()); - tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer()); - tokenServices.setAccessTokenValiditySeconds(micaiPlatformOauthConfig.getTokenTimeout()); - tokenServices.setRefreshTokenValiditySeconds(micaiPlatformOauthConfig.getRefreshTimeout()); - endpoints.tokenServices(tokenServices); } /** diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java deleted file mode 100644 index 2d3143b..0000000 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/handler/AuthApprovalHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.micai.platform.authserver.handler; - -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.approval.UserApprovalHandler; - -import java.util.HashMap; -import java.util.Map; - -/** - * @Author liuCong - * @Date 2022/12/6 下午 3:32 - * @ClassName AuthApprovalHandler - * @Description - */ -public class AuthApprovalHandler implements UserApprovalHandler { - - private String approvalParameter = "user_oauth_approval"; - /** - * 被批准 默认是false 需要手动授权 - * - * @param authorizationRequest 授权请求 - * @param authentication 身份验证 - * @return boolean - */ - @Override - public boolean isApproved(AuthorizationRequest authorizationRequest, Authentication authentication) { - return true; - } - - @Override - public AuthorizationRequest checkForPreApproval(AuthorizationRequest authorizationRequest, Authentication authentication) { - return authorizationRequest; - } - - @Override - public AuthorizationRequest updateAfterApproval(AuthorizationRequest authorizationRequest, Authentication authentication) { - Map approvalParameters = authorizationRequest.getApprovalParameters(); - String flag = (String)approvalParameters.get(this.approvalParameter); - boolean approved = flag != null && flag.toLowerCase().equals("true"); - authorizationRequest.setApproved(approved); - return authorizationRequest; - } - - @Override - public Map getUserApprovalRequest(AuthorizationRequest authorizationRequest, Authentication authentication) { - Map model = new HashMap(); - model.putAll(authorizationRequest.getRequestParameters()); - return model; - } -} diff --git a/platform-auth-server/src/main/resources/application-dev.yml b/platform-auth-server/src/main/resources/application-dev.yml index 06768b5..477da8a 100644 --- a/platform-auth-server/src/main/resources/application-dev.yml +++ b/platform-auth-server/src/main/resources/application-dev.yml @@ -34,7 +34,3 @@ micai-platform-auth: oauth-auth: #sign key sign-key: micai-oauth2-@Jwt!&Secret^# - #oauth 过期时间 单位:分钟 - token-timeout: 60 - #刷新token - refresh-timeout: 60 -- Gitee From 990c0c59a80f187f2da2fc1d835d554935ddc431 Mon Sep 17 00:00:00 2001 From: liucong Date: Mon, 26 Dec 2022 15:18:29 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platform-auth-server/pom.xml | 44 +++ platform-common/pom.xml | 10 +- .../exception/GlobalExceptionHandler.java | 7 - platform-resources-server/pom.xml | 94 ++++++ .../resourcesserver/config/SwaggerConfig.java | 2 - pom.xml | 286 ++++++++++-------- 6 files changed, 314 insertions(+), 129 deletions(-) diff --git a/platform-auth-server/pom.xml b/platform-auth-server/pom.xml index 0f1bc6c..91b39b7 100644 --- a/platform-auth-server/pom.xml +++ b/platform-auth-server/pom.xml @@ -23,6 +23,50 @@ platform-common 0.0.1-SNAPSHOT + + + + + com.baomidou + mybatis-plus-boot-starter + + + + mysql + mysql-connector-java + + + + com.alibaba + fastjson + + + + org.apache.commons + commons-io + + + org.apache.commons + commons-text + + + + org.slf4j + slf4j-api + + + + + com.github.xiaoymin + + knife4j-spring-boot-starter + + + + + org.projectlombok + lombok + \ No newline at end of file diff --git a/platform-common/pom.xml b/platform-common/pom.xml index 53f791d..b94f33d 100644 --- a/platform-common/pom.xml +++ b/platform-common/pom.xml @@ -15,7 +15,6 @@ 8 8 UTF-8 - 5.7.16 @@ -23,8 +22,15 @@ cn.hutool hutool-all - ${hutool.version} + + + + + org.projectlombok + lombok + + \ No newline at end of file diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index b231c2e..1d70755 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -8,7 +8,6 @@ import lombok.extern.slf4j.Slf4j; import org.micai.platform.common.base.constant.ConstantEnum; import org.micai.platform.common.base.result.Result; import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.dao.DuplicateKeyException; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -36,12 +35,6 @@ public class GlobalExceptionHandler { return new Result(ConstantEnum.NOT_FOUND); } - @ExceptionHandler(DuplicateKeyException.class) - public Result handleDuplicateKeyException(DuplicateKeyException e){ - log.error(e.getMessage(), e); - return new Result(ConstantEnum.DUPLICATE_KEY); - } - @ExceptionHandler(ConnectException.class) public Result connectException(ConnectException e){ log.error(e.getMessage(), e); diff --git a/platform-resources-server/pom.xml b/platform-resources-server/pom.xml index 0ad5c86..bc76206 100644 --- a/platform-resources-server/pom.xml +++ b/platform-resources-server/pom.xml @@ -24,5 +24,99 @@ platform-common 0.0.1-SNAPSHOT + + + + com.baomidou + mybatis-plus-boot-starter + + + + mysql + mysql-connector-java + + + + + com.alibaba + fastjson + + + + com.baomidou + mybatis-plus-generator + + + org.apache.velocity + velocity-engine-core + + + + org.apache.commons + commons-io + + + org.apache.commons + commons-text + + + + com.itextpdf + itextpdf + + + com.itextpdf + itext-asian + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + net.coobird + thumbnailator + + + + com.upyun + java-sdk + + + + com.aliyun.oss + aliyun-sdk-oss + + + + com.qiniu + qiniu-java-sdk + + + + org.slf4j + slf4j-api + + + + + com.github.xiaoymin + + knife4j-spring-boot-starter + + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-validation + diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java index e0cac6e..f61b54f 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SwaggerConfig.java @@ -1,6 +1,5 @@ package org.micai.platform.resourcesserver.config; -import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.RequestMethod; @@ -30,7 +29,6 @@ import static cn.hutool.core.collection.CollUtil.newArrayList; */ @Configuration @EnableSwagger2 -@EnableSwaggerBootstrapUI public class SwaggerConfig { // 设置默认TOKEN,方便测试 diff --git a/pom.xml b/pom.xml index d442899..9eab1b2 100644 --- a/pom.xml +++ b/pom.xml @@ -43,9 +43,15 @@ 2.0 1.7.30 2.2.6.RELEASE + 2.0.9 + 1.18.24 + 2.6.6 + 5.7.16 + 2.7.5 - - + + + org.springframework.boot spring-boot-starter @@ -60,137 +66,181 @@ org.springframework.boot spring-boot-starter-web - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus-boot-starter.version} - - - - mysql - mysql-connector-java - ${mysql.version} - - - - org.springframework.boot - spring-boot-starter-security - + io.jsonwebtoken jjwt - ${jjwt.version} - - - - com.alibaba - fastjson - ${fastjson.version} - - - - io.springfox - springfox-swagger2 - ${springfox-swagger2.version} - - - - org.projectlombok - lombok - - - com.baomidou - mybatis-plus-generator - ${mybatis-plus-generator.version} - - - org.apache.velocity - velocity-engine-core - ${velocity-engine-core.version} - - - org.springframework.boot - spring-boot-starter-validation - - - com.github.xiaoymin - swagger-bootstrap-ui - ${swagger-bootstrap-ui.version} - - - org.apache.commons - commons-io - ${commons.io} - - - org.apache.commons - commons-text - ${commons.text} - - - - com.itextpdf - itextpdf - ${commons.itextpdf} - - - com.itextpdf - itext-asian - ${commons.itext-asian} - - - org.apache.poi - poi - ${poi.version} - - - org.apache.poi - poi-ooxml - ${poi-ooxml.version} - - - net.coobird - thumbnailator - ${coobird.thumbnailator} - - - - com.upyun - java-sdk - ${upyun.sdk.version} - - - - com.aliyun.oss - aliyun-sdk-oss - ${aliyun.sdk.version} - - - - com.qiniu - qiniu-java-sdk - ${qiniu.sdk.version} + org.springframework.boot - spring-boot-devtools - true + spring-boot-starter-security org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure - ${oauth2.version} - - - org.slf4j - slf4j-api - ${slf4j-api.version} + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus-boot-starter.version} + + + + mysql + mysql-connector-java + ${mysql.version} + + + + org.springframework.boot + spring-boot-starter-security + ${security.version} + + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + io.springfox + springfox-swagger2 + ${springfox-swagger2.version} + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + + org.apache.velocity + velocity-engine-core + ${velocity-engine-core.version} + + + org.springframework.boot + spring-boot-starter-validation + ${validation.version} + + + com.github.xiaoymin + swagger-bootstrap-ui + ${swagger-bootstrap-ui.version} + + + org.apache.commons + commons-io + ${commons.io} + + + org.apache.commons + commons-text + ${commons.text} + + + + com.itextpdf + itextpdf + ${commons.itextpdf} + + + com.itextpdf + itext-asian + ${commons.itext-asian} + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi-ooxml.version} + + + net.coobird + thumbnailator + ${coobird.thumbnailator} + + + + com.upyun + java-sdk + ${upyun.sdk.version} + + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.sdk.version} + + + + com.qiniu + qiniu-java-sdk + ${qiniu.sdk.version} + + + org.springframework.boot + spring-boot-devtools + true + + + + org.springframework.security.oauth.boot + spring-security-oauth2-autoconfigure + ${oauth2.version} + + + org.slf4j + slf4j-api + ${slf4j-api.version} + + + + + com.github.xiaoymin + + knife4j-spring-boot-starter + ${knife4j.version} + + + + + cn.hutool + hutool-all + ${hutool.version} + + + + + -- Gitee From d9fdeb49b5a1debdb0c453e6cc7847e10cb7a6df Mon Sep 17 00:00:00 2001 From: liucong Date: Mon, 26 Dec 2022 15:56:21 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84sql?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/micai_platform.sql | 174 +++++++------------------------------ pom.xml | 6 -- 2 files changed, 29 insertions(+), 151 deletions(-) diff --git a/doc/sql/micai_platform.sql b/doc/sql/micai_platform.sql index 2157441..5263838 100644 --- a/doc/sql/micai_platform.sql +++ b/doc/sql/micai_platform.sql @@ -11,35 +11,44 @@ Target Server Version : 50736 File Encoding : 65001 - Date: 14/01/2022 10:44:34 + Date: 26/12/2022 15:51:51 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- --- Table structure for tb_organ_info +-- Table structure for oauth_client_details -- ---------------------------- -DROP TABLE IF EXISTS `tb_organ_info`; -CREATE TABLE `tb_organ_info` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '机构编码', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '机构名称', - `type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '机构类型', - `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父类id', - `sn` int(10) NULL DEFAULT NULL COMMENT '排序', - `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_user_id` bigint(20) NULL DEFAULT NULL COMMENT '修改人', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', - `status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态 默认01 启用', - `version` bigint(20) NULL DEFAULT 0 COMMENT '版本号', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; +DROP TABLE IF EXISTS `oauth_client_details`; +CREATE TABLE `oauth_client_details` ( + `client_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `resource_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `client_secret` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `scope` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `authorities` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `access_token_validity` int(11) NULL DEFAULT NULL, + `refresh_token_validity` int(11) NULL DEFAULT NULL, + `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `autoapprove` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`client_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of tb_organ_info +-- Records of oauth_client_details -- ---------------------------- +INSERT INTO `oauth_client_details` VALUES ('pc', 'resources-server', '$2a$10$XyKNPWArxeVGjOKFF.pF7ONmv9NMAN5Bkkiwy8MutFTUKXhHFv.zC', 'pc', 'authorization_code,password,refresh_token', 'http://www.baidu.com/', 'info,sys:user:List', NULL, NULL, NULL, 'true'); + +-- ---------------------------- +-- Table structure for oauth_code +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_code`; +CREATE TABLE `oauth_code` ( + `code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `authentication` blob NULL +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Table structure for tb_organ_user @@ -108,41 +117,6 @@ INSERT INTO `tb_permission` VALUES (24, 'sys:userRole:update', '更新用户角 INSERT INTO `tb_permission` VALUES (25, 'sys:userRole:save', '新增用户角色', '新增用户角色', '01', 1, '2022-01-14 10:41:54', 1, '2022-01-14 10:41:54', 0); INSERT INTO `tb_permission` VALUES (26, 'sys:userRole:del', '删除用户角色', '删除用户角色', '01', 1, '2022-01-14 10:42:14', 1, '2022-01-14 10:42:14', 0); --- ---------------------------- --- Table structure for tb_permission_menu --- ---------------------------- -DROP TABLE IF EXISTS `tb_permission_menu`; -CREATE TABLE `tb_permission_menu` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `permission_id` bigint(20) NOT NULL COMMENT '权限id', - `menu_id` bigint(20) NOT NULL COMMENT '菜单id', - `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '创建人id', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_user_id` bigint(20) NULL DEFAULT NULL COMMENT '修改用户id', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', - `version` bigint(20) NOT NULL DEFAULT 0 COMMENT '版本号', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of tb_permission_menu --- ---------------------------- -INSERT INTO `tb_permission_menu` VALUES (1, 6, 1, 1, '2022-01-13 17:36:59', 1, '2022-01-13 17:36:59', 0); -INSERT INTO `tb_permission_menu` VALUES (2, 6, 2, 1, '2022-01-13 17:37:06', 1, '2022-01-13 17:37:06', 0); -INSERT INTO `tb_permission_menu` VALUES (3, 6, 3, 1, '2022-01-13 17:37:10', 1, '2022-01-13 17:37:10', 0); -INSERT INTO `tb_permission_menu` VALUES (4, 6, 4, 1, '2022-01-13 17:37:15', 1, '2022-01-13 17:37:15', 0); -INSERT INTO `tb_permission_menu` VALUES (5, 6, 5, 1, '2022-01-13 17:37:18', 1, '2022-01-13 17:37:18', 0); -INSERT INTO `tb_permission_menu` VALUES (6, 6, 6, 1, '2022-01-13 17:37:21', 1, '2022-01-13 17:37:21', 0); -INSERT INTO `tb_permission_menu` VALUES (7, 6, 7, 1, '2022-01-13 17:37:25', 1, '2022-01-13 17:37:25', 0); -INSERT INTO `tb_permission_menu` VALUES (8, 6, 8, 1, '2022-01-13 17:37:28', 1, '2022-01-13 17:37:28', 0); -INSERT INTO `tb_permission_menu` VALUES (9, 6, 9, 1, '2022-01-13 17:37:32', 1, '2022-01-13 17:37:32', 0); -INSERT INTO `tb_permission_menu` VALUES (10, 6, 10, 1, '2022-01-13 17:37:42', 1, '2022-01-13 17:37:42', 0); -INSERT INTO `tb_permission_menu` VALUES (11, 6, 11, 1, '2022-01-13 17:37:46', 1, '2022-01-13 17:37:46', 0); -INSERT INTO `tb_permission_menu` VALUES (12, 6, 12, 1, '2022-01-13 17:37:52', 1, '2022-01-13 17:37:52', 0); -INSERT INTO `tb_permission_menu` VALUES (13, 6, 13, 1, '2022-01-13 17:37:55', 1, '2022-01-13 17:37:55', 0); -INSERT INTO `tb_permission_menu` VALUES (14, 6, 14, 1, '2022-01-13 17:37:59', 1, '2022-01-13 17:37:59', 0); -INSERT INTO `tb_permission_menu` VALUES (15, 6, 15, 1, '2022-01-13 17:38:03', 1, '2022-01-13 17:38:03', 0); - -- ---------------------------- -- Table structure for tb_role -- ---------------------------- @@ -164,7 +138,7 @@ CREATE TABLE `tb_role` ( -- ---------------------------- -- Records of tb_role -- ---------------------------- -INSERT INTO `tb_role` VALUES (1, 'root', '院长', '最高权限', '01', NULL, '2021-12-04 14:12:34', NULL, '2021-12-04 14:12:38', 1); +INSERT INTO `tb_role` VALUES (1, 'ROLE_root', '院长', '最高权限', '01', NULL, '2021-12-04 14:12:34', NULL, '2021-12-04 14:12:38', 1); -- ---------------------------- -- Table structure for tb_role_permission @@ -208,96 +182,6 @@ INSERT INTO `tb_role_permission` VALUES (29, 1, 20, 1, '2022-01-13 16:38:20', 1, INSERT INTO `tb_role_permission` VALUES (30, 1, 21, 1, '2022-01-13 17:36:25', 1, '2022-01-13 17:36:25', 0); INSERT INTO `tb_role_permission` VALUES (31, 1, 22, 1, '2022-01-13 17:36:25', 1, '2022-01-13 17:36:25', 0); INSERT INTO `tb_role_permission` VALUES (32, 1, 23, 1, '2022-01-13 17:36:25', 1, '2022-01-13 17:36:25', 0); - --- ---------------------------- --- Table structure for tb_sys_dict --- ---------------------------- -DROP TABLE IF EXISTS `tb_sys_dict`; -CREATE TABLE `tb_sys_dict` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', - `dict_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段名称', - `dict_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段编码', - `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '创建人id', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_user_id` bigint(20) NULL DEFAULT NULL COMMENT '修改人id', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', - `status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '01' COMMENT '状态: 01 启用 02停用', - `version` bigint(20) NULL DEFAULT 0 COMMENT '版本号', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of tb_sys_dict --- ---------------------------- - --- ---------------------------- --- Table structure for tb_sys_dict_item --- ---------------------------- -DROP TABLE IF EXISTS `tb_sys_dict_item`; -CREATE TABLE `tb_sys_dict_item` ( - `id` bigint(20) NOT NULL COMMENT '主键id', - `dict_id` bigint(20) NULL DEFAULT NULL COMMENT '字典表id', - `item_text` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典项文本', - `item_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典项值', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', - `sn` int(4) NULL DEFAULT NULL COMMENT '排序', - `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `update_user_id` bigint(20) NULL DEFAULT NULL COMMENT '修改人', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', - `status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '01' COMMENT '状态: 01 启用 02停用', - `version` bigint(20) NULL DEFAULT 0 COMMENT '版本号', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of tb_sys_dict_item --- ---------------------------- - --- ---------------------------- --- Table structure for tb_sys_menu --- ---------------------------- -DROP TABLE IF EXISTS `tb_sys_menu`; -CREATE TABLE `tb_sys_menu` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', - `menu_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单编码', - `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单名称', - `system_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务系统标识,区分不同业务系统菜单', - `system_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务系统名称', - `application` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '终端类型,00:平台', - `parent_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父级菜单编码', - `menu_icon` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标', - `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单访问路径', - `open_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单打开类型,1:路由 2:新标签页 3:iframe', - `sn` int(4) NULL DEFAULT NULL COMMENT '序号', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `update_user_id` bigint(20) NULL DEFAULT NULL COMMENT '修改人', - `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', - `status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '01' COMMENT '启用标识 01 启用', - `version` bigint(20) NULL DEFAULT 0 COMMENT '版本号', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of tb_sys_menu --- ---------------------------- -INSERT INTO `tb_sys_menu` VALUES (1, '00', '迷彩平台', '1', '1', '00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (2, '1', '区域管理', '1', '1', '00', '00', NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (3, '2', '日志管理', '1', '1', '00', '00', NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (4, '3', '字典管理', '1', '1', '00', '00', NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (5, '4', '权限管理', '1', '1', '00', '00', NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (6, '5', '菜单管理', '1', '1', '00', '00', NULL, NULL, NULL, 5, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (7, '6', '组织管理', '1', '1', '00', '00', NULL, NULL, NULL, 6, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (8, '7', '角色管理', '1', '1', '00', '00', NULL, NULL, NULL, 7, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (9, '8', '用户管理', '1', '1', '00', '00', NULL, NULL, NULL, 8, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (10, '10', '子菜单-区域管理1', '1', '1', '00', '1', NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (11, '11', '子菜单-区域管理2', '1', '1', '00', '1', NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (12, '12', '子菜单-区域管理3', '1', '1', '00', '1', NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (13, '13', '子菜单-区域管理1-详细1', '1', '1', '00', '10', NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (14, '14', '子菜单-区域管理1-详细2', '1', '1', '00', '10', NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, '01', NULL); -INSERT INTO `tb_sys_menu` VALUES (15, '15', '子菜单-区域管理1-详细3', '1', '1', '00', '10', NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, '01', NULL); - -- ---------------------------- -- Table structure for tb_user -- ---------------------------- diff --git a/pom.xml b/pom.xml index 9eab1b2..1cfbc9f 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,6 @@ 2.8.3 7.2.18 3.4.3.4 - 1.9.2 3.4.0 3.16 3.16 @@ -147,11 +146,6 @@ spring-boot-starter-validation ${validation.version} - - com.github.xiaoymin - swagger-bootstrap-ui - ${swagger-bootstrap-ui.version} - org.apache.commons commons-io -- Gitee From adc3a9a41e27831e4c9dbea0901a074cd8991789 Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 27 Dec 2022 10:26:16 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../authserver/config/JwtTokenEnhancer.java | 3 +- .../micai/platform/common/base/sms/Sms.java | 18 -- .../common/base/sms/impl/AbstractSms.java | 13 -- .../common/base/sms/impl/QiniuSmsImpl.java | 19 --- .../resourcesserver/config/SiteOptions.java | 60 ------- .../controller/BaseController.java | 6 - .../controller/UploadController.java | 110 ------------ .../resourcesserver/storage/Storage.java | 58 ------- .../storage/StorageFactory.java | 45 ----- .../storage/impl/AbstractStorage.java | 100 ----------- .../storage/impl/MinioStorageImpl.java | 23 --- .../storage/impl/NativeStorageImpl.java | 38 ----- .../storage/impl/OssStorageImpl.java | 80 --------- .../storage/impl/QiniuStorageImpl.java | 23 --- .../storage/impl/UpYunStorageImpl.java | 17 -- .../resourcesserver/utils/FileKit.java | 54 ------ .../resourcesserver/utils/FilePathUtils.java | 53 ------ .../resourcesserver/utils/PdfMergeUtils.java | 103 ------------ .../utils/WatermarkOffice.java | 158 ------------------ .../resourcesserver/utils/WatermarkPdf.java | 76 --------- .../resourcesserver/utils/WatermarkUtils.java | 58 ------- 21 files changed, 1 insertion(+), 1114 deletions(-) delete mode 100644 platform-common/src/main/java/org/micai/platform/common/base/sms/Sms.java delete mode 100644 platform-common/src/main/java/org/micai/platform/common/base/sms/impl/AbstractSms.java delete mode 100644 platform-common/src/main/java/org/micai/platform/common/base/sms/impl/QiniuSmsImpl.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SiteOptions.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UploadController.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/Storage.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/StorageFactory.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/AbstractStorage.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/MinioStorageImpl.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/NativeStorageImpl.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/OssStorageImpl.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/QiniuStorageImpl.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/UpYunStorageImpl.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FileKit.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FilePathUtils.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/PdfMergeUtils.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkOffice.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkPdf.java delete mode 100644 platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkUtils.java diff --git a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java index 7767160..dfd7983 100644 --- a/platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java +++ b/platform-auth-server/src/main/java/org/micai/platform/authserver/config/JwtTokenEnhancer.java @@ -33,8 +33,7 @@ public class JwtTokenEnhancer implements TokenEnhancer { public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) { Map info = new HashMap<>(); //自定义的信息 - info.put("com", "liucong"); - info.put("with", "micai"); + info.put("author", "liucong"); ((DefaultOAuth2AccessToken) oAuth2AccessToken).setAdditionalInformation(info); return oAuth2AccessToken; } diff --git a/platform-common/src/main/java/org/micai/platform/common/base/sms/Sms.java b/platform-common/src/main/java/org/micai/platform/common/base/sms/Sms.java deleted file mode 100644 index 4eb175d..0000000 --- a/platform-common/src/main/java/org/micai/platform/common/base/sms/Sms.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.micai.platform.common.base.sms; - -/** - * @Author zhaoxinguo - * @Date 2021-12-10 13:26 - * @ClassName Sms - * @Description 短信发送接口 - */ -public interface Sms { - - /** - * 发送短信 - * @param messageContent 短信内容 - * @param receiveNumber 接收人手机号 - * @return - */ - String sendSms(String messageContent, String receiveNumber); -} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/AbstractSms.java b/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/AbstractSms.java deleted file mode 100644 index 92e18d3..0000000 --- a/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/AbstractSms.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.micai.platform.common.base.sms.impl; - -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.common.base.sms.Sms; - -/** - * 系统短信接口抽象实现类 - */ -@Slf4j -public abstract class AbstractSms implements Sms { - - -} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/QiniuSmsImpl.java b/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/QiniuSmsImpl.java deleted file mode 100644 index 7871dae..0000000 --- a/platform-common/src/main/java/org/micai/platform/common/base/sms/impl/QiniuSmsImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.micai.platform.common.base.sms.impl; - -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.common.base.sms.Sms; -import org.springframework.stereotype.Component; - -/** - * 七牛云-短信接口抽象实现类 - */ -@Slf4j -@Component -public class QiniuSmsImpl extends AbstractSms implements Sms { - - @Override - public String sendSms(String messageContent, String receiveNumber) { - - return null; - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SiteOptions.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SiteOptions.java deleted file mode 100644 index 2594617..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/SiteOptions.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.micai.platform.resourcesserver.config; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author : langhsu - * @version : 1.0 - * @date : 2019/01/18 - */ -@Component -@ConfigurationProperties(prefix = "site") -public class SiteOptions { - - /** - * 运行文件存储路径 - */ - private String location; - - /** - * 属性配置 - */ - private Map options = new HashMap<>(); - - public String getLocation() { - return location; - } - - public void setLocation(String location) { - this.location = location; - } - - public Integer[] getIntegerArrayValue(String key, String separator) { - String value = getValue(key); - String[] array = value.split(separator); - Integer[] ret = new Integer[array.length]; - for (int i = 0; i < array.length; i ++) { - ret[i] = Integer.parseInt(array[i]); - } - return ret; - } - - public Integer getIntegerValue(String key) { - return Integer.parseInt(options.get(key)); - } - - public String getValue(String key) { - String value = options.get(key); - return null != value ? value.trim() : null; - } - - public boolean hasValue(String key) { - return StringUtils.isNotBlank(options.get(key)); - } - -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/BaseController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/BaseController.java index b610148..c80dc65 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/BaseController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/BaseController.java @@ -1,9 +1,7 @@ package org.micai.platform.resourcesserver.controller; import lombok.extern.slf4j.Slf4j; -import org.micai.platform.resourcesserver.config.SiteOptions; import org.micai.platform.resourcesserver.service.UserService; -import org.micai.platform.resourcesserver.storage.StorageFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -28,10 +26,6 @@ public abstract class BaseController { protected UserService userService; @Autowired protected BCryptPasswordEncoder bCryptPasswordEncoder; - @Autowired - protected StorageFactory storageFactory; - @Autowired - protected SiteOptions siteOptions; /** * 获取用户所拥有的权限列表 diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UploadController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UploadController.java deleted file mode 100644 index 3e7dabd..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UploadController.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.micai.platform.resourcesserver.controller; - -import cn.hutool.core.util.ObjectUtil; -import io.swagger.annotations.Api; -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.common.base.constant.ConstantCode; -import org.micai.platform.common.base.constant.ConstantEnum; -import org.micai.platform.common.base.result.UploadResult; -import org.micai.platform.resourcesserver.utils.FileKit; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.ServletRequestUtils; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; - -/** - * 文件上传 - * - */ -@Controller -@RequestMapping("/upload") -@Api(tags = "文件上传", value = "文件上传") -@Slf4j -public class UploadController extends BaseController { - - @PostMapping("/store") - @ResponseBody - public UploadResult store(@RequestParam(value = "file", required = false) MultipartFile file, - HttpServletRequest request){ - // 检查空 - if (ObjectUtil.isEmpty(file)) { - return new UploadResult(ConstantEnum.NO_FILE); - } - - String fileName = file.getOriginalFilename(); - - // 检查类型 - if (!FileKit.checkFileType(fileName)) { - return new UploadResult(ConstantEnum.TYPE); - } - - // 检查大小 - String limitSize = siteOptions.getValue(ConstantCode.STORAGE_LIMIT_SIZE); - if (ObjectUtil.isEmpty(limitSize)) { - limitSize = ConstantCode.STR_TWO; - } - if (file.getSize() > (Long.parseLong(limitSize) * ConstantCode.DING * ConstantCode.DING)) { - return new UploadResult(ConstantEnum.SIZE); - } - - // 保存图片 - try { - String path = storageFactory.get().store(file, ConstantCode.thumbnailPath); - return new UploadResult(ConstantEnum.SUCCESS).setName(fileName).setPath(path).setSize(file.getSize()); - } catch (Exception e) { - log.error("error info:",e); - return new UploadResult(ConstantEnum.UNKNOWN); - } - } - - @PostMapping("/storeScale") - @ResponseBody - public UploadResult storeScale(@RequestParam(value = "file", required = false) MultipartFile file, - HttpServletRequest request) { - String crop = request.getParameter("crop"); - int size = ServletRequestUtils.getIntParameter(request, ConstantCode.SIZE, siteOptions.getIntegerValue(ConstantCode.STORAGE_MAX_WIDTH)); - - // 检查空 - if (ObjectUtil.isEmpty(file)) { - return new UploadResult(ConstantEnum.NO_FILE); - } - - String fileName = file.getOriginalFilename(); - - // 检查类型 - if (!FileKit.checkFileType(fileName)) { - return new UploadResult(ConstantEnum.TYPE); - } - - // 检查大小 - String limitSize = siteOptions.getValue(ConstantCode.STORAGE_LIMIT_SIZE); - if (ObjectUtil.isEmpty(limitSize)) { - limitSize = ConstantCode.STR_TWO; - } - if (file.getSize() > (Long.parseLong(limitSize) * ConstantCode.DING * ConstantCode.DING)) { - return new UploadResult(ConstantEnum.SIZE); - } - - // 保存图片 - try { - String path; - if (ObjectUtil.isEmpty(crop)) { - Integer[] imageSize = siteOptions.getIntegerArrayValue(crop, ConstantCode.SEPARATOR_X); - int width = ServletRequestUtils.getIntParameter(request, ConstantCode.WIDTH, imageSize[ConstantCode.INT_ZERO]); - int height = ServletRequestUtils.getIntParameter(request, ConstantCode.HEIGHT, imageSize[ConstantCode.INT_ONE]); - path = storageFactory.get().storeScale(file, ConstantCode.thumbnailPath, width, height); - } else { - path = storageFactory.get().storeScale(file, ConstantCode.thumbnailPath, size); - } - return new UploadResult(ConstantEnum.SUCCESS).setName(fileName).setPath(path).setSize(file.getSize()); - } catch (Exception e) { - log.error("error info:",e); - return new UploadResult(ConstantEnum.UNKNOWN); - } - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/Storage.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/Storage.java deleted file mode 100644 index 060537e..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/Storage.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.micai.platform.resourcesserver.storage; - -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -/** - * 系统存储接口 - */ -public interface Storage { - - /** - * 存储图片 - * - * @param file - * @param basePath - * @return - * @throws IOException - */ - String store(MultipartFile file, String basePath) throws Exception; - - /** - * 存储压缩图片 - * - * @param file - * @param basePath - * @return - * @throws IOException - */ - String storeScale(MultipartFile file, String basePath, int maxWidth) throws Exception; - - /** - * 存储压缩图片 - * - * @param file - * @param basePath - * @return - * @throws IOException - */ - String storeScale(MultipartFile file, String basePath, int width, int height) throws Exception; - - /** - * 存储路径 - * - * @param storePath - */ - void deleteFile(String storePath); - - /** - * 写入字节到指定的目录文件 - * - * @param bytes - * @param pathAndFileName - * @return - * @throws Exception - */ - String writeToStore(byte[] bytes, String pathAndFileName) throws Exception; -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/StorageFactory.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/StorageFactory.java deleted file mode 100644 index b39278a..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/StorageFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.micai.platform.resourcesserver.storage; - -import org.apache.commons.lang3.StringUtils; -import org.micai.platform.resourcesserver.config.SiteOptions; -import org.micai.platform.resourcesserver.storage.impl.NativeStorageImpl; -import org.micai.platform.resourcesserver.storage.impl.OssStorageImpl; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class StorageFactory implements InitializingBean { - - @Autowired - private ApplicationContext applicationContext; - @Autowired - private SiteOptions siteOptions; - private Map fileRepoMap = new HashMap<>(); - - @Override - public void afterPropertiesSet() throws Exception { - fileRepoMap.put("native", applicationContext.getBean(NativeStorageImpl.class)); - fileRepoMap.put("aliyun", applicationContext.getBean(OssStorageImpl.class)); - } - - public boolean registry(String key, Storage storage) { - if (fileRepoMap.containsKey(key)) { - return false; - } - fileRepoMap.put(key, storage); - return true; - } - - public Storage get() { - String scheme = siteOptions.getValue("storage_scheme"); - if (StringUtils.isBlank(scheme)) { - scheme = "native"; - } - return fileRepoMap.get(scheme); - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/AbstractStorage.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/AbstractStorage.java deleted file mode 100644 index 21718bf..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/AbstractStorage.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.micai.platform.resourcesserver.storage.impl; - -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.common.base.constant.ConstantEnum; -import org.micai.platform.common.base.exception.PlatformException; -import org.micai.platform.resourcesserver.config.SiteOptions; -import org.micai.platform.resourcesserver.storage.Storage; -import org.micai.platform.resourcesserver.utils.FileKit; -import org.micai.platform.resourcesserver.utils.FilePathUtils; -import org.micai.platform.resourcesserver.utils.ImageUtils; -import org.micai.platform.resourcesserver.utils.MD5; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.multipart.MultipartFile; - -/** - * 系统存储接口抽象实现类 - */ -@Slf4j -public abstract class AbstractStorage implements Storage { - - @Autowired - protected SiteOptions siteOptions; - - /** - * 验证文件 - * - * @param file - */ - protected void validateFile(MultipartFile file) { - if (file == null || file.isEmpty()) { - throw new PlatformException(ConstantEnum.NO_FILE); - } - if (!FileKit.checkFileType(file.getOriginalFilename())) { - throw new PlatformException(ConstantEnum.TYPE); - } - } - - /** - * 存储图片 - * @param file - * @param basePath - * @return - * @throws Exception - */ - @Override - public String store(MultipartFile file, String basePath) throws Exception { - validateFile(file); - return writeToStore(file.getBytes(), basePath, file.getOriginalFilename()); - } - - /** - * 存储压缩图片 - * @param file - * @param basePath - * @param maxWidth - * @return - * @throws Exception - */ - @Override - public String storeScale(MultipartFile file, String basePath, int maxWidth) throws Exception { - validateFile(file); - byte[] bytes = ImageUtils.scaleByWidth(file, maxWidth); - return writeToStore(bytes, basePath, file.getOriginalFilename()); - } - - /** - * 存储压缩图片 - * @param file - * @param basePath - * @param width - * @param height - * @return - * @throws Exception - */ - @Override - public String storeScale(MultipartFile file, String basePath, int width, int height) throws Exception { - validateFile(file); - byte[] bytes = ImageUtils.screenshot(file, width, height); - return writeToStore(bytes, basePath, file.getOriginalFilename()); - } - - public String writeToStore(byte[] bytes, String src, String originalFilename) throws Exception { - String md5 = MD5.md5(bytes); - /*Resource resource = resourceRepository.findByMd5(md5); - if (resource != null){ - return resource.getPath(); - }*/ - String path = FilePathUtils.wholePathName(src, originalFilename, md5); - path = writeToStore(bytes, path); - - // 图片入库 - /*resource = new Resource(); - resource.setMd5(md5); - resource.setPath(path); - resource.setCreateTime(LocalDateTime.now()); - resourceRepository.save(resource);*/ - return path; - } - -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/MinioStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/MinioStorageImpl.java deleted file mode 100644 index 475e8a6..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/MinioStorageImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.micai.platform.resourcesserver.storage.impl; - -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.resourcesserver.storage.Storage; -import org.springframework.stereotype.Component; - -/** - * MinIO-存储接口抽象实现类 - */ -@Slf4j -@Component -public class MinioStorageImpl extends AbstractStorage implements Storage { - - @Override - public void deleteFile(String storePath) { - - } - - @Override - public String writeToStore(byte[] bytes, String pathAndFileName) throws Exception { - return null; - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/NativeStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/NativeStorageImpl.java deleted file mode 100644 index 22add12..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/NativeStorageImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.micai.platform.resourcesserver.storage.impl; - -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.resourcesserver.storage.Storage; -import org.micai.platform.resourcesserver.utils.FileKit; -import org.springframework.stereotype.Component; - -import java.io.File; - -/** - * 本地-存储接口抽象实现类 - */ -@Slf4j -@Component -public class NativeStorageImpl extends AbstractStorage implements Storage { - - @Override - public void deleteFile(String storePath) { - File file = new File(getStoragePath() + storePath); - - // 文件存在, 且不是目录 - if (file.exists() && !file.isDirectory()) { - file.delete(); - log.info("fileRepo delete " + storePath); - } - } - - @Override - public String writeToStore(byte[] bytes, String pathAndFileName) throws Exception { - String dest = getStoragePath() + pathAndFileName; - FileKit.writeByteArrayToFile(bytes, dest); - return pathAndFileName; - } - - private String getStoragePath() { - return siteOptions.getLocation(); - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/OssStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/OssStorageImpl.java deleted file mode 100644 index 93b0ce2..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/OssStorageImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.micai.platform.resourcesserver.storage.impl; - -import com.aliyun.oss.OSSClient; -import com.upyun.UpYunUtils; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.micai.platform.common.base.constant.ConstantEnum; -import org.micai.platform.common.base.exception.PlatformException; -import org.micai.platform.resourcesserver.storage.Storage; -import org.micai.platform.resourcesserver.utils.FileKit; -import org.springframework.stereotype.Component; - -import java.io.ByteArrayInputStream; - -/** - * 阿里云OSS-存储接口抽象实现类 - */ -@Slf4j -@Component -public class OssStorageImpl extends AbstractStorage implements Storage { - - private static final String oss_endpoint = "aliyun_oss_endpoint"; - private static final String oss_bucket = "aliyun_oss_bucket"; - private static final String oss_key = "aliyun_oss_key"; - private static final String oss_secret = "aliyun_oss_secret"; - private static final String oss_src = "aliyun_oss_src"; - - @Override - public void deleteFile(String storePath) { - String bucket = siteOptions.getValue(oss_bucket); - String endpoint = siteOptions.getValue(oss_endpoint); - String path = StringUtils.remove(storePath, "//" + bucket.trim() + "." + endpoint.trim() + "/"); - OSSClient client = builder(); - try { - client.doesObjectExist(bucket, path); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } - - @Override - public String writeToStore(byte[] bytes, String pathAndFileName) throws Exception { - String endpoint = siteOptions.getValue(oss_endpoint); - String bucket = siteOptions.getValue(oss_bucket); - String src = siteOptions.getValue(oss_src); - - if (StringUtils.isAnyBlank(endpoint, bucket)) { - throw new PlatformException(ConstantEnum.NO_ALIYUN_CONFIG); - } - - if (StringUtils.isBlank(src)) { - src = ""; - } else { - if (src.startsWith("/")) { - src = src.substring(1); - } - - if (!src.endsWith("/")) { - src = src + "/"; - } - } - - String key = UpYunUtils.md5(bytes); - String path = src + key + FileKit.getSuffix(pathAndFileName); - OSSClient client = builder(); - client.putObject(bucket, path, new ByteArrayInputStream(bytes)); - return "//" + bucket.trim() + "." + endpoint.trim() + "/" + path; - } - - private OSSClient builder() { - String endpoint = siteOptions.getValue(oss_endpoint); - String accessKeyId = siteOptions.getValue(oss_key); - String accessKeySecret = siteOptions.getValue(oss_secret); - - if (StringUtils.isAnyBlank(endpoint, accessKeyId, accessKeySecret)) { - throw new PlatformException(ConstantEnum.NO_ALIYUN_CONFIG); - } - return new OSSClient(endpoint, accessKeyId, accessKeySecret); - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/QiniuStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/QiniuStorageImpl.java deleted file mode 100644 index 02005ed..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/QiniuStorageImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.micai.platform.resourcesserver.storage.impl; - -import lombok.extern.slf4j.Slf4j; -import org.micai.platform.resourcesserver.storage.Storage; -import org.springframework.stereotype.Component; - -/** - * 七牛云OSS-存储接口抽象实现类 - */ -@Slf4j -@Component -public class QiniuStorageImpl extends AbstractStorage implements Storage { - - @Override - public void deleteFile(String storePath) { - - } - - @Override - public String writeToStore(byte[] bytes, String pathAndFileName) throws Exception { - return null; - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/UpYunStorageImpl.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/UpYunStorageImpl.java deleted file mode 100644 index 5fb3ebe..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/storage/impl/UpYunStorageImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.micai.platform.resourcesserver.storage.impl; - - -import org.micai.platform.resourcesserver.storage.Storage; - -public class UpYunStorageImpl extends AbstractStorage implements Storage { - - @Override - public void deleteFile(String storePath) { - - } - - @Override - public String writeToStore(byte[] bytes, String pathAndFileName) throws Exception { - return null; - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FileKit.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FileKit.java deleted file mode 100644 index 25115b7..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FileKit.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.micai.platform.resourcesserver.utils; - -import com.sun.istack.internal.NotNull; -import org.apache.commons.io.FileUtils; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -/** - * @author - langhsu - * @create - 2018/3/9 - */ -public class FileKit { - - // 文件允许格式 - private final static List allowFiles = Arrays.asList(".gif", ".png", ".jpg", ".jpeg", ".bmp"); - private final static String PREFIX_VIDEO = "video/"; - private final static String PREFIX_IMAGE = "image/"; - - /** - * 文件类型判断 - * - * @param fileName - * @return - */ - public static boolean checkFileType(String fileName) { - Iterator type = allowFiles.iterator(); - while (type.hasNext()) { - String ext = type.next(); - if (fileName.toLowerCase().endsWith(ext)) { - return true; - } - } - return false; - } - - public static String getFilename(@NotNull String filename) { - int pos = filename.lastIndexOf("."); - return filename.substring(0, pos); - } - - public static String getSuffix(String filename) { - int pos = filename.lastIndexOf("."); - return filename.substring(pos); - } - - public static void writeByteArrayToFile(byte[] bytes, String dest) throws IOException { - FileUtils.writeByteArrayToFile(new File(dest), bytes); - } - -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FilePathUtils.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FilePathUtils.java deleted file mode 100644 index 054ecea..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/FilePathUtils.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.micai.platform.resourcesserver.utils; - -import org.apache.commons.text.RandomStringGenerator; - -/** - * @author langhsu - */ -public class FilePathUtils { - private static final int[] AVATAR_GRIDS = new int[]{3, 3, 3}; - private static final int AVATAR_LENGTH = 9; - private static final String Y = "/yyyy/"; - private static RandomStringGenerator randomString = new RandomStringGenerator.Builder().withinRange('a', 'z').build(); - - public static String getAvatar(long key) { - String r = String.format("%09d", key); - StringBuffer buf = new StringBuffer(32); - int pos = 0; - for (int t : AVATAR_GRIDS) { - buf.append(r.substring(pos, pos + t)); - pos += t; - if (pos < AVATAR_LENGTH) { - buf.append('/'); - } - } - return buf.toString(); - } - - /** - * 生成路径和文件名 - * 以当前时间开头加4位随机数的文件名 - * - * @param originalFilename 原始文件名 - * @return 10位长度文件名+文件后缀 - */ - public static String wholePathName(String originalFilename, String key) { - StringBuilder builder = new StringBuilder(52); - builder.append("/_signature/"); - builder.append(key); - builder.append(FileKit.getSuffix(originalFilename)); - return builder.toString(); - } - - public static String wholePathName(String basePath, String ext, String key) { - return basePath + wholePathName(ext, key); - } - - public static void main(String[] args) { - String base = FilePathUtils.getAvatar(50); - System.out.println(String.format("/%s_%d.jpg", base, 100)); - System.out.println(FilePathUtils.wholePathName("a.jpg", "123")); - } - -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/PdfMergeUtils.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/PdfMergeUtils.java deleted file mode 100644 index d1c60c0..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/PdfMergeUtils.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.micai.platform.resourcesserver.utils; - -import com.itextpdf.text.Document; -import com.itextpdf.text.pdf.PdfContentByte; -import com.itextpdf.text.pdf.PdfImportedPage; -import com.itextpdf.text.pdf.PdfReader; -import com.itextpdf.text.pdf.PdfWriter; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * @ClassName PdfMergeUtils - * @Description This class is used to merge two or more existing pdf file using iText jar. - * @Author zhaoxinguo - * @Date 2021/11/23 17:33 - * @Version 1.0 - */ -public class PdfMergeUtils { - - /** - * 合并多个pdf到一个pdf - * @param inputPdfList - * @param outputStream - * @throws Exception - */ - public static void mergePdfFiles(List inputPdfList, OutputStream outputStream) throws Exception{ - //Create document and pdfReader objects. - Document document = new Document(); - List readers = - new ArrayList(); - int totalPages = 0; - - //Create pdf Iterator object using inputPdfList. - Iterator pdfIterator = - inputPdfList.iterator(); - - // Create reader list for the input pdf files. - while (pdfIterator.hasNext()) { - InputStream pdf = pdfIterator.next(); - PdfReader pdfReader = new PdfReader(pdf); - readers.add(pdfReader); - totalPages = totalPages + pdfReader.getNumberOfPages(); - } - - // Create writer for the outputStream - PdfWriter writer = PdfWriter.getInstance(document, outputStream); - - //Open document. - document.open(); - - //Contain the pdf data. - PdfContentByte pageContentByte = writer.getDirectContent(); - - PdfImportedPage pdfImportedPage; - int currentPdfReaderPage = 1; - Iterator iteratorPDFReader = readers.iterator(); - - // Iterate and process the reader list. - while (iteratorPDFReader.hasNext()) { - PdfReader pdfReader = iteratorPDFReader.next(); - //Create page and add content. - while (currentPdfReaderPage <= pdfReader.getNumberOfPages()) { - document.newPage(); - pdfImportedPage = writer.getImportedPage( - pdfReader,currentPdfReaderPage); - pageContentByte.addTemplate(pdfImportedPage, 0, 0); - currentPdfReaderPage++; - } - currentPdfReaderPage = 1; - } - - //Close document and outputStream. - outputStream.flush(); - document.close(); - outputStream.close(); - - System.out.println("Pdf files merged successfully."); - } - - public static void main(String args[]){ - try { - //Prepare input pdf file list as list of input stream. - List inputPdfList = new ArrayList(); - inputPdfList.add(new FileInputStream("E:\\BaiduNetdiskDownload\\批示件系统内-打印审核 - 副本.pdf")); - inputPdfList.add(new FileInputStream("E:\\BaiduNetdiskDownload\\批示件系统内-打印审核.pdf")); - - //Prepare output stream for merged pdf file. - OutputStream outputStream = - new FileOutputStream("E:\\BaiduNetdiskDownload\\批示件系统内-打印审核-MergeFile.pdf"); - - //call method to merge pdf files. - mergePdfFiles(inputPdfList, outputStream); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkOffice.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkOffice.java deleted file mode 100644 index 43dad6f..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkOffice.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.micai.platform.resourcesserver.utils; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.apache.poi.EncryptedDocumentException; -import org.apache.poi.hssf.usermodel.HSSFClientAnchor; -import org.apache.poi.hssf.usermodel.HSSFFont; -import org.apache.poi.hssf.usermodel.HSSFPatriarch; -import org.apache.poi.hssf.usermodel.HSSFRichTextString; -import org.apache.poi.hssf.usermodel.HSSFShape; -import org.apache.poi.hssf.usermodel.HSSFSheet; -import org.apache.poi.hssf.usermodel.HSSFTextbox; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.ss.usermodel.WorkbookFactory; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFDrawing; -import org.apache.poi.xssf.usermodel.XSSFFont; -import org.apache.poi.xssf.usermodel.XSSFRichTextString; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFTextBox; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -public final class WatermarkOffice { - - public static void main(String[] args) throws IOException, EncryptedDocumentException, InvalidFormatException { - try { - String src = "D:\\test.docx"; - String target = "D:\\test-watermark.docx"; - String text = "YLIYUN"; - word(src, target, text); - System.out.println("ok"); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - public static void word(String src, String target, String text) throws IOException { - XWPFDocument doc = null; - OutputStream out = null; - try { - doc = new XWPFDocument(new FileInputStream(src)); - XWPFHeaderFooterPolicy footer = new XWPFHeaderFooterPolicy(doc); - footer.createWatermark(text); - out = new FileOutputStream(target); - doc.write(out); - } finally { - if (doc != null) { - doc.close(); - } - if (out != null) { - out.close(); - } - } - - } - - public static void excel2003(String src, String target, String text) - throws IOException, EncryptedDocumentException, InvalidFormatException { - HSSFWorkbook wb = null; - OutputStream out = null; - try { - InputStream input = new FileInputStream(src); - - wb = (HSSFWorkbook) WorkbookFactory.create(input); - HSSFSheet sheet = null; - - int sheetNumbers = wb.getNumberOfSheets(); - - // sheet - for (int i = 0; i < sheetNumbers; i++) { - sheet = wb.getSheetAt(i); - // sheet.createDrawingPatriarch(); - - HSSFPatriarch dp = sheet.createDrawingPatriarch(); - HSSFClientAnchor anchor = new HSSFClientAnchor(0, 255, 550, 0, (short) 0, 1, (short) 6, 5); - - // HSSFComment comment = dp.createComment(anchor); - HSSFTextbox txtbox = dp.createTextbox(anchor); - - HSSFRichTextString rtxt = new HSSFRichTextString(text); - HSSFFont draftFont = (HSSFFont) wb.createFont(); - // 水印颜色 - draftFont.setColor((short) 55); - draftFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); - // 字体大小 - draftFont.setFontHeightInPoints((short) 30); - draftFont.setFontName("Verdana"); - rtxt.applyFont(draftFont); - txtbox.setString(rtxt); - // 倾斜度 - txtbox.setRotationDegree((short) 315); - txtbox.setLineWidth(600); - txtbox.setLineStyle(HSSFShape.LINESTYLE_NONE); - txtbox.setNoFill(true); - } - - out = new FileOutputStream(target); - wb.write(out); - } finally { - if (wb != null) { - wb.close(); - } - if (out != null) { - out.close(); - } - } - - } - - public static void excel2007(String src, String target, String text) - throws IOException, EncryptedDocumentException, InvalidFormatException { - XSSFWorkbook wb = null; - OutputStream out = null; - try { - InputStream input = new FileInputStream(src); - wb = (XSSFWorkbook) WorkbookFactory.create(input); - - XSSFSheet sheet = null; - int sheetNumbers = wb.getNumberOfSheets(); - for (int i = 0; i < sheetNumbers; i++) { - sheet = wb.getSheetAt(i); - XSSFDrawing dp = sheet.createDrawingPatriarch(); - XSSFClientAnchor anchor = new XSSFClientAnchor(0, 550, 550, 0, (short) 0, 1, (short) 6, 5); - XSSFTextBox txtbox = dp.createTextbox(anchor); - XSSFRichTextString rtxt = new XSSFRichTextString(text); - XSSFFont draftFont = (XSSFFont) wb.createFont(); - draftFont.setColor((short) 55); - draftFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); - draftFont.setFontHeightInPoints((short) 30); - draftFont.setFontName("Verdana"); - rtxt.applyFont(draftFont); - txtbox.setText(rtxt); - // 倾斜度 - txtbox.setLineWidth(600); - txtbox.setLineStyle(HSSFShape.LINESTYLE_NONE); - txtbox.setNoFill(true); - } - - out = new FileOutputStream(target); - wb.write(out); - } finally { - if (wb != null) { - wb.close(); - } - if (out != null) { - out.close(); - } - } - } - -} \ No newline at end of file diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkPdf.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkPdf.java deleted file mode 100644 index 9e6207d..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkPdf.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.micai.platform.resourcesserver.utils; - -import java.io.FileOutputStream; -import java.io.IOException; - -import com.itextpdf.text.BaseColor; -import com.itextpdf.text.DocumentException; -import com.itextpdf.text.Element; -import com.itextpdf.text.Rectangle; -import com.itextpdf.text.pdf.BaseFont; -import com.itextpdf.text.pdf.PdfContentByte; -import com.itextpdf.text.pdf.PdfGState; -import com.itextpdf.text.pdf.PdfReader; -import com.itextpdf.text.pdf.PdfStamper; - -public class WatermarkPdf { - - public static void main(String[] args) { - try { - String src = "E:\\BaiduNetdiskDownload\\Learn Microservices with Spring Boot.pdf"; - String target = "E:\\BaiduNetdiskDownload\\Learn Microservices with Spring Boot-watermark.pdf"; - String text = "YLIYUN"; - watermark(src, target, text); - System.out.println("ok"); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - public static void watermark(String src, String target, String text) throws IOException, DocumentException { - PdfReader reader = null; - PdfStamper pdfStamper = null; - try { - reader = new PdfReader(src); - pdfStamper = new PdfStamper(reader, new FileOutputStream(target)); - - addWatermark(pdfStamper, text); - } finally { - if (pdfStamper != null) { - pdfStamper.close(); - } - } - } - - private static void addWatermark(PdfStamper pdfStamper, String watermark) throws DocumentException, IOException { - PdfGState gs = new PdfGState(); - // 设置透明度为0.4 - gs.setFillOpacity(0.4f); - gs.setStrokeOpacity(0.4f); - - // 设置字体 - BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.EMBEDDED); - - int toPage = pdfStamper.getReader().getNumberOfPages(); - - PdfContentByte content = null; - Rectangle pageRect = null; - for (int i = 1; i <= toPage; i++) { - pageRect = pdfStamper.getReader().getPageSizeWithRotation(i); - // 计算水印X,Y坐标 - float x = pageRect.getWidth() / 2; - float y = pageRect.getHeight() / 2; - //获得PDF最顶层 - content = pdfStamper.getOverContent(i); - content.saveState(); - // set Transparency - content.setGState(gs); - content.beginText(); - content.setColorFill(BaseColor.GRAY); - content.setFontAndSize(base, 100); - // 水印文字成45度角倾斜 - content.showTextAligned(Element.ALIGN_CENTER, watermark, x, y, 315); - content.endText(); - } - } -} \ No newline at end of file diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkUtils.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkUtils.java deleted file mode 100644 index b0a8699..0000000 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/utils/WatermarkUtils.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.micai.platform.resourcesserver.utils; - -/** - * @ClassName WatermarkUtils - * @Description 水印工具类 - * @Author zhaoxinguo - * @Date 2021/11/23 17:33 - * @Version 1.0 - */ -public class WatermarkUtils { - - public static boolean watermark(String src, String target, String text) throws Exception { - String ext = getFileExt(src); - if ("pdf".equalsIgnoreCase(ext)) { - WatermarkPdf.watermark(src, target, text); - return true; - } else if ("docx".equalsIgnoreCase(ext)) { - WatermarkOffice.word(src, target, text); - return true; - } else if ("xlsx".equalsIgnoreCase(ext)) { - WatermarkOffice.excel2007(src, target, text); - return true; - } else if ("xls".equalsIgnoreCase(ext)) { - WatermarkOffice.excel2003(src, target, text); - return true; - } - return false; - } - - private static String getFileExt(String file) { - int index = file.lastIndexOf("."); - if (index != -1) { - return file.substring(index + 1); - } - return ""; - } - - public static void main(String[] args) { - if (args == null || args.length < 3) { - System.exit(1); - } - - String src = args[0]; - String target = args[1]; - String text = args[2]; - - try { - boolean b = watermark(src, target, text); - if (b) { - System.exit(0); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - - System.exit(1); - } -} -- Gitee From 9f349bdfb998a07472e0151d3c4f8ec1a05840c1 Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 27 Dec 2022 11:04:57 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E5=99=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MicaiPlatformRequestMatcher.java | 21 ------------ .../config/MicaiPlatformResourcesConfig.java | 4 ++- .../config/ResourceServerConfig.java | 2 +- .../filter/AuthHeaderFilter.java | 34 ++++++++----------- .../src/main/resources/application-dev.yml | 8 ++--- 5 files changed, 21 insertions(+), 48 deletions(-) delete mode 100644 platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java diff --git a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java deleted file mode 100644 index fdd0c9d..0000000 --- a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformRequestMatcher.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.micai.platform.common.base.config; - -import lombok.Data; - -import java.util.List; - -/** - * @Author liuCong - * @Date 2022/12/13 下午 2:08 - * @ClassName MicaiPlatformRequestMatcher - * @Description - */ -@Data -public class MicaiPlatformRequestMatcher { - - private List jwtAuth; - private List oauth2Auth; - - - -} diff --git a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java index c3b3268..70ab718 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/config/MicaiPlatformResourcesConfig.java @@ -4,6 +4,8 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; +import java.util.List; + /** * @Author liuCong * @Date 2022/12/13 上午 9:38 @@ -18,6 +20,6 @@ public class MicaiPlatformResourcesConfig { /** JWT*/ private String signKey; private String resourceIds; - private MicaiPlatformRequestMatcher requestMatcher; + private List requestMatcher; } diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java index cb7b16e..513ee3c 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/config/ResourceServerConfig.java @@ -128,7 +128,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter { .permitAll(); AuthHeaderFilter authHeaderFilter = new AuthHeaderFilter(); - authHeaderFilter.setAuthHeaderRequestMatcher(micaiPlatformResourcesConfig.getRequestMatcher().getJwtAuth(), micaiPlatformResourcesConfig.getRequestMatcher().getOauth2Auth()); + authHeaderFilter.setAuthHeaderRequestMatcher(micaiPlatformResourcesConfig.getRequestMatcher()); //为什么要在after //因为OAuth2AuthenticationProcessingFilter.doFilter()包含了SecurityContextHolder.clearContext(); http.addFilterAfter(new JWTAuthenticationFilter(authenticationManager,micaiPlatformTokenConfig), AbstractPreAuthenticatedProcessingFilter.class); diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java index 32012ef..4a59d23 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java @@ -28,30 +28,19 @@ import java.util.Vector; @Slf4j public class AuthHeaderFilter implements Filter { - //拦截接口让JWTAuthenticationFilter去验证 - private final List authJwtRequestMatcher = new ArrayList<>(); - //拦截接口让OAuth2AuthenticationProcessingFilter去验证 private final List authOAuth2RequestMatcher = new ArrayList<>(); - public void setAuthHeaderRequestMatcher(List jwtAuthList, List oauth2AuthList) { - Assert.notNull(authJwtRequestMatcher, "authJwtRequestMatcher cannot be null"); + public void setAuthHeaderRequestMatcher(List oauth2AuthList) { Assert.notNull(authOAuth2RequestMatcher, "authOAuth2RequestMatcher cannot be null"); - if (ObjectUtil.isNotEmpty(jwtAuthList)) { - for (String jwtAuth : jwtAuthList) { - authJwtRequestMatcher.add(new AntPathRequestMatcher(jwtAuth)); - } - } - if (ObjectUtil.isNotEmpty(oauth2AuthList)) { for (String oauth2Auth : oauth2AuthList) { authOAuth2RequestMatcher.add(new AntPathRequestMatcher(oauth2Auth)); } } log.info("init request matcher list:==========================>>>>>>>>>>>>>>>>> \n" + - "authJwtRequestMatcher:{},authOAuth2RequestMatcher{} " - , authJwtRequestMatcher, authOAuth2RequestMatcher); + "authOAuth2RequestMatcher{} ", authOAuth2RequestMatcher); } @Override @@ -69,15 +58,22 @@ public class AuthHeaderFilter implements Filter { */ @Override public String getHeader(String name) { - if (ObjectUtil.isNotEmpty(authJwtRequestMatcher)) { - for (AntPathRequestMatcher antPathRequestMatcher : authJwtRequestMatcher) { - if (antPathRequestMatcher.matches(request) && ConstantCode.AUTHORIZATION.equalsIgnoreCase(name)) { - return super.getHeader(name); + if (ObjectUtil.isEmpty(authOAuth2RequestMatcher)){ + return super.getHeader(name); + } + boolean isMatcher = Boolean.TRUE; + if (ObjectUtil.isNotEmpty(authOAuth2RequestMatcher)) { + for (AntPathRequestMatcher antPathRequestMatcher : authOAuth2RequestMatcher) { + if (antPathRequestMatcher.matches(request)) { + isMatcher = Boolean.FALSE; } } } - return null; - + if (isMatcher){ + return super.getHeader(name); + }else { + return null; + } } /** diff --git a/platform-resources-server/src/main/resources/application-dev.yml b/platform-resources-server/src/main/resources/application-dev.yml index 047f682..91dde2b 100644 --- a/platform-resources-server/src/main/resources/application-dev.yml +++ b/platform-resources-server/src/main/resources/application-dev.yml @@ -29,9 +29,5 @@ micai-platform-auth: resource-ids: resources-server #过滤器匹配路径 可以使用** request-matcher: - jwt-auth: - - /user/info - - /user/list - oauth2-auth: - - /demo - - /user/list111 + - /demo + - /user/list -- Gitee From ce7cc4fd44eceab458b8c9f027d53836d386a619 Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 27 Dec 2022 16:24:24 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E5=99=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/micai_platform.sql | 7 +++-- .../exception/GlobalExceptionHandler.java | 2 +- .../controller/UserController.java | 29 ++++++------------- .../filter/AuthHeaderFilter.java | 3 +- .../src/main/resources/logback-spring.xml | 2 +- 5 files changed, 18 insertions(+), 25 deletions(-) diff --git a/doc/sql/micai_platform.sql b/doc/sql/micai_platform.sql index 5263838..d0cd668 100644 --- a/doc/sql/micai_platform.sql +++ b/doc/sql/micai_platform.sql @@ -39,7 +39,7 @@ CREATE TABLE `oauth_client_details` ( -- ---------------------------- -- Records of oauth_client_details -- ---------------------------- -INSERT INTO `oauth_client_details` VALUES ('pc', 'resources-server', '$2a$10$XyKNPWArxeVGjOKFF.pF7ONmv9NMAN5Bkkiwy8MutFTUKXhHFv.zC', 'pc', 'authorization_code,password,refresh_token', 'http://www.baidu.com/', 'info,sys:user:List', NULL, NULL, NULL, 'true'); +INSERT INTO `oauth_client_details` VALUES ('pc', 'resources-server', '$2a$10$XyKNPWArxeVGjOKFF.pF7ONmv9NMAN5Bkkiwy8MutFTUKXhHFv.zC', 'pc', 'authorization_code,password,refresh_token', 'http://www.baidu.com/', 'info,sys:user:list', NULL, NULL, NULL, 'true'); -- ---------------------------- -- Table structure for oauth_code @@ -92,7 +92,7 @@ CREATE TABLE `tb_permission` ( -- Records of tb_permission -- ---------------------------- INSERT INTO `tb_permission` VALUES (1, 'sys:permission:save', '新增权限', '新增权限', '01', 1, '2022-01-13 12:58:32', 1, '2022-01-13 12:58:32', 0); -INSERT INTO `tb_permission` VALUES (2, 'sys:user:List', '获取用户列表', '获取用户列表', '01', 1, '2022-01-13 13:41:09', 1, '2022-01-13 13:41:09', 0); +INSERT INTO `tb_permission` VALUES (2, 'sys:user:list', '获取用户列表', '获取用户列表', '01', 1, '2022-01-13 13:41:09', 1, '2022-01-13 13:41:09', 0); INSERT INTO `tb_permission` VALUES (3, 'sys:user:update', '更新用户', '更新用户', '01', 1, '2022-01-13 13:43:59', 1, '2022-01-13 13:43:59', 0); INSERT INTO `tb_permission` VALUES (4, 'sys:user:save', '新增用户', '新增用户', '01', 1, '2022-01-13 13:44:28', 1, '2022-01-13 13:44:28', 0); INSERT INTO `tb_permission` VALUES (5, 'sys:user:del', '删除用户', '删除用户', '01', 1, '2022-01-13 13:44:46', 1, '2022-01-13 13:44:46', 0); @@ -116,6 +116,7 @@ INSERT INTO `tb_permission` VALUES (23, 'sys:permissionMenu:del', '删除角色 INSERT INTO `tb_permission` VALUES (24, 'sys:userRole:update', '更新用户角色', '更新用户角色', '01', 1, '2022-01-14 10:41:35', 1, '2022-01-14 10:41:35', 0); INSERT INTO `tb_permission` VALUES (25, 'sys:userRole:save', '新增用户角色', '新增用户角色', '01', 1, '2022-01-14 10:41:54', 1, '2022-01-14 10:41:54', 0); INSERT INTO `tb_permission` VALUES (26, 'sys:userRole:del', '删除用户角色', '删除用户角色', '01', 1, '2022-01-14 10:42:14', 1, '2022-01-14 10:42:14', 0); +INSERT INTO `tb_permission` VALUES (27, 'sys:user:authorityList', '获取用户权限', '获取用户权限', '01', 1, '2022-12-27 11:18:16', 1, '2022-12-27 11:18:24', 0); -- ---------------------------- -- Table structure for tb_role @@ -182,6 +183,8 @@ INSERT INTO `tb_role_permission` VALUES (29, 1, 20, 1, '2022-01-13 16:38:20', 1, INSERT INTO `tb_role_permission` VALUES (30, 1, 21, 1, '2022-01-13 17:36:25', 1, '2022-01-13 17:36:25', 0); INSERT INTO `tb_role_permission` VALUES (31, 1, 22, 1, '2022-01-13 17:36:25', 1, '2022-01-13 17:36:25', 0); INSERT INTO `tb_role_permission` VALUES (32, 1, 23, 1, '2022-01-13 17:36:25', 1, '2022-01-13 17:36:25', 0); +INSERT INTO `tb_role_permission` VALUES (33, 1, 27, 1, '2022-12-27 11:19:38', 1, '2022-12-27 11:19:46', 0); + -- ---------------------------- -- Table structure for tb_user -- ---------------------------- diff --git a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java index 1d70755..76323ad 100644 --- a/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java +++ b/platform-common/src/main/java/org/micai/platform/common/base/exception/GlobalExceptionHandler.java @@ -80,7 +80,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) public Result illegalArgumentException(IllegalArgumentException e) { log.error(e.getMessage(), e); - return new Result(ConstantEnum.ACCESS_DENIED); + return new Result(ConstantEnum.ILLEGAL_ARG); } diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserController.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserController.java index 48f525e..70d7232 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserController.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/controller/UserController.java @@ -14,13 +14,16 @@ import org.micai.platform.resourcesserver.bo.UserUpdateBo; import org.micai.platform.resourcesserver.entity.User; import org.micai.platform.resourcesserver.vo.UserListVo; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; import javax.validation.Valid; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * @author zhaoxinguo on 2017/9/13. @@ -49,20 +52,6 @@ public class UserController extends BaseController { return new Result(ConstantEnum.SUCCESS,flag); } - /** - * 获取用户列表 - * @return - */ - @ApiIgnore - @ApiOperation(value = "获取用户列表old",notes = "获取用户列表old") - @GetMapping("/userList") - public Map userList(){ - List users = userService.findUserList(); - Map map = new HashMap(); - map.put("users",users); - return map; - } - /** * 获取用户权限 * @return @@ -70,9 +59,9 @@ public class UserController extends BaseController { @ApiIgnore @ApiOperation(value = "获取用户权限",notes = "获取用户权限") @GetMapping("/authorityList") + @PreAuthorize("hasAnyAuthority('sys:user:authorityList')") public List authorityList(){ - List authentication = getAuthentication(); - return authentication; + return getAuthentication(); } @@ -82,7 +71,7 @@ public class UserController extends BaseController { */ @ApiOperation(value = "获取用户列表", notes = "获取用户列表") @PostMapping("/list") - @PreAuthorize("hasAnyAuthority('sys:user:List')") + @PreAuthorize("hasAnyAuthority('sys:user:list')") public Result getUserList(@RequestBody UserFindBo bo){ Result result; try { diff --git a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java index 4a59d23..75c0b8a 100644 --- a/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java +++ b/platform-resources-server/src/main/java/org/micai/platform/resourcesserver/filter/AuthHeaderFilter.java @@ -64,8 +64,9 @@ public class AuthHeaderFilter implements Filter { boolean isMatcher = Boolean.TRUE; if (ObjectUtil.isNotEmpty(authOAuth2RequestMatcher)) { for (AntPathRequestMatcher antPathRequestMatcher : authOAuth2RequestMatcher) { - if (antPathRequestMatcher.matches(request)) { + if (antPathRequestMatcher.matches(request) && ConstantCode.AUTHORIZATION.equalsIgnoreCase(name)) { isMatcher = Boolean.FALSE; + break; } } } diff --git a/platform-resources-server/src/main/resources/logback-spring.xml b/platform-resources-server/src/main/resources/logback-spring.xml index 896f83d..b02d2b7 100644 --- a/platform-resources-server/src/main/resources/logback-spring.xml +++ b/platform-resources-server/src/main/resources/logback-spring.xml @@ -42,7 +42,7 @@ - + -- Gitee From 105be312a526e2cb6da3b718f380f0a226dd9dab Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 27 Dec 2022 16:38:00 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 356 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 343 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a1995d2..b176e4a 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,351 @@ -### **一:后端技术选型**: -1、Spring Boot 2.6.0
-2、Spring Security 5.6.0
-4、MyBatis 3.5.5
-5、MyBatis-Plus 3.4.3.4
-6、MySQL 5.1.30
+# 迷彩:micai-platform-auth -### **二:接口访问地址**: -http://localhost:8080/doc.html -### **三:测试用户** -最高权限用户 用户名:root 密码:root
-一般用户(没配置菜单) 用户名:user 密码:user -### **四:参考资料** -mblog:https://github.com/langhsu/mblog
+# 一.简介 +该项目是基于springboot、springsecurity、Spring security oauth以及jwt 搭建而成,实现RBAC权限模型。 +## **一.后端技术选型**: +- Spring Boot 2.6.0 +- Spring Security 2.6.6 +- Spring security oauth 2 2.2.6.RELEASE +- jjwt 0.7.0 +- MyBatis 3.5.5 +- MyBatis-Plus 3.4.3.4 +- MySQL 5.1.30 +- ...... + + + +## 二.后端项目结构: + +```java +micai + //认证服务 +|-- platform-auth-server +| |-- platform-auth-server.iml +| |-- pom.xml +| `-- src +| `-- main +| |-- java +| | `-- org +| | `-- micai +| | `-- platform +| | `-- authserver +| | |-- AuthServerApplication.java +| | |-- bo //入参对象 +| | | `-- UserQueryBo.java +| | |-- config //相关配置 +| | | |-- AuthorizationServerConfiguration.java +| | | |-- JwtTokenEnhancer.java +| | | |-- PasswordEncoder.java +| | | |-- TokenConfig.java +| | | `-- WebSecurityConfig.java +| | |-- entity //相关实体类 +| | | |-- Permission.java +| | | |-- Role.java +| | | |-- RolePermission.java +| | | |-- User.java +| | | `-- UserRole.java +| | |-- filter //相关过滤器 +| | | |-- JWTAuthenticationFilter.java +| | | `-- JWTLoginFilter.java +| | |-- handler //相关处理器 +| | | |-- CustomAuthenticationFailureHandler.java +| | | |-- Http401AuthenticationEntryPoint.java +| | | `-- MyMetaObjectHandler.java +| | |-- interceptor //相关拦截器 +| | | `-- PlusInterceptor.java +| | |-- mapper //mapper文件 +| | | |-- PermissionMapper.java +| | | |-- RoleMapper.java +| | | |-- RolePermissionMapper.java +| | | |-- UserMapper.java +| | | `-- UserRoleMapper.java +| | |-- provider //security相关提供器 +| | | `-- CustomAuthenticationProvider.java +| | `-- service //相关service类 +| | |-- PermissionService.java +| | |-- RolePermissionService.java +| | |-- RoleService.java +| | |-- UserRoleService.java +| | |-- UserService.java +| | `-- impl +| | |-- GrantedAuthorityImpl.java +| | |-- PermissionServiceImpl.java +| | |-- RolePermissionServiceImpl.java +| | |-- RoleServiceImpl.java +| | |-- UserDetailsServiceImpl.java +| | |-- UserRoleServiceImpl.java +| | `-- UserServiceImpl.java +| `-- resources +| |-- application-dev.yml +| |-- application-pro.yml +| `-- application.yml + //公共服务 +|-- platform-common +| |-- platform-common.iml +| |-- pom.xml +| `-- src +| `-- main +| |-- java +| | `-- org +| | `-- micai +| | `-- platform +| | `-- common +| | `-- base //公共包 +| | |-- WebStarterAutoConfig.java +| | |-- config //公共配置 +| | | |-- MicaiPlatformOauthConfig.java +| | | |-- MicaiPlatformRequestMatcher.java +| | | |-- MicaiPlatformResourcesConfig.java +| | | `-- MicaiPlatformTokenConfig.java +| | |-- constant //常量和常枚举 +| | | |-- ConstantCode.java +| | | `-- ConstantEnum.java +| | |-- controller //异常处理controller +| | | `-- ExceptionController.java +| | |-- exception //异常处理和自定义异常 +| | | |-- GlobalExceptionHandler.java +| | | |-- MyAuthException.java +| | | `-- PlatformException.java +| | |-- result //自定义返回对象 +| | | |-- Result.java +| | | `-- UploadResult.java +| | `-- sms //短信相关功能 +| | |-- Sms.java +| | `-- impl +| | |-- AbstractSms.java +| | `-- QiniuSmsImpl.java +| `-- resources +| `-- META-INF +| `-- spring.factories + //资源服务 +|-- platform-resources-server +| |-- platform-resources-server.iml +| |-- pom.xml +| `-- src +| `-- main +| |-- java +| | `-- org +| | `-- micai +| | `-- platform +| | `-- resourcesserver +| | |-- ResourcesServerApplication.java +| | |-- bo //入参对象 +| | | |-- MenuDelBo.java +| | | |-- MenuSaveBo.java +| | | |-- MenuUpdateBo.java +| | | |-- OrganDelBo.java +| | | |-- OrganFindBo.java +| | | |-- OrganSaveBo.java +| | | |-- OrganUpdateBo.java +| | | |-- PermissionDelBo.java +| | | |-- PermissionFindBo.java +| | | |-- PermissionMenuDelBo.java +| | | |-- PermissionMenuSaveBo.java +| | | |-- PermissionMenuUpdateBo.java +| | | |-- PermissionSaveBo.java +| | | |-- PermissionUpdateBo.java +| | | |-- RoleDelBo.java +| | | |-- RoleFindBo.java +| | | |-- RolePermissionDelBo.java +| | | |-- RolePermissionSaveBo.java +| | | |-- RolePermissionUpdateBo.java +| | | |-- RoleSaveBo.java +| | | |-- RoleUpdateBo.java +| | | |-- UserDelBo.java +| | | |-- UserFindBo.java +| | | |-- UserQueryBo.java +| | | |-- UserRoleDelBo.java +| | | |-- UserRoleSaveBo.java +| | | |-- UserRoleUpdateBo.java +| | | |-- UserSaveBo.java +| | | `-- UserUpdateBo.java +| | |-- config //相关配置类 +| | | |-- CodeGenerator.java +| | | |-- PasswordEncoder.java +| | | |-- ResourceServerConfig.java +| | | |-- SiteOptions.java +| | | |-- SwaggerConfig.java +| | | |-- TokenConfig.java +| | | `-- WebSecurityConfig.java +| | |-- controller //表现层 +| | | |-- BaseController.java +| | | |-- PermissionController.java +| | | |-- RoleController.java +| | | |-- RolePermissionController.java +| | | |-- UploadController.java +| | | |-- UserController.java +| | | `-- UserRoleController.java +| | |-- dto +| | | `-- UserAuthenticationDto.java +| | |-- entity +| | | |-- Permission.java +| | | |-- Role.java +| | | |-- RolePermission.java +| | | |-- User.java +| | | `-- UserRole.java +| | |-- filter //相关自定义过滤器 +| | | |-- AuthHeaderFilter.java +| | | `-- JWTAuthenticationFilter.java +| | |-- handler //相关自定义处理器 +| | | |-- Http401AuthenticationEntryPoint.java +| | | `-- MyMetaObjectHandler.java +| | |-- interceptor //相关拦截器 +| | | `-- PlusInterceptor.java +| | |-- mapper +| | | |-- PermissionMapper.java +| | | |-- RoleMapper.java +| | | |-- RolePermissionMapper.java +| | | |-- UserMapper.java +| | | `-- UserRoleMapper.java +| | |-- provider //自定义security的提供器 +| | | `-- CustomAuthenticationProvider.java +| | |-- service //相关的service +| | | |-- PermissionService.java +| | | |-- RolePermissionService.java +| | | |-- RoleService.java +| | | |-- UserRoleService.java +| | | |-- UserService.java +| | | `-- impl +| | | |-- GrantedAuthorityImpl.java +| | | |-- PermissionServiceImpl.java +| | | |-- RolePermissionServiceImpl.java +| | | |-- RoleServiceImpl.java +| | | |-- UserDetailsServiceImpl.java +| | | |-- UserRoleServiceImpl.java +| | | `-- UserServiceImpl.java +| | |-- storage +| | | |-- Storage.java +| | | |-- StorageFactory.java +| | | `-- impl +| | | |-- AbstractStorage.java +| | | |-- MinioStorageImpl.java +| | | |-- NativeStorageImpl.java +| | | |-- OssStorageImpl.java +| | | |-- QiniuStorageImpl.java +| | | `-- UpYunStorageImpl.java +| | |-- utils //相关工具类 +| | | |-- ApplicationUtil.java +| | | |-- AuthenticationManger.java +| | | |-- FileKit.java +| | | |-- FilePathUtils.java +| | | |-- ImageUtils.java +| | | |-- JwtHelper.java +| | | |-- MD5.java +| | | |-- PdfMergeUtils.java +| | | |-- WatermarkOffice.java +| | | |-- WatermarkPdf.java +| | | `-- WatermarkUtils.java +| | `-- vo //返回前端对象 +| | |-- OrganListVo.java +| | |-- PermissionListVo.java +| | |-- RoleListVo.java +| | `-- UserListVo.java +| `-- resources +| |-- application-dev.yml +| |-- application-pro.yml +| |-- application.yml +| `-- logback-spring.xml +`-- pom.xml + +``` + + + + + +## 三.项目流程图: + +![迷彩-登录授权流程](README.assets/迷彩-登录授权流程.png) + +### 本系统登录流程: + +1. 调用登录接口http://localhost:8080/login 返回token令牌 + +```java +curl --location --request POST 'http://localhost:8080/login' \ +--header 'Content-Type: application/json' \ +--data-raw '{"username":"root","password":"root"}' +``` + +​ 2.携带返回的token信息,访问需要获取资源接口 + + + +### 第三方应用流程: + +1. 调用登录接口http://localhost:8080/login 返回token令牌 + +```java +curl --location --request POST 'http://localhost:8080/login' \ +--header 'Content-Type: application/json' \ +--data-raw '{"username":"root","password":"root"}' +``` + +​ 2.携带返回的token信息,访问oauth2授权接口,使用授权码模式http://localhost:8080/oauth/authorize?response_type=code&client_id=pc,重定向到设定的**web_server_redirect_uri**地址并且地址拼接了授权码信息 + +```java +curl --location --request GET 'http://localhost:8080/oauth/authorize?response_type=code&client_id=pc' \ +--header 'Authorization: Bear xxxxxx' +``` + + 3.根据获取的授权码信息,调用获取access_token信息http://localhost:8080/oauth/token?grant_type=authorization_code&client_id=pc&client_secret=admin&code=fQxVEU + +```java +curl --location --request POST 'http://localhost:8080/oauth/token?grant_type=authorization_code&client_id=pc&client_secret=admin&code=fQxVEU' +``` + +返回的信息,如下: + +```java +{ + "access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb20iOiJsaXVjb25nIiwid2l0aCI6Im1pY2FpIiwiYXVkIjpbInJlc291cmNlcy1zZXJ2ZXIiXSwidXNlcl9uYW1lIjoiMS1yb290LVt", +"token_type": "bearer", +"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb20iOiJsaXVjb25nIiwid2l0aCI6Im1pY2FpIiwiYXVkIjpbInJlc291cmNlcy1zZXJ2ZXIiXSwidXNlcl9uYW1lIjoiMS1yb290LVtcIlJPTEVfcm9vdFwiLFwi", + "expires_in": 43199, + "scope": "pc", + "author": "liucong", + "jti": "cfc312f6-c38f-4670-9140-9985372cb7c9" +} +``` + +access_token:返回的token令牌,可以访问对应资源服务; + +token_type:token类型,token前缀 + +expires_in:过期时间 + +scope:作用范围 + +author:通过实现TokenEnhancer,添加自定义信息 + +jti:jwt唯一标识 + + + +4.携带access_token信息,访问需要获取资源接口 + + + +## 四.swagger地址: + +- platform-auth-server:http://localhost:8080/doc.html +- platform-resources-server:http://localhost:8081/doc.html + + + +## 五.为什么使用jwt令牌方式 + +当认证服务器和资源服务器不是在同一工程时, 要使用 ResourceServerTokenServices 去远程请求认证服务器来校验 +令牌的合法性,如果用户访问量较大时将会影响系统的性能。 + +此时,采用 JWT 格式就可以解决上面的问题。 +因为当用户认证后获取到一个JWT令牌,而这个 JWT 令牌包含了用户基本信息,客户端只需要携带JWT访问资源服 +务器,资源服务器会通过事先约定好的算法进行解析出来,然后直接对 JWT 令牌校验,不需要每次远程请求认证服 +务器完成授权。 -- Gitee From 0f0d6db7be8bbfc851648d7b3fc4143be9b574f2 Mon Sep 17 00:00:00 2001 From: liucong Date: Tue, 27 Dec 2022 16:41:49 +0800 Subject: [PATCH 16/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0readme=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...210\346\235\203\346\265\201\347\250\213.png" | Bin 0 -> 87042 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "README.assets/\350\277\267\345\275\251-\347\231\273\345\275\225\346\216\210\346\235\203\346\265\201\347\250\213.png" diff --git "a/README.assets/\350\277\267\345\275\251-\347\231\273\345\275\225\346\216\210\346\235\203\346\265\201\347\250\213.png" "b/README.assets/\350\277\267\345\275\251-\347\231\273\345\275\225\346\216\210\346\235\203\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee5a35c055c9cf5ab765bfae7e4c3af0d52c900f GIT binary patch literal 87042 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