Я хотел бы защитить свое приложение с помощью сервера ресурсов и сервера авторизации Spring Security, включенных в мой компонент.
Желаемый поток включает использование только типа предоставления учетных данных клиента и передачу client_id вместе с client_secret в качестве заголовка base64, который должен возвращать токен для дальнейших запросов после попадания в конечную точку oauth/token. Я также включаю grant_type: client-credentials в параметры запроса POST
На данный момент я получаю сообщение об ошибке:
"Full authentication is required to access this resource".
Странно то, что, несмотря на мою конфигурацию, Spring по-прежнему генерирует случайный пароль безопасности, который можно увидеть в журнале консоли.
Это мой первый подход к Spring Security, может я что-то пропустил?
Ниже моя конфигурация:
AuthorizationServerConfig:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends
AuthorizationServerConfigurerAdapter {
@Override
public void configure(final AuthorizationServerSecurityConfigurer security) {
security
.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("some-client")
.authorizedGrantTypes("client-credentials")
.authorities("ROLE_CLIENT")
.scopes("read", "write", "trust")
.accessTokenValiditySeconds(3600)
.secret("somePass")
.refreshTokenValiditySeconds(24*3600);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints
.tokenStore(tokenStore())
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST);
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
}
ResourceServerConfig:
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/oauth/token", "/oauth/authorize", "/oauth/confirm_access").permitAll()
.antMatchers("/**").authenticated()
.and().httpBasic().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
}
}
Я использую Spring Boot 2.0.1.RELEASE и Spring Security OAuth2 2.0.14.RELEASE. Как и в моем случае, используется InMemoryTokenStore, он будет работать с одним экземпляром, что является лучшей заменой для этого, если нужно создать несколько экземпляров приложения?
Нет, в моем проекте нет Corsfilter




Когда вы сохраняете пользователей в памяти, вы предоставляете пароли в виде обычного текста, а затем, когда вы пытаетесь получить кодировщик из DelegatingPasswordEncoder для проверки пароля, он не может его найти.
Вы можете попробовать следующие изменения, чтобы переопределить кодировку пароля, добавив {noop}.
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("some-client")
.authorizedGrantTypes("client-credentials")
.authorities("ROLE_CLIENT")
.scopes("read", "write", "trust")
.accessTokenValiditySeconds(3600)
.secret("{noop}somePass") //change here
.refreshTokenValiditySeconds(24*3600);
}
А также измените своего пользователя в WebSecurityConfigurer, сделав то же самое для пароля.
В вашем проекте есть корсфильтр?