복붙노트

[SPRING] 403 대신 Spring Boot 2를 사용하십시오.

SPRING

403 대신 Spring Boot 2를 사용하십시오.

Spring Boot 1.5.6.RELEASE 다음과 같이하여 인증없이 uri를 요청하는 경우 스프링 보안 응답을 무단으로 만드는 방법 (http 401 코드)에서 설명한 것처럼 403 대신 HTTP 상태 코드 401을 보낼 수있었습니다.

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //...
        http.exceptionHandling()
                .authenticationEntryPoint(new Http401AuthenticationEntryPoint("myHeader"));
        //...
    }
}

org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint 클래스를 사용한다.

방금 Spring Boot 2.0.0.RELEASE로 업그레이드했는데 더 이상 그런 패키지가 없다는 것을 발견했습니다.

큐: 이 클래스 (Http401AuthenticationEntryPoint)가 아직 Spring Boot에 존재합니까? 없다면 403 대신이 상태 코드 (401)에 의존하는 다른 구현과의 일관성을 유지하기 위해 기존 프로젝트에서 동일한 동작을 유지하는 좋은 대안이 될 수 있습니까?

해결법

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

    1.org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint 클래스가 org.springframework.security.web.authentication.HttpStatusEntryPoint를 위해 제거되었습니다.

    org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint 클래스가 org.springframework.security.web.authentication.HttpStatusEntryPoint를 위해 제거되었습니다.

    내 경우에는 코드가 이렇게됩니다 :

    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //...
            http.exceptionHandling()
                    .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
            //...
        }
    }
    
  2. ==============================

    2.Http401AuthenticationEntryPoint가 제거되었습니다 (10715 참조).

    Http401AuthenticationEntryPoint가 제거되었습니다 (10715 참조).

    요구 사항에 따라 다음을 사용할 수 있습니다.

  3. ==============================

    3.그냥 @ lealceldeiro의 대답을 정교하게 :

    그냥 @ lealceldeiro의 대답을 정교하게 :

    Spring Boot 2 이전에 나의 보안 설정 클래스는 다음과 같이 보였다.

    @Configuration
    public class MyConfig extends WebSecurityConfigurerAdapter {
    
        @Bean
        public Http401AuthenticationEntryPoint securityException401EntryPoint() {
          return new Http401AuthenticationEntryPoint("Bearer realm=\"webrealm\"");
        }
    
        @Autowired
        private Http401AuthenticationEntryPoint authEntrypoint;
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
          // some http configuration ...
    
          // Spring Boot 1.5.x style
          http.exceptionHandling().authenticationEntryPoint(authEntrypoint);
        }
    //...
    }
    

    이제 스프링 부트 2에서는 다음과 같이 보입니다.

    @Configuration
    public class MyConfig extends WebSecurityConfigurerAdapter {
    
        //Bean configuration for Http401AuthenticationEntryPoint can be removed
    
        //Autowiring also removed
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
          // some http configuration ...
    
          // Spring Boot 2 style
          http.exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
        }
    //...
    }
    

    여기에 또한보십시오 : https://github.com/spring-projects/spring-boot/issues/10715#issuecomment-363592444

  4. ==============================

    4.AuthenticationEntryPoint 클래스를 재정의하여 논리를 사용자 정의 할 수 있습니다. 이게 효과가 있어야합니다 :

    AuthenticationEntryPoint 클래스를 재정의하여 논리를 사용자 정의 할 수 있습니다. 이게 효과가 있어야합니다 :

    @Component public class AuthEntryPointException implements AuthenticationEntryPoint, Serializable {
    
        private static final long serialVersionUID = -8970718410437077606L;
    
        @Override
        public void commence(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException authException) throws IOException {
            response.setStatus(HttpStatus.SC_UNAUTHORIZED);
            response.setContentType("application/json");
            response.getWriter().write("{\"result\":\"UNAUTHORIZED\",\"message\":\"UNAUTHORIZED or Invalid Token\"}");
        }
    }
    
  5. from https://stackoverflow.com/questions/49241384/401-instead-of-403-with-spring-boot-2 by cc-by-sa and MIT license