복붙노트

[SPRING] Spring Security 커스텀 인증 실패 핸들러가 매개 변수로 리디렉션

SPRING

Spring Security 커스텀 인증 실패 핸들러가 매개 변수로 리디렉션

Spring 보안 인증 실패 핸들러가 매개 변수로 리디렉션하는 데 문제점이 있습니다.

보안 설정에서 사용할 때

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?

Info : 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. ==============================

    1.URL /login.html?error=true에 대한 익명 액세스를 허용하지 않았으므로 로그인 페이지 (/login.html)로 리디렉션됩니다.

    URL /login.html?error=true에 대한 익명 액세스를 허용하지 않았으므로 로그인 페이지 (/login.html)로 리디렉션됩니다.

    AbstractAuthenticationFilterConfigurer # permitAll은 실패 URL에 대한 액세스 권한을 (모든 사용자에게) 허용하지만 사용자 정의 오류 처리기에 대해서는 허용하지 않습니다.

    AbstractRequestMatcherRegistry # antMatchers를 사용하여 명시 적으로 액세스를 허용해야합니다.

    ExpressionUrlAuthorizationConfigurer.AuthorizedUrl # permitAll :

    AntPathRequestMatcher가 쿼리 문자열을 무시하기 때문에 정확한 URL /login.html?error=true를 허용하지 않아도됩니다.

    수정 된 구성 :

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
        http
            .authorizeRequests()
                .antMatchers("/login.html").permitAll()
                .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();
    }
    
  2. from https://stackoverflow.com/questions/43838639/spring-security-custom-authentication-failure-handler-redirect-with-parameter by cc-by-sa and MIT license