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 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) {