복붙노트

[SPRING] 요청 매개 변수가 작동하지 않는 인증 실패 리디렉션

SPRING

요청 매개 변수가 작동하지 않는 인증 실패 리디렉션

내 자신의 성공과 인증 실패 처리기를 구성하려고합니다. 인증 실패시 요청 매개 변수를 사용하여 로그인 페이지로 다시 리디렉션하려는 경우이 매개 변수가 있으면 로그인 페이지에 오류 메시지가 출력됩니다. 그러나 오류가 발생해도 내 로그인 페이지로 다시 리디렉션되고 있지만 요청 매개 변수는 항상 null입니다.

아래 코드 :

protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login.html").permitAll() 
            .usernameParameter("username")
            .passwordParameter("password")                                               
            .loginProcessingUrl("/login")
            .successHandler(successHandler())
            .failureHandler(handleAuthenticationFailure());
}

@Autowired
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    //database checks
}
};
}

/**
 * Authentication success handler defines action when successfully authenticated
 * @return
 */
@Bean
public AuthenticationSuccessHandler successHandler(){
    return new AuthenticationSuccessHandler() {

        @Override
        public void onAuthenticationSuccess(HttpServletRequest httpRequest, HttpServletResponse httpResponse, Authentication authentication)
                throws IOException, ServletException {

            // custom auth success here
            httpResponse.setStatus(HttpServletResponse.SC_OK);
            SavedRequest savedRequest = (SavedRequest) httpRequest.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST");
            httpResponse.sendRedirect(savedRequest.getRedirectUrl());
        }
    };
}

@Bean
public AuthenticationFailureHandler handleAuthenticationFailure() {
    return new SimpleUrlAuthenticationFailureHandler() {

        @Override
        public void onAuthenticationFailure(HttpServletRequest httpRequest, HttpServletResponse httpResponse,
                                            AuthenticationException authenticationException) throws IOException, ServletException {

            // custom failure code here
            setDefaultFailureUrl("/login.html?error=fail");
            super.onAuthenticationFailure(httpRequest, httpResponse, authenticationException);
        }
    };
}

해결법

  1. ==============================

    1.다음과 같이 시도해보십시오.

    다음과 같이 시도해보십시오.

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

    최신 정보:

    "/login.html?error=fail"이 authorizeRequests () 섹션에 추가되는 것이 중요합니다. 그렇지 않으면 컨트롤러가 error 매개 변수를 선택하지 않습니다.

    .antMatchers ( "/ login **")를 사용하여 .antMatchers ( "/ login"). permitAll ()을 바꾸십시오.

  2. ==============================

    2.또한 params에 문제가있었습니다 (필자의 경우 로그인이 실패하고 params없이 로그인 페이지로 리디렉션 된 url에 요청 매개 변수가 추가됨).

    또한 params에 문제가있었습니다 (필자의 경우 로그인이 실패하고 params없이 로그인 페이지로 리디렉션 된 url에 요청 매개 변수가 추가됨).

    이게 내 문제를 해결했다.

    .antMatchers("/login**").permitAll()
    
  3. ==============================

    3.저는 스프링 부트 (spring boot)의 새로운 기능입니다. 스프링 부트 2.1.4.RELEASE를 사용한다면이 구성을 시도하십시오.

    저는 스프링 부트 (spring boot)의 새로운 기능입니다. 스프링 부트 2.1.4.RELEASE를 사용한다면이 구성을 시도하십시오.

    http.csrf().disable()
                .authorizeRequests()
                // URLs matching for access rights
                .antMatchers("/").permitAll()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
                // form login
                .formLogin()
                .loginPage("/login")
                .failureUrl("/login?error=true")
                .successHandler(sucessHandler)
                .usernameParameter("email")
                .passwordParameter("password")
                .and()
                // logout
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/").and()
                .exceptionHandling()
                .accessDeniedPage("/access-denied");
    

    위에서 정의한 스프링 보안 구성을 사용하려면 웹 애플리케이션에 첨부해야합니다. 이 경우 web.xml은 필요하지 않습니다.

    public class SpringApplicationInitializer 
    
    
    extends AbstractAnnotationConfigDispatcherServletInitializer {
    
    
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SecSecurityConfig.class};
    }}
    

    즉, 자동으로 인스턴스화되는 다음 클래스를 생성합니다.

    SecSecurityConfig.class : 모든 http.csrf (). disable (). authorizeRequests () ... 구성을 수행하는 클래스입니다.

    출처 : https://www.baeldung.com/spring-security-login

    희망이 도움이 :)

  4. from https://stackoverflow.com/questions/42181252/authentication-failure-redirect-with-request-params-not-working by cc-by-sa and MIT license