当前位置: 首页 > 知识库问答 >
问题:

无法捕获Java中的异常

宣望
2023-03-14

我通过激发Baeldung在Spring Security页面上的防止暴力身份验证尝试,为我的登录服务实现了暴力阻止机制,如下所示:

@Service
@RequiredArgsConstructor
public class LoginServiceImpl implements LoginService {

    private final UserService userService;
    private final LoginAttemptService loginAttemptService;

    public UserTokenDTO login(final LoginRequest request) {        

        if(!user.isValid) {
            throw new InvalidCredentialsException();
        }
        // code omitted for brevity
    }
}

当用户未经验证时,LoginService抛出InvalidCredentialException(),然后我试图在AuthenticationFailureListener类中捕获此异常:

@Component
public class AuthenticationFailureListener implements 
    ApplicationListener<AuthenticationFailureBadCredentialsEvent> {

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private LoginAttemptService loginAttemptService;

    @Override
    public void onApplicationEvent(final AuthenticationFailureBadCredentialsEvent e) {
        final String xfHeader = request.getHeader("X-Forwarded-For");
        if (xfHeader == null) {
            loginAttemptService.loginFailed(request.getRemoteAddr());
        } else {
            loginAttemptService.loginFailed(xfHeader.split(",")[0]);
        }
    }
}

当出现错误时,则登录测试服务。将调用loginFailed()方法。然而,我无法在我的应用程序事件()中捕捉异常。我尝试过使用不同的事件类型,但对于某些事件,例如,每个事件都会触发它,只有在引发InvalidCredentialsException时,用户未经身份验证时,我才应该触发它。

在进行搜索之后,我发现我需要进行配置,以便Spring Security在失败或成功时捕捉这些事件。但是定义不明确,我想也许可以通过在我的AuthenticationFailureListener类中使用正确的事件类型来捕捉事件。我还有一个事件处理程序类,但我不确定它是否有帮助。

更新:这是我的SecurityConfig。我仍然无法触发AuthenticationFailureBadCreentalsEvent并且无法在Application ationEvent上获得任何异常

@EnableWebSecurity
@AllArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    AuthenticationFailureHandler eventAuthenticationFailureHandler() {
        return new CustomAuthenticationFailureHandler();
    }

    private final AuthenticationFailureHandler eventAuthenticationFailureHandler;

    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .formLogin().failureHandler(eventAuthenticationFailureHandler)
                .and()
                .httpBasic();
    }
}

共有1个答案

傅琦
2023-03-14

如回答中所述:

如果身份验证成功,将通过应用程序上下文发布InteractiveAuthenticationSuccessEvent。如果身份验证失败,则不会发布任何事件,因为这通常会通过AuthenticationManager特定的应用程序事件进行记录。

 类似资料:
  • 所以 我有一个函数,有一个回调,所以我把它包装在一个挂起函数使用,但当它错误了,它是崩溃整个应用程序。 这里有一个概念是正在发生的事情。 2022-03-04 16:09:45.410 19289-19438/in.app.androidE/AndreidRuntime: FATAL EXCEPTION: DefaultDispatcher-Worers-3进程:in.app.android,PI

  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行

  • 我正在尝试使用以下代码使用流 API 获取 S3 对象的文件大小: 如果该项不存在,我会得到以下错误: [2015年10月13日星期二23:03:32][错误][客户端54.225.205.152]PHP警告:找不到文件或目录:s3://mybucket/myfile.jpg在/var/www/vendor/Aws/Aws-SDK-PHP/src/Aws/S3/stream wrapper . P

  • 问题内容: 如果我没记错的话,应该首先捕获Exception的子类。但是必须捕获任何RuntimeException和一个具体的经过检查的Exception,首先应该捕获它们吗? 这个命令正确吗?还是正确但错误的选择? 问题答案: 顺序是 先匹配的,然后执行 (正如JLS清楚地解释的)。 如果第一个catch匹配到异常,则执行,否则,将尝试下一个,并不断重复直到匹配或不匹配。 因此,在捕获异常时,

  • 问题内容: 我们在工作中使用JUnit 3,并且没有注释。我想在我们的代码中添加一个实用程序来包装它: 所以我尝试了这个: 但是,我认为Java无法在catch块中使用通用异常类型。 围绕Java限制,我该怎么做? 有没有办法检查变量的类型? 问题答案: 您可以传入Class对象并以编程方式进行检查。 我不确定您是否要重新扔球;重新抛出将同样导致测试失败/错误,但是从语义上讲我不会,因为它基本上意

  • 我目前正在开发一个基于插件架构的游戏。该可执行文件主要由一个共享库加载程序和几个接口定义组成。所有有趣的事情都发生在启动时加载的动态共享库中。 其中一个库类在某些情况下引发异常。我希望能够捕捉到这个异常并用它做有用的事情,但这就是它变得奇怪的地方。请参见以下简化示例代码: application.cpp plugin.cpp cpp存在于一个成功加载的动态共享库中,该库随后创建了一个类plugin