vv0885 2024-02-11 12:26 采纳率: 0%
浏览 9
已结题

OpenFeign在UserDetailsService中调用不成功

OpenFeign,通过SpringSecurity的UserDetailsService实现类中的loadUserByUsername方法内,不能调用成功;在通过Controller的调用时是成功的
UserDetailsService实现类代码

@Service
public class MyUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Object user = userClient.login(username);
        ......
    }
    @Resource
    private UserClient userClient;
}

UserClient代码

@FeignClient(name = "user-service-provider", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/login/username/{username}")
    Object login(@PathVariable String username);
}

UserClientFallback代码

public class UserClientFallback implements MSUserClient {
    @Override
    public Object login(String username) {
        return "Error";
    }
}

开源包版本信息

<properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>
        <spring.cloud.version>4.0.0</spring.cloud.version>
    </properties>
......
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>4.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
......
  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-11 12:26
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    在Spring Boot项目中,您尝试通过UserDetailsService实现类使用OpenFeign调用远程服务。根据您提供的信息,问题在于在MyUserDetailsServiceloadUserByUsername方法内无法成功调用UserClient的接口方法。

    首先,请确认以下排查步骤:

    1. 启动依赖的服务: 确保“user-service-provider”服务已经启动并且其 /login/username/{username} 端点可以正常响应请求。

    2. OpenFeign配置正确性: 虽然您没有提供全局的OpenFeign配置,但请确保您的application.ymlapplication.properties文件中有正确的服务发现配置(例如Eureka、Consul或者Nacos),使得OpenFeign能够找到并连接到“user-service-provider”。

    3. 安全上下文与生命周期: Spring Security的UserDetailsService通常在Security框架初始化期间被调用,此时可能由于Spring容器还未完全初始化完成,导致注入的UserClient实例尚未准备好。您需要确保在Security相关组件初始化之后再进行依赖注入。

    4. 检查日志: 查看应用启动日志,寻找有关OpenFeign客户端初始化失败或调用失败的相关错误信息。

    5. 开启Feign的日志打印: 为了更好地调试问题,可以通过添加如下配置来开启Feign的日志输出,以便查看详细的请求和响应情况:

      feign:
        client:
          config:
            default:
              loggerLevel: FULL # 或 BASIC
      
    6. 事务管理: 如果loadUserByUsername方法内部涉及事务管理,而OpenFeign调用时可能导致事务传播不正确,请检查事务配置。

    针对可能的问题,一种解决方案是在MyUserDetailsService类上添加@Lazy注解以延迟加载该bean,确保在OpenFeign客户端初始化完成后才执行注入:

    @Service
    public class MyUserDetailsService implements UserDetailsService {
        @Lazy
        @Resource
        private UserClient userClient;
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            Object user = userClient.login(username);
            // ...
        }
    }
    

    然而,通常情况下,将远程服务调用放在UserDetailsService中并不是最佳实践,因为这可能会增加系统的复杂性和耦合度。建议您考虑将此类逻辑移动到一个独立的服务层,并在Controller或其他适合的地方调用。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月19日
  • 创建了问题 2月11日

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图