Ответ 1
Вам нужно подключить свой OAuth2RequestFactory кодом как здесь.
Если полномочия установлены ClientDetailsService, тогда вы должны быть хорошими. Если вы ищете карту зарегистрированных пользовательских полномочий, я не повезет там или.
Прежде всего, согласно Spring doc , если я хочу сопоставить роли пользователей для областей, я должен использовать setCheckUserScopes (true) в DefaultOAuth2RequestFactory. Таким образом, один из способов сделать это - это ввести собственный DefaultOAuth2RequestFactory bean, поскольку doc говорит:
The AuthorizationServerEndpointsConfigurer allows you to inject a custom OAuth2RequestFactory so you can use that feature to set up a factory if you use @EnableAuthorizationServer.
Тогда я do
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends
AuthorizationServerConfigurerAdapter {
...
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints.authenticationManager(authenticationManager)
.tokenStore(tokenStore)
.tokenServices(tokenServices());
endpoints
.getOAuth2RequestFactory(); // this doesn't return me my own DefaultOAuth2RequestFactory
}
@Bean
@Primary
public OAuth2RequestFactory defaultOAuth2RequestFactory() {
DefaultOAuth2RequestFactory defaultOAuth2RequestFactory = new DefaultOAuth2RequestFactory(
clientDetailsService);
defaultOAuth2RequestFactory.setCheckUserScopes(true);
return defaultOAuth2RequestFactory;
}
}
Я упустил метод requestFactory() из AuthorizationServerEndpointsConfigurer. Это был правильный способ передать его в Spring Security. Установка OAuth2RequestFactory bean как первичная не работала. Я удалил некоторые вещи, чтобы сосредоточиться на реальной проблеме:
После этого наблюдения актуальная проблема:
как я понимаю, если у пользователя есть полномочия A и B, а приложение имеет область A, тогда он получает только область "A". Но этого не происходит. Что действительно происходит, так это то, что если приложение имеет область A, а APP (а не пользователь) имеет полномочия A и B, тогда пользователь получает A. Но это не имеет никакого смысла. Это метод DefaultOAuth2RequestFactory, который разрешает пользовательские области:
private Set<String> extractScopes(Map<String, String> requestParameters, String clientId) {
... // I avoid some unimportant lines to not make this post so long
if ((scopes == null || scopes.isEmpty())) {
scopes = clientDetails.getScope();
}
if (checkUserScopes) {
scopes = checkUserScopes(scopes, clientDetails);
}
return scopes;
}
private Set<String> checkUserScopes(Set<String> scopes, ClientDetails clientDetails) {
if (!securityContextAccessor.isUser()) {
return scopes;
}
Set<String> result = new LinkedHashSet<String>();
Set<String> authorities = AuthorityUtils.authorityListToSet(securityContextAccessor.getAuthorities());
for (String scope : scopes) {
if (authorities.contains(scope) || authorities.contains(scope.toUpperCase())
|| authorities.contains("ROLE_" + scope.toUpperCase())) {
result.add(scope);
}
}
return result;
}
Это ошибка? Скажите, пожалуйста, если я ошибаюсь. Отношения
Вам нужно подключить свой OAuth2RequestFactory кодом как здесь.
Если полномочия установлены ClientDetailsService, тогда вы должны быть хорошими. Если вы ищете карту зарегистрированных пользовательских полномочий, я не повезет там или.