微服务项目中,我使用webflux的SpringSecurity部署在网关。在findByUsername函数里面,我调用ReactiveFeignClient接口去其他微服务那里根据用户名获取用户信息,但没有任何信息,ReactiveFeignClient不报错也不返回任何信息。我又将findByUsername函数里面的代码转移到controller里面进行测试调用,发现可以获取到用户信息。这是什么情况,ReactiveFeignClient不能够在findByUsername函数里面使用吗?
UserDetailsServiceImpl代码:
package com.example.servicegateway.service.impl;
import com.example.servicegateway.entity.LoginUser;
import com.example.servicegateway.entity.Users;
import com.example.servicegateway.exception.LoginErrorException;
import com.example.servicegateway.feign.FeignPermission;
import com.example.servicegateway.feign.FeignRolePermission;
import com.example.servicegateway.feign.FeignUsers;
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
public class UserDetailsServiceImpl implements ReactiveUserDetailsService {
private final FeignUsers feignUsers;
private final FeignRolePermission rolePermissionFeign;
private final FeignPermission permissionFeign;
public UserDetailsServiceImpl(FeignUsers feignUsers, FeignRolePermission rolePermissionFeign, FeignPermission permissionFeign) {
this.feignUsers = feignUsers;
this.rolePermissionFeign = rolePermissionFeign;
this.permissionFeign = permissionFeign;
}
@Override
public Mono<UserDetails> findByUsername(String username) {
System.out.println("收到用户名:" + username);
return feignUsers.selectOneByName(username)
.flatMap(usersApiResponse -> {
if (usersApiResponse.getCode() == 200) {
Users user = usersApiResponse.getData();
System.out.println("用户数据:" + user);
return rolePermissionFeign.selectByRoleId(user.getRoleid())
.doOnSubscribe(s -> System.out.println("rolePermissionFeign已订阅"))
.doOnNext(rp -> System.out.println("rolePermissionFeign 返回: " + rp))
.flatMapMany(rolePermissionApiResponse -> Flux.fromIterable(rolePermissionApiResponse.getData()))
.doOnNext(rp -> System.out.println("单个角色权限: " + rp))
.flatMap(rolePermission ->
permissionFeign.selectOne(rolePermission.getPermissionid())
.doOnNext(pr -> System.out.println("permissionFeign 返回: " + pr))
)
.map(permissionApiResponse -> permissionApiResponse.getData().getName())
.collectList()
.map(permissions -> new LoginUser(user, permissions));
} else {
return Mono.error(new LoginErrorException(usersApiResponse.getMessage()));
}
})
.doOnError(e -> System.out.println("出错了:" + e.getMessage()))
.cast(UserDetails.class)
.doFinally(signalType -> System.out.println("链路结束:" + signalType));
}
}
