From daf43f598b021693dba2d3e4f5abb7680ac85875 Mon Sep 17 00:00:00 2001 From: AlexBob Date: Thu, 1 Aug 2024 14:22:33 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(build):=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9E=84=E5=BB=BA=E9=85=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96Gradle=E6=9E=84=E5=BB=BA=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E5=92=8C=E8=A7=A6=E5=8F=91=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E5=B7=A5=E4=BD=9C=E6=B5=81=E8=B0=83?= =?UTF-8?q?=E5=BA=A6=EF=BC=8C=E6=8F=90=E9=AB=98=E4=BB=A3=E7=A0=81=E5=8F=AF?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle-build.yml | 2 +- .github/workflows/gradle-tests.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index f3dc216a..671d3a33 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -4,7 +4,7 @@ # documentation. # This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle -name: Gradle Build Package Image +name: Gradle Build Image run-name: ${{ github.actor }} is bootBuildImage Actions on: release: diff --git a/.github/workflows/gradle-tests.yml b/.github/workflows/gradle-tests.yml index a3add02f..8589b801 100644 --- a/.github/workflows/gradle-tests.yml +++ b/.github/workflows/gradle-tests.yml @@ -30,8 +30,10 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@dbbdc275be76ac10734476cc723d82dfe7ec6eda + - name: Make gradlew executable run: chmod +x ./gradlew + - name: Build with Gradle Wrapper run: ./gradlew build test From 69679ec3de134a42d26938978fa567347c01a82e Mon Sep 17 00:00:00 2001 From: AlexBob Date: Thu, 1 Aug 2024 15:05:01 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(security):=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=AE=89=E5=85=A8=E6=A8=A1=E5=9D=97=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9D=83=E9=99=90=E9=AA=8C=E8=AF=81=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E7=B3=BB=E7=BB=9F=E5=AE=89=E5=85=A8=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/plate/boot/commons/base/AbstractDatabase.java | 6 ------ .../plate/boot/commons/utils/query/CriteriaUtils.java | 3 ++- .../java/com/plate/boot/config/RedisConfiguration.java | 1 - .../com/plate/boot/config/SecurityConfiguration.java | 5 +++-- .../java/com/plate/boot/relational/menus/Menu.java | 2 +- .../com/plate/boot/relational/rsocket/MessageIn.java | 6 ++++++ .../com/plate/boot/security/SecurityController.java | 4 ++-- .../{UserSecurityManager.java => SecurityManager.java} | 2 +- .../plate/boot/security/oauth2/Oauth2UserService.java | 10 +++++----- 9 files changed, 20 insertions(+), 19 deletions(-) rename boot/platform/src/main/java/com/plate/boot/security/{UserSecurityManager.java => SecurityManager.java} (99%) diff --git a/boot/platform/src/main/java/com/plate/boot/commons/base/AbstractDatabase.java b/boot/platform/src/main/java/com/plate/boot/commons/base/AbstractDatabase.java index 1583e530..b6ef64d9 100644 --- a/boot/platform/src/main/java/com/plate/boot/commons/base/AbstractDatabase.java +++ b/boot/platform/src/main/java/com/plate/boot/commons/base/AbstractDatabase.java @@ -39,7 +39,6 @@ protected Flux queryWithCache(Object key, String sql, Flux source = executeSpec .map((row, rowMetadata) -> this.r2dbcConverter.read(entityClass, row, rowMetadata)) .all().flatMapSequential(ContextUtils::serializeUserAuditor); - return queryWithCache(key, source); } @@ -47,10 +46,8 @@ protected Flux queryWithCache(Object key, Flux sourceFlux) { String cacheKey = key + ":data"; Collection cacheData = this.cache.get(cacheKey, ArrayList::new); assert cacheData != null; - Flux source = sourceFlux.doOnNext(cacheData::add) .doAfterTerminate(() -> BeanUtils.cachePut(this.cache, cacheKey, cacheData)); - return Flux.fromIterable(ObjectUtils.isEmpty(cacheData) ? Collections.emptyList() : cacheData) .switchIfEmpty(Flux.defer(() -> source)); } @@ -58,15 +55,12 @@ protected Flux queryWithCache(Object key, Flux sourceFlux) { protected Mono countWithCache(Object key, Query query, Class entityClass) { Mono source = this.entityTemplate.count(query, entityClass); return countWithCache(key, source).cache(); - } protected Mono countWithCache(Object key, String sql, Map bindParams) { var executeSpec = this.databaseClient.sql(() -> sql); executeSpec = executeSpec.bindValues(bindParams); - Mono source = executeSpec.mapValue(Long.class).first(); - return countWithCache(key, source); } diff --git a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/CriteriaUtils.java b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/CriteriaUtils.java index 66bd9c58..d58a0bf1 100644 --- a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/CriteriaUtils.java +++ b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/CriteriaUtils.java @@ -2,6 +2,7 @@ import com.google.common.base.CaseFormat; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import com.plate.boot.commons.utils.BeanUtils; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -107,7 +108,7 @@ public static ParamSql buildParamSql(Map objectMap, String prefi public static Criteria build(Object object, Collection skipKes) { Map objectMap = BeanUtils.beanToMap(object, true); if (!ObjectUtils.isEmpty(objectMap)) { - Set mergeSet = new HashSet<>(SKIP_CRITERIA_KEYS); + Set mergeSet = Sets.newHashSet(SKIP_CRITERIA_KEYS); if (!ObjectUtils.isEmpty(skipKes)) { mergeSet.addAll(skipKes); } diff --git a/boot/platform/src/main/java/com/plate/boot/config/RedisConfiguration.java b/boot/platform/src/main/java/com/plate/boot/config/RedisConfiguration.java index 3b5f8ce8..c5406310 100644 --- a/boot/platform/src/main/java/com/plate/boot/config/RedisConfiguration.java +++ b/boot/platform/src/main/java/com/plate/boot/config/RedisConfiguration.java @@ -25,7 +25,6 @@ public RedisCacheManagerBuilderCustomizer myRedisCacheManagerBuilderCustomizer(O .fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair .fromSerializer(new Jackson2JsonRedisSerializer<>(objectMapper, Object.class))); - } @Bean diff --git a/boot/platform/src/main/java/com/plate/boot/config/SecurityConfiguration.java b/boot/platform/src/main/java/com/plate/boot/config/SecurityConfiguration.java index f581434a..45737abc 100644 --- a/boot/platform/src/main/java/com/plate/boot/config/SecurityConfiguration.java +++ b/boot/platform/src/main/java/com/plate/boot/config/SecurityConfiguration.java @@ -49,6 +49,7 @@ import java.util.List; import java.util.Set; +import static com.plate.boot.commons.utils.ContextUtils.RULE_ADMINISTRATORS; import static com.plate.boot.config.SessionConfiguration.XML_HTTP_REQUEST; import static com.plate.boot.config.SessionConfiguration.X_REQUESTED_WITH; @@ -97,14 +98,14 @@ public PayloadSocketAcceptorInterceptor rsocketInterceptor(RSocketSecurity rsock @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http.authorizeExchange(exchange -> { - exchange.pathMatchers("/captcha/code", "/oauth2/qr/code", "/oauth2/realms/issuer/**").permitAll(); + exchange.pathMatchers("/captcha/code", "/oauth2/qr/code").permitAll(); exchange.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll(); exchange.anyExchange().authenticated(); }); http.sessionManagement((sessions) -> sessions .concurrentSessions((concurrency) -> concurrency.maximumSessions((authentication) -> { if (authentication.getAuthorities().stream() - .anyMatch(a -> "ROLE_SYSTEM_ADMINISTRATORS".equals(a.getAuthority()))) { + .anyMatch(a -> RULE_ADMINISTRATORS.equals(a.getAuthority()))) { return Mono.empty(); } return Mono.just(3); diff --git a/boot/platform/src/main/java/com/plate/boot/relational/menus/Menu.java b/boot/platform/src/main/java/com/plate/boot/relational/menus/Menu.java index 89b8a77f..e4dae4bf 100644 --- a/boot/platform/src/main/java/com/plate/boot/relational/menus/Menu.java +++ b/boot/platform/src/main/java/com/plate/boot/relational/menus/Menu.java @@ -40,7 +40,7 @@ public class Menu implements BaseEntity { private MenuType type; @NotBlank(message = "Authority cannot be blank!") - @Pattern(regexp = "^[a-zA-Z_]{1,50}$", message = "Authority can only contain English letters or '_' symbols.") + @Pattern(regexp = "^[a-zA-Z_]{1,256}$", message = "Authority can only contain English letters or '_' symbols.") private String authority; @NotBlank(message = "Name cannot be blank!") diff --git a/boot/platform/src/main/java/com/plate/boot/relational/rsocket/MessageIn.java b/boot/platform/src/main/java/com/plate/boot/relational/rsocket/MessageIn.java index 1fd620a4..37c97cfb 100644 --- a/boot/platform/src/main/java/com/plate/boot/relational/rsocket/MessageIn.java +++ b/boot/platform/src/main/java/com/plate/boot/relational/rsocket/MessageIn.java @@ -1,9 +1,11 @@ package com.plate.boot.relational.rsocket; +import com.plate.boot.commons.utils.ContextUtils; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; +import java.time.LocalDateTime; /** * @author Alex Bob @@ -12,6 +14,8 @@ @NoArgsConstructor public class MessageIn implements Serializable { + private String code; + private LocalDateTime time; private MessageType type; private String content; private Object data; @@ -22,6 +26,8 @@ public MessageIn(MessageType type, String content, Object data) { this.type = type; this.content = content; this.data = data; + this.data = ContextUtils.nextId(); + this.time = LocalDateTime.now(); } public static MessageIn of(MessageType type, String content, Object data) { diff --git a/boot/platform/src/main/java/com/plate/boot/security/SecurityController.java b/boot/platform/src/main/java/com/plate/boot/security/SecurityController.java index f54708d7..5411734d 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/SecurityController.java +++ b/boot/platform/src/main/java/com/plate/boot/security/SecurityController.java @@ -29,7 +29,7 @@ public class SecurityController { private final WebSessionServerSecurityContextRepository securityContextRepository = new WebSessionServerSecurityContextRepository(); - private final UserSecurityManager userSecurityManager; + private final SecurityManager securityManager; private final PasswordEncoder passwordEncoder; private final ServerOAuth2AuthorizedClientRepository clientRepository; @@ -68,7 +68,7 @@ public Mono changePassword(@Valid @RequestBody ChangePasswordReques } String newPassword = this.passwordEncoder.encode(request.getNewPassword()); UserDetails userDetails = (UserDetails) authentication.getDetails(); - return this.userSecurityManager.updatePassword(userDetails, newPassword); + return this.securityManager.updatePassword(userDetails, newPassword); } @Data diff --git a/boot/platform/src/main/java/com/plate/boot/security/UserSecurityManager.java b/boot/platform/src/main/java/com/plate/boot/security/SecurityManager.java similarity index 99% rename from boot/platform/src/main/java/com/plate/boot/security/UserSecurityManager.java rename to boot/platform/src/main/java/com/plate/boot/security/SecurityManager.java index a5c38012..7e3ea537 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/UserSecurityManager.java +++ b/boot/platform/src/main/java/com/plate/boot/security/SecurityManager.java @@ -39,7 +39,7 @@ @Log4j2 @Service @RequiredArgsConstructor -public class UserSecurityManager extends AbstractDatabase +public class SecurityManager extends AbstractDatabase implements ReactiveUserDetailsService, ReactiveUserDetailsPasswordService { private final static String QUERY_GROUP_MEMBERS_SQL = """ diff --git a/boot/platform/src/main/java/com/plate/boot/security/oauth2/Oauth2UserService.java b/boot/platform/src/main/java/com/plate/boot/security/oauth2/Oauth2UserService.java index 4d8284d1..e314b389 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/oauth2/Oauth2UserService.java +++ b/boot/platform/src/main/java/com/plate/boot/security/oauth2/Oauth2UserService.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.plate.boot.commons.utils.ContextUtils; import com.plate.boot.security.SecurityDetails; -import com.plate.boot.security.UserSecurityManager; +import com.plate.boot.security.SecurityManager; import com.plate.boot.security.core.user.User; import com.plate.boot.security.core.user.UserRequest; import lombok.RequiredArgsConstructor; @@ -32,7 +32,7 @@ public class Oauth2UserService extends DefaultReactiveOAuth2UserService { private static final SecureRandom SECURE_RANDOM = new SecureRandom(); - private final UserSecurityManager userSecurityManager; + private final SecurityManager securityManager; public static String generateRandoPassword() { byte[] randomBytes = new byte[16]; @@ -49,7 +49,7 @@ public Mono loadUser(OAuth2UserRequest userRequest) throws OAuth2Aut } public Mono loadLocalUser(String registrationId, OAuth2User oAuth2User) { - return this.userSecurityManager.loadByOauth2(registrationId, oAuth2User.getName()) + return this.securityManager.loadByOauth2(registrationId, oAuth2User.getName()) .delayUntil(user -> this.modifyUser(user, registrationId, oAuth2User)) .switchIfEmpty(Mono.defer(() -> this.registerUser(registrationId, oAuth2User))) .map(user -> this.convertToOauth2User(user, oAuth2User)); @@ -69,12 +69,12 @@ public Mono modifyUser(User user, String registrationId, OAuth2User oAuth2 oauth2.set("registrationId", request.getExtend().get("oauth2").get(registrationId)); oldExtend.set("oauth2", oauth2); request.setExtend(oldExtend); - return this.userSecurityManager.registerOrModifyUser(request).then(); + return this.securityManager.registerOrModifyUser(request).then(); } public Mono registerUser(String registrationId, OAuth2User oAuth2User) { var request = this.convertToUserRequest(registrationId, oAuth2User); - return this.userSecurityManager.registerOrModifyUser(request); + return this.securityManager.registerOrModifyUser(request); } public UserRequest convertToUserRequest(String registrationId, OAuth2User oAuth2User) {