Spring Security OAuth2
kullanıyorum, gayet düzgün çalışan çok basit bir yapılandırmayla. Şimdi, bazı uç noktalara erişme yetkisinin olup olmadığını belirleyen özel mantığı içeren ayrı bir WebSecurityConfigurerAdapter
olmasını istiyorum. Ancak ne denediğime bakılmaksızın yürütülür. Aşağıda benim OAuth2
yapılandırmalarım ve konuyla ilgili bulgularım var. Yetkilendirme sunucusu:OAuth2 kaynak sunucusuyla birlikte özel http güvenlik yapılandırması
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private TokenStore tokenStore;
@Autowired
private AuthenticationManagerBuilder authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)throws Exception {
endpoints.authenticationManager(authentication -> authenticationManager.getOrBuild().authenticate(authentication)).tokenStore(tokenStore);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory().withClient("CLIENT_NAME")...;
}
}
Kaynak sunucusu: Şimdiye kadar
@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Autowired
private TokenStore tokenStore;
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
}
@Override
public void configure(final ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenStore(tokenStore);
}
}
çok iyi. Özel WebSecurityConfigurerAdapter
devreye girdiğinde, sorun yaşamaya başladım. EnableResourceServer
eklenmiş fasulyenin, Order(3)
ile bir WebSecurityConfigurerAdapter
oluşturması nedeniyle, önce her istekte yürütülür, kullanıcı başarıyla doğrulanır/yetkilendirilir, ancak WebSecurityConfiguration
benim özel mantığım yürütülür. Diğer yandan WebSecurityConfiguration
değerini Order(2)
veya daha düşük bir değere ayarlıyorumsa, özel access
kuralları yerine getirilir, ancak her zaman anonim bir kullanıcıdan geldikleri söylenir (@EnableResourceServer
tarafından oluşturulan fasulye kurallarının yerine getirilmediğinden). Sadece bir yan not olarak
@EnableWebSecurity
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/...");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests().antMatchers(HttpMethod.GET, "/path/**")
.access("@security.hasPermission(authentication, 'SOME', 'VALUE')");
http.authorizeRequests().anyRequest().authenticated();
}
}
,
access
kurallarda
@security
referans sadece basit adlandırılmış Bahar fasulye geçerli:
@Component("security")
public class SecurityService {
public boolean hasPermission(Authentication authentication, String param, String anotherParam) { ... }
}
ben WebSecurityConfiguration
özel erişim kuralları doğrulamak entegrasyon testleri ve çalıştıkları (orada kimlik doğrulamasını atladığımdan). Kaynak sunucuyu yalnızca kimlik doğrulaması için kullanabiliyorum ve daha sonra yetkilendirmek için özel http güvenliğimi kullanmak istiyorum.