AuthenticationException会发生什么?

时间:2014-08-15 13:01:48

标签: spring-security spring-boot

我有一个启用了spring-security的spring-boot应用程序。我有一个自定义的 AbstractPreAuthenticatedProcessingFilter ,用于检查外部系统设置的某些身份验证令牌的请求标头。如果令牌不存在或无效,则相应的 AuthenticationManager 将抛出 AuthenticationException 。看起来很简单。

我的问题是,我希望能够通过回复403(禁止)状态来处理此 AuthenticationException 。我该怎么做?我尝试将以下内容添加到 WebSecurityConfigurerAdapter

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http.exceptionHandling()
       .authenticationEntryPoint(new Http403ForbiddenEntryPoint());
    ...

但它不起作用。问题是假设(如果我理解正确)处理这些事情的 ExceptionTranslationFilter 是默认安全过滤器链中的最后一个过滤器,抛出的异常永远不会到达它。我完全卡住了。这应该怎么样?请帮忙!

1 个答案:

答案 0 :(得分:1)

很久以前你的问题已经完成,但我没有解决方案就陷入了同样的问题,所以我决定解释如何解决这个问题。

您可以编辑FilterChain,您可以在PreAuthenticationFilter之前放置一个ExceptionTranslationFilter作为...

        http
        .csrf().disable()
        .addFilter(myPreAuthenticationFilter)
        .addFilterBefore(new ExceptionTranslationFilter(
             new Http403ForbiddenEntryPoint()), 
             myPreAuthenticationFilter.getClass()
         )
        .authorizeRequests()
            .antMatchers(authSecuredUrls).authenticated()
            .anyRequest().permitAll()
            .and()
        .httpBasic()
            .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
        ;

如果没有提供任何凭据,则您的AbstractPreAuthenticatedProcessingFilter getPreAuthenticatedCredentials或getPreAuthenticatedPrincipal方法可能会抛出AuthenticationException。

    if ( !StringUtils.hasText(request.getParameter("MY_TOKEN")) ) {
        throw new BadCredentialsException("No pre-authenticated principal found in request");
    }

或者您的AuthenticationManager身份验证方法也可以抛出AuthenticationException。