Spring OAuth2 checkUserScopes работает не так, как ожидалось

Прежде всего, согласно 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;
} 

Это ошибка? Скажите, пожалуйста, если я ошибаюсь. Отношения

Ответы

Ответ 1

Вам нужно подключить свой OAuth2RequestFactory кодом как здесь.

Если полномочия установлены ClientDetailsService, тогда вы должны быть хорошими. Если вы ищете карту зарегистрированных пользовательских полномочий, я не повезет там или.