Spring Security自定义身份验证失败处理程序重定向参数

时间:2017-05-08 01:52:17

标签: spring spring-security

我遇到Spring Security身份验证失败处理程序重定向参数问题。

在我使用

时的安全配置中
failureUrl("/login.html?error=true")

它有效。但是当我使用自定义身份验证失败处理程序(如下所示)时,它总是返回:url/login.html

getRedirectStrategy().sendRedirect(request, response, "/login.html?error=true");

response.sendRedirect(request.getContextPath() + "/login.html?error=true");

我不知道什么是错的。为什么它不显示参数?error=true

信息:我正在使用Spring + JSF + Hibernate + Spring Security

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login.html")
            .usernameParameter("j_username")
            .passwordParameter("j_password")
            .loginProcessingUrl("/j_spring_security_check")
            .failureHandler(customAuthenticationFailureHandler)// .failureUrl("/login.html?error=true")//.successHandler(authSuccsessHandler)
            .defaultSuccessUrl("/dashboard.html")
            .permitAll()
            .and()
        .logout()
            .invalidateHttpSession(true)
            .logoutSuccessUrl("/")
            .permitAll()
            .and()
        .exceptionHandling()
            .accessDeniedPage("/access.html")
            .and()
        .headers()
            .defaultsDisabled()
            .frameOptions()
            .sameOrigin()
            .cacheControl();

    http
        .csrf().disable();
}

这是自定义身份验证失败处理程序:

@Component
public class CustomAuthFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException exception) throws IOException, ServletException {
        getRedirectStrategy().sendRedirect(request, response, "/login.html?error=true");

    }
}

我会在某些情况下更改参数。

1 个答案:

答案 0 :(得分:-1)

在OAuth令牌失败的情况下,我得到的响应低于响应,这与应用程序的响应方式不一致。

    {
    "error": "invalid_token",
    "error_description": "Invalid access token: 4cbc6f1c-4d47-44bd-89bc-92a8c86d88dbsdfsdfs"
}

我只是想使用公共响应对象来保持一致性。 以下方法对我有用。 使用自定义入口点对象构建资源服务器

@Override
  public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
    resources.authenticationEntryPoint(new CustomOAuth2AuthenticationEntryPoint());
  } 

这是您的自定义入口点

 public class CustomOAuth2AuthenticationEntryPoint extends OAuth2AuthenticationEntryPoint{

  public CustomOAuth2AuthenticationEntryPoint() {
    super.setExceptionTranslator(new CustomOAuth2WebResponseExceptionTranslator());
  }
}

这是您的自定义WebResponseExceptionTranslator,就我而言,我刚刚使用了DefaultWebResponseExceptionTranslator的副本并重写了handleOAuth2Exception方法。

CustomOAuth2WebResponseExceptionTranslator implements WebResponseExceptionTranslator<Response> {
....
.....
 private ResponseEntity<Response> handleOAuth2Exception(OAuth2Exception e) throws IOException {

        int status = e.getHttpErrorCode();
        HttpHeaders headers = new HttpHeaders();
        headers.set("Cache-Control", "no-store");
        headers.set("Pragma", "no-cache");
        if (status == HttpStatus.UNAUTHORIZED.value() || (e instanceof InsufficientScopeException)) {
            headers.set("WWW-Authenticate", String.format("%s %s", OAuth2AccessToken.BEARER_TYPE, e.getSummary()));
        }

        ResponseEntity<Response> response =new ResponseEntity<>(new Response().message(e.getMessage()).status(StatusEnum.ERROR)
            .errorType(e.getClass().getName()), HttpStatus.UNAUTHORIZED);
        return response;

    }

结果看起来像

    {
    "status": "error",
    "message": "Invalid access token: 4cbc6f1c-4d47-44bd-89bc-92a8c86d88dbsdfsdfs",
    "error_type": "org.springframework.security.oauth2.common.exceptions.InvalidTokenException"
}