programing

Spring Boot 2의 경우 403 대신 401

i4 2023. 7. 20. 21:42
반응형

Spring Boot 2의 경우 403 대신 401

스프링 부트 1.5.6 포함.릴리스 HTTP 상태 코드를 보낼 수 있었습니다.401대신에403인증 없이 uri를 요청할 경우 스프링 보안 응답을 무단(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으로 업그레이드했습니다.릴리스하고 해당 클래스가 더 이상 없습니다(적어도 해당 패키지에는).

질문:

  • 이 클래스를 합니까?Http401AuthenticationEntryPoint) Spring Boot에 아직 존재합니까?

  • 그렇지 않은 경우, 이 상태 코드에 의존하는 다른 구현과 일관성을 유지하기 위해 기존 프로젝트에서 동일한 동작을 유지하기 위한 좋은 대안이 될 수 있습니다.401대신에403?


이것은 특히 SpringBoot 2를 지칭하기 때문에 403이 아닌 SpringSecurity anonymous 401과는 다릅니다(SpringBoot 버전 2에서는 더 이상 적용할 수 없는 솔루션이 있거나 다른 솔루션은 전혀 필요하지 않습니다).

조심하다.

기본적으로 스프링 부트 2는 다음 시간에 반환됩니다.spring-boot-starter-security종속성으로 추가되고 무단 요청이 수행됩니다.

보안 메커니즘 동작을 수정하기 위해 일부 사용자 지정 구성을 배치하는 경우 변경될 수 있습니다.만약 그게 사실이고 당신이 정말로 강요할 필요가 있다면.401상태를 확인한 후 아래 원본 게시물을 읽으십시오.

원본 게시물

학급.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));
        //...
    }
}

보너스

응답 본문의 일부 정보를 반환하거나 응답을 사용자 정의해야 하는 경우 다음과 같은 작업을 수행할 수 있습니다.

1 - 확장AuthenticationEntryPoint

public class MyEntryPoint implements AuthenticationEntryPoint {
    private final HttpStatus httpStatus;
    private final Object responseBody;

    public MyEntryPoint(HttpStatus httpStatus, Object responseBody) {
        Assert.notNull(httpStatus, "httpStatus cannot be null");
        Assert.notNull(responseBody, "responseBody cannot be null");
        this.httpStatus = httpStatus;
        this.responseBody = responseBody;
    }

    @Override
    public final void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
        response.setStatus(httpStatus.value());

        try (PrintWriter writer = response.getWriter()) {
            writer.print(new ObjectMapper().writeValueAsString(responseBody));
        }
    }
}

2 - 예를 제공합니다.MyEntryPoint보안 구성으로

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // customize your response body as needed
        Map<String, String> responseBody = new HashMap<>();
        responseBody.put("error", "unauthorized");

        //...
        http.exceptionHandling()
            .authenticationEntryPoint(new MyEntryPoint(HttpStatus.UNAUTHORIZED, responseBody));
        //...
    }
}

@lealcelldeiro의 대답을 자세히 설명하자면,

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);
    }
//...
}

이제 Spring Boot 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));
    }
//...
}

Spring Boot Github Repo > PR Remove Http401에서도 이 의견을 참조하십시오.인증 진입점입니다.

Http401AuthenticationEntryPoint 제거되었습니다.

Spring Boot Github Repo > Issue #10715(Http401 제거) 참조인증 진입점):

Http401 제거인증 진입점

rwinch는 2017년 10월 20일에 논평했습니다.
스프링 부트 코드 기반에서 사용되지 않는 것으로 알고 있으므로 제거하는 것이 좋을 수 있습니다.Http401AuthenticationEntryPoint.

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

반응형(WebFlux) 스택의 경우 다음과 같은 @Bean을 추가하여 반환된 상태 코드를 재정의하여 몇 가지 특정 예외를 포착할 수 있습니다.

@Component
class MyErrorAttributes : DefaultErrorAttributes() {
override fun getErrorAttributes(
    request: ServerRequest,
    options: ErrorAttributeOptions
): MutableMap<String, Any> {
    val cause = super.getError(request)

    val errorAttributes = super.getErrorAttributes(request, options)

    when (cause) {
        is TokenExpiredException -> {
            errorAttributes["status"] = HttpStatus.UNAUTHORIZED.value()
            errorAttributes["error"] = HttpStatus.UNAUTHORIZED.reasonPhrase
        }
    }

    return errorAttributes
}
}

작동해야 하는 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\"}");
    }
}

언급URL : https://stackoverflow.com/questions/49241384/401-instead-of-403-with-spring-boot-2

반응형