春のブートからのサンプルに続いて: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-jersey
とspring-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();
}
}
ありがとう!
警告は、oauthの使用に固有のものではありません。これは、 'appliction/x-www-form-urlencoded'を使用しているとき、ジャージー(私はほとんどがTomcatと思う)で起こることです。 Jerseyのリソースメソッドでフォームパラメータを使用する場合は、@FormParam(他の手段ではありません)を使用する必要があることを伝えるだけです。私には、この警告が表示されているようで、oauthが正しく設定されていないと思われます。なぜなら、oauthエンドポイントはJerseyを経由するべきではないからです。それはちょうど春の安全に行く必要があります。 –
@peeskilletありがとう。しかし、エンドポイントがジャージーを通過しない場合(構成でわかるように)、OAuthエンドポイントの警告が表示されるのはなぜですか? –
ポイントはジャージーを通過するはずがないということです。 Spring Securityは、Jerseyアプリケーションの範囲外にあるサーブレットフィルタです。したがって、Jerseyがoauthエンドポイントの要求を受け入れる場合、何かが間違っています。なんらかの理由で、Spring Securityはリクエストを処理していません。そして、私はその理由が何であるか本当に分かりません。 –