Ответ 1
Вы должны
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
oauthServer.checkTokenAccess("permitAll()");
}
Для получения дополнительной информации об этом::
Я пытаюсь настроить сервер ресурсов для работы с отдельным сервером авторизации с помощью spring security oauth. Я использую RemoteTokenServices
, для которого требуется конечная точка /check_token
.
Я мог видеть, что конечная точка /oauth/check_token
включена по умолчанию, когда используется @EnableAuthorizationServer
. Однако конечная точка недоступна по умолчанию.
Должна ли добавляться следующая запись в белый список этой конечной точки?
http.authorizeRequests().antMatchers("/oauth/check_token").permitAll();
Это сделает эту конечную точку доступной для всех, является ли это желаемым поведением? Или я что-то упускаю.
Спасибо заранее,
Вы должны
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
oauthServer.checkTokenAccess("permitAll()");
}
Для получения дополнительной информации об этом::
Просто чтобы прояснить пару моментов и добавить дополнительную информацию к ответу, предоставленному Пратиком Шахом (и Алексом в соответствующей теме):
1- Упомянутый метод configure
переопределяется созданием класса, расширяющего AuthorizationServerConfigurerAdapter
:
@EnableAuthorizationServer
@Configuration
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("ger-client-id")
.secret("ger-secret")
.authorizedGrantTypes("password")
.scopes("read", "write");
}
}
2- Я предлагаю прочитать это руководство по Spring, объясняющее автоматическую настройку, выполняемую Spring Boot, когда мы включаем аннотацию @EnableAuthorizationServer
, включая bean-компонент AuthorizationServerConfigurer
. Если вы создаете bean-компонент конфигурации, расширяющий AuthorizationServerConfigurerAdapter
, как я делал выше, вся эта автоматическая конфигурация отключается.
3- Если автоматическая конфигурация вам подходит, и вы ПРОСТО ХОТИТЕ манипулировать доступом к конечной точке /oauth/check_token
, вы все равно можете сделать это без создания bean-компонента AuthorizationServerConfigurer
(и, следовательно, без необходимости конфигурировать все программно).
Вам нужно добавить свойство security.oauth2.authorization.check-token-access
в файл application.properties
, например:
security.oauth2.client.client-id=ger-client-id
security.oauth2.client.client-secret=ger-secret
security.oauth2.client.scope=read,write
security.oauth2.authorization.check-token-access=permitAll()
Конечно, вы можете присвоить ему значение isAuthenticated()
, если хотите.
Вы можете установить уровень журнала DEBUG, чтобы убедиться, что все настроено должным образом:
16:16:42.763 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll()', for Ant [pattern='/oauth/check_token']
Об этих свойствах не так много документации, но их можно выяснить из этого класса автоконфигурации.
Еще одна вещь, о которой стоит упомянуть, хотя, похоже, это исправлено в последних версиях Spring, я только что представил проблему в проекте spring-security-oauth; кажется, что функция token_check включена по умолчанию, если вы добавляете косую черту в запрос:
$ curl localhost:8080/oauth/check_token/?token=fc9e4ad4-d6e8-4f57-b67e-c0285dcdeb58
{"scope":["read","write"],"active":true,"exp":1544940147,"authorities":["ROLE_USER"],"client_id":"ger-client-id"}
Во-первых, выражение доступа к токенам конфигурации:
@Override
public void configure(AuthorizationServerSecurityConfigurer securityConfigurer) throws Exception {
securityConfigurer
.allowFormAuthenticationForClients()
.checkTokenAccess("isAuthenticated()")
.addTokenEndpointAuthenticationFilter(checkTokenEndpointFilter());
}
Затем нам нужно определить фильтр для обработки аутентификации клиента:
@Bean
public ClientCredentialsTokenEndpointFilter checkTokenEndpointFilter() {
ClientCredentialsTokenEndpointFilter filter = new ClientCredentialsTokenEndpointFilter("/oauth/check_token");
filter.setAuthenticationManager(authenticationManager);
filter.setAllowOnlyPost(true);
return filter;
}