web-dev-qa-db-ja.com

Spring Boot 2では403ではなく401

Spring Boot 1.5.6.RELEASEを使用して、401ではなくHTTPステータスコード403を送信できました 認証なしでURIを要求した場合、Spring Security Responseを無許可にする(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にまだ存在しますか?

  • いいえの場合、401ではなくこのステータスコード(403)に依存する他の実装との一貫性を保つために、既存のプロジェクトで同じ動作を維持するための良い代替案は何ですか?

11
lealceldeiro

クラス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));
        //...
    }
}
17
lealceldeiro

Http401AuthenticationEntryPoint が削除されました。参照 10715

Http401AuthenticationEntryPointを削除します

rwinchが2017年10月20日にコメント
私の知る限り、Spring Bootコードベースでは使用されていないため、Http401AuthenticationEntryPointを削除することをお勧めします。

要件に応じて、次のものを使用できます。

2
dur

@lealceldeiroの答えを詳しく説明するために:

Spring Boot 2以前は、Securiy Configurationクラスは次のようになっています。

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

こちらもご覧ください: https://github.com/spring-projects/spring-boot/issues/10715#issuecomment-363592444

1
Tai Truong

これが機能するはずの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\"}");
    }
}
0
user2530251