【问题标题】:Unauthorized Error while Trying to Debug Spring Boot Rest Application尝试调试 Spring Boot Rest 应用程序时出现未经授权的错误
【发布时间】:2020-12-03 10:26:59
【问题描述】:

我正在使用 Rest Controller 开发 Spring Boot 应用程序。

当我尝试使用 Intellij IDEA 调试应用程序时,通过右键单击 MyApplication>Debug 或 Run>Debug,应用程序启动并且调试器说它已连接。 但是我的控制器中没有一个断点被触发,并且所有请求都开始失败并出现 401 未授权。如果我在没有调试的情况下运行,一切正常。

如果某些东西拒绝了所有状态为 401 的传入请求,这就是没有触发断点的原因。我的代码永远不会执行。但是为什么在调试模式下请求失败并出现 401 呢?

【问题讨论】:

    标签: spring spring-boot debugging intellij-idea


    【解决方案1】:

    如下修改主类的@SpringBootApplication注解即可解决问题。

    @SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
    

    这会排除和禁用 Spring Boot 关于安全性的自动配置。它尝试使用默认用户和生成的密码来保护 API。

    但我还是不明白为什么这个安全自动配置只在调试时被激活,而在正常运行时保持禁用。

    【讨论】:

      【解决方案2】:

      我将尝试用您提供的有限信息来回答这个问题(没有代码,也没有最小的可重现示例)。

      Spring security 使用面向方面的编程来提供安全机制。它通过执行一些额外的代码来实现这一点,这些代码不属于您使用代理编写的代码的一部分。面向切面的编程可以通过以下方式执行一些额外的代码

      1. 之前:在您的代码执行之前执行代码
      2. 之后:代码在您的方法之后执行
      3. AfterReturning:在您的方法成功返回后执行代码
      4. AfterThrowing:代码在您的代码引发异常后执行
      5. 周围:代码在之前和之后执行

      在安全的情况下,这通常在方法之前完成。因此,在这种情况下,首先检查您是否获得授权。在这种情况下,您不是,因此该方法不会被执行。

      【讨论】:

      • 项目不包括 Spring Security(pom.xml 中没有依赖项)存在 AOP 依赖项,并且我使用 @Before 定义了一个方面。但即使是那方面的断点也没有被触发。问题是当应用程序在启用调试的情况下运行时,否则一切都按预期工作。行为会根据它是否在调试器中运行而发生变化。我将编辑我的帖子以包含一些示例代码
      • 好的,但是如果你使用的是 Spring boot,那么有一个类 SecurityAutoConfiguration 默认配置 Spring Security。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      相关资源
      最近更新 更多