添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
小胡子的自行车  ·  Shopify Payments ...·  3 月前    · 
豁达的板栗  ·  Debian repositories ...·  6 月前    · 
另类的木瓜  ·  函数返回从socket.on ...·  7 月前    · 

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.

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

  • HttpStatus 진입점
  • 기본 인증 진입점
  • 반응형(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