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
'programing' 카테고리의 다른 글
c#에서 매개 변수화된 쿼리를 실행하는 동안 ORA-01745 오류가 발생했습니다. (0) | 2023.07.20 |
---|---|
열 업데이트 시 Oracle SQL 트리거 (0) | 2023.07.20 |
nodejs로 MongoDB 쿼리 결과를 스트리밍하는 방법은 무엇입니까? (0) | 2023.07.20 |
ORA-02303: 형식을 삭제하거나 형식 또는 테이블 종속자로 대체할 수 없습니다. (0) | 2023.07.20 |
git://protocol이 회사에 의해 차단되었습니다. 어떻게 하면 피할 수 있을까요? (0) | 2023.07.20 |