Я пытаюсь реализовать грант authorization_code в моем приложении Spring, но он не работает.
Приложение Spring - это AuthorizationServer (@EnableAuthorizationServer) и ResourceServer (@EnableResourceServer).
Когда я использую .anyRequest (). AllowAll () в WebSecurityConfig, авторизация может быть завершена (форма входа => перенаправить на указанный uri => код обмена для маркера доступа), но ни один из моих защищенных ресурсов больше не защищен.
Защищенные ресурсы находятся за / api / **
Я попытался изменить порядок WebSecurity / ResourceSecurity, разрешив все как для WebSecurity / ResourceSecurity, но безуспешно.
@Configuration
@EnableWebSecurity
@Order(1)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ApiUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder
.userDetailsService(userDetailsService)
;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login**", "/error**", "/oauth/**")
.permitAll()
.and()
.authorizeRequests()
.anyRequest()
.permitAll()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll()
.and()
.csrf()
.disable()
;
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
@Configuration
@EnableAuthorizationServer
public class OauthSecurityConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
private ApiClientDetailsService clientDetailsService;
@Autowired
private ApiUserDetailsService userDetailsService;
@Autowired
private ApiAccessTokenConverter accessTokenConverter;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
tokenEnhancerChain.setTokenEnhancers(
asList(
tokenEnhancer(),
accessTokenConverter()
)
);
endpoints
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancerChain)
.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService)
;
}
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
clients
.withClientDetails(clientDetailsService);
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("key.jks"), "multiforce".toCharArray());
converter.setKeyPair(keyStoreKeyFactory.getKeyPair("multiforce"));
converter.setAccessTokenConverter(accessTokenConverter);
return converter;
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
oauthServer
.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()")
.allowFormAuthenticationForClients()
;
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
defaultTokenServices.setSupportRefreshToken(true);
return defaultTokenServices;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public TokenEnhancer tokenEnhancer() {
return new ApiTokenEnhancer();
}
}
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Autowired
private DefaultTokenServices tokenServices;
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config
.resourceId("API")
.tokenServices(tokenServices)
;
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.requestMatchers()
.antMatchers("/api/**")
.and()
.authorizeRequests()
.anyRequest()
.access("#oauth2.hasRole('api')")
;
}
}