diff --git a/pom.xml b/pom.xml
index 6cae0c1..ef39dfe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -119,6 +119,15 @@
true
+
+ org.springframework.boot
+ spring-boot-starter-data-r2dbc
+
+
+ io.r2dbc
+ r2dbc-postgresql
+ 0.8.13.RELEASE
+
org.mapstruct
mapstruct
diff --git a/src/main/java/com/zsc/edu/dify/framework/security/JpaUserDetailsServiceImpl.java b/src/main/java/com/zsc/edu/dify/framework/security/JpaUserDetailsServiceImpl.java
index 0570adb..a3adedb 100644
--- a/src/main/java/com/zsc/edu/dify/framework/security/JpaUserDetailsServiceImpl.java
+++ b/src/main/java/com/zsc/edu/dify/framework/security/JpaUserDetailsServiceImpl.java
@@ -6,10 +6,12 @@ import com.zsc.edu.dify.modules.system.entity.*;
import com.zsc.edu.dify.modules.system.repo.*;
import com.zsc.edu.dify.modules.system.service.DeptService;
import com.zsc.edu.dify.modules.system.service.RoleService;
+import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
diff --git a/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java b/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java
index ea6d687..dcb04a9 100644
--- a/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java
+++ b/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java
@@ -24,7 +24,6 @@ import javax.sql.DataSource;
/**
* @author harry_yao
*/
-//@EnableWebFluxSecurity
@AllArgsConstructor
@EnableMethodSecurity
@Configuration
diff --git a/src/main/java/com/zsc/edu/dify/framework/security/flux/FluxUserDetailServiceImpl.java b/src/main/java/com/zsc/edu/dify/framework/security/flux/FluxUserDetailServiceImpl.java
new file mode 100644
index 0000000..338964f
--- /dev/null
+++ b/src/main/java/com/zsc/edu/dify/framework/security/flux/FluxUserDetailServiceImpl.java
@@ -0,0 +1,83 @@
+package com.zsc.edu.dify.framework.security.flux;
+import com.zsc.edu.dify.common.util.TreeUtil;
+import com.zsc.edu.dify.exception.StateException;
+import com.zsc.edu.dify.framework.security.UserDetailsImpl;
+import com.zsc.edu.dify.modules.system.entity.Dept;
+import com.zsc.edu.dify.modules.system.entity.Menu;
+import com.zsc.edu.dify.modules.system.entity.Role;
+import com.zsc.edu.dify.modules.system.entity.UserRole;
+import com.zsc.edu.dify.modules.system.repo.flux.*;
+import com.zsc.edu.dify.modules.system.service.DeptService;
+import lombok.AllArgsConstructor;
+import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Service;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhuang
+ */
+@AllArgsConstructor
+@Service
+public class FluxUserDetailServiceImpl implements ReactiveUserDetailsService {
+
+ private final UserFluxRepository userRepo;
+ private final MenuFluxRepository menuRepository;
+ private final RoleFluxRepository roleFluxRepository;
+ private final UserRoleFluxRepository userRoleFluxRepository;
+ private final DeptService deptService;
+ @Override
+ public Mono findByUsername(String username) {
+ return userRepo.findByUsername(username)
+ .flatMap(user -> {
+ if (!user.getEnableState()) {
+ return Mono.error(new StateException("用户 '" + username + "' 已被禁用!请联系管理员"));
+ }
+ // 先获取UserRole列表,并从中提取roleIds
+ return userRoleFluxRepository.findByUserId(user.getId()).collectList()
+ .flatMap(userRoles -> Mono.zip(
+ roleFluxRepository.findByDeptId(user.getDeptId()),
+ deptService.listFluxTree(user.getDeptId()),
+ menuRepository.findByRoleId(user.getRoleId())
+ ))
+ .flatMap(tuple -> {
+ Role role = (Role) tuple.getT1();
+ List depts = (List) tuple.getT2();
+ List