2

春のブートからのサンプルに続いて:example code from GitHubすべて正常に動作しているようです。ジャージーと春のセキュリティで春のブートOAuth2

しかし、私がSpring Boot Security OAuth2をプロジェクトに統合すると、私のOAuth2エンドポイントは機能しなくなります。ログに警告があります:

2017-05-04 08:56:24.109 WARN 2827 --- [nio-8080-exec-1] o.glassfish.jersey.servlet.WebComponent : A servlet request to the URI http://127.0.0.1:8080/oauth/token contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

私は、ジャージーはそれをキャプチャし、体を処理している、エンドポイントの登録要求を受け入れることSpring MVCのができなくなっていないよにもかかわらず、と思わせます...

@Component 
public class JerseyConfig extends ResourceConfig { 

    public JerseyConfig() { 
     register(InfoController.class); 
    } 

} 

そして、私の情報コントローラは非常に簡単です::

私のジャージーConfigがある

@Component 
@Path("/me") 
@Produces("application/json") 
public class InfoController { 
    @GET 
    public String meAction() { 
    return "Hi"; 
    } 
} 

そして最後に、私が作るしようとしていると、それはログに警告引き起こしているコール:

curl -X POST -u CLIENT_APPLICATION:123456789 http://127.0.0.1:8080/oauth/token -H "Accept: application/json" -d "password=aaa&username=aa&grant_type=password&client_id=CLIENT_APPLICATION"

は、その意味で二つのプロジェクト(spring-boot-starter-jerseyspring-security-oauth2間の既知の非互換性はありますか?

Jerseyの設定を削除するとすべて機能しますが、私はコントローラでそれを使用する必要があります。

のOAuth2のための私の構成は次のとおりです。

@Configuration 
public class OAuth2ServerConfiguration { 
    @Configuration 
    @EnableResourceServer 
    protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 
    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) { 
     resources.resourceId("OAuth2 Server"); 
    } 
    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     // @formatter:off 
     http 
      .authorizeRequests() 
      .antMatchers("/oauth/token").permitAll() 
      .antMatchers("/*").authenticated(); 
     // @formatter:on 
    } 
    } 
} 

次にありますセキュリティの構成自体は:事前に

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    private final ApiUserDetailsService userDetailsService; 

    @Autowired 
    public WebSecurityConfiguration(ApiUserDetailsService userDetailsService) { 
    this.userDetailsService = userDetailsService; 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService); 
    } 

    @Bean 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
    return super.authenticationManagerBean(); 
    } 
} 

ありがとう!

+0

警告は、oauthの使用に固有のものではありません。これは、 'appliction/x-www-form-urlencoded'を使用しているとき、ジャージー(私はほとんどがTomcatと思う)で起こることです。 Jerseyのリソースメソッドでフォームパラメータを使用する場合は、@FormParam(他の手段ではありません)を使用する必要があることを伝えるだけです。私には、この警告が表示されているようで、oauthが正しく設定されていないと思われます。なぜなら、oauthエンドポイントはJerseyを経由するべきではないからです。それはちょうど春の安全に行く必要があります。 –

+0

@peeskilletありがとう。しかし、エンドポイントがジャージーを通過しない場合(構成でわかるように)、OAuthエンドポイントの警告が表示されるのはなぜですか? –

+0

ポイントはジャージーを通過するはずがないということです。 Spring Securityは、Jerseyアプリケーションの範囲外にあるサーブレットフィルタです。したがって、Jerseyがoauthエンドポイントの要求を受け入れる場合、何かが間違っています。なんらかの理由で、Spring Securityはリクエストを処理していません。そして、私はその理由が何であるか本当に分かりません。 –

答えて

1

JerseyがOAuthエンドポイントを処理しようとしているようですが、それは避けてください。その理由は、Jerseyのデフォルトマッピングが/*であるため、すべてのURLの要求を処理するためです。あなたはいくつかの方法でそれを変更することができます。

@Component 
@ApplicationPath("/api") 
public class JerseyConfig extends ResourceConfig {} 
  • あなたのapplication.propertiesファイルにマッピングを追加することができます

    1. が異なるマッピングを使用してResourceConfigサブクラスの上に@ApplicationPathを追加

      spring.jersey.application-path=/api 
      

    これはプレフィックス0123ですをすべてのJerseyエンドポイントに送信し、Jerseyがすべての要求を処理しないようにします。その場合、/apiで始まるもののみが要求されます。