私は、Springブートバージョン1.5.2.RELEASEを使用してoAuth2認証サーバーを実装しました。許可サーバーは暗黙フローをサポートしています。 WebSecurityConfigの下のログインフォーム(http://localhost:8200/login)はうまくいきます。EnableResourceServerがoAuth2認証サーバーを破棄する
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JpaUserDetailsService userDetailsService;
@Bean
@Override
public UserDetailsService userDetailsServiceBean() throws Exception {
return userDetailsService;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationProvider authenticationProvider() throws Exception {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsServiceBean());
provider.setPasswordEncoder(passwordEncoder());
return provider;
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return new ProviderManager(singletonList(authenticationProvider()));
}
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers("/")
.antMatchers("/docs/**")
.antMatchers("/swagger/**")
.antMatchers("/token/**")
.antMatchers("/v2/*")
.antMatchers(HttpMethod.OPTIONS, "/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().antMatchers("/login**").permitAll().anyRequest().authenticated().and()
.formLogin().loginPage("/login").permitAll().and()
.logout().permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
}
私はリソースサーバーを同じアプリケーションの一部にします。目的は、ユーザーを管理するためにログインしたユーザーとエンドポイントの詳細を提供するエンドポイント/meが必要です。しかし、私がhttp://localhost:8200/loginを要求すると、「このリソースにアクセスするには完全な認証が必要です」というエラーが表示されるように、EnableResourceServerの下に注釈を付けたResourceServerConfigを追加するとすぐに、
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
public static final String RESOURCE_ID = "proclaim-auth";
@Autowired
private ResourceServerTokenServices tokenServices;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources
.resourceId(RESOURCE_ID)
.tokenServices(tokenServices);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/api/ **").authenticated();
}
}
私は、リソースサーバーのセキュリティチェーンが承認サーバーのセキュリティチェーンに先行していると思われます。私は、注釈の順序でWebSecurityConfigに注釈を付けることを試みたが、それは私の問題を解決しませんでした:
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
...
}
私が間違って何をしているのですか?お知らせ下さい。 ありがとうございます!
EDIT 1 Iは、メソッドResourceServerConfigに設定(HttpSecurity HTTP)およびWebSecurityConfig上-1ために注釈の変更値を追加しました。これで、WebSecurityConfigで定義されたセキュリティが適用され、ResourceServerConfigで定義されたセキュリティは無視されます。だから/私有効なトークンを持つエンドポイントを呼び出すと、私はログインページにリダイレクトされます。