Spring OAuth2 checkUserScopes не работает должным образом

Прежде всего, согласно документу Spring, если я хочу сопоставить роли пользователей с областями, я должен использовать setCheckUserScopes(true) для DefaultOAuth2RequestFactory. Итак, один из способов сделать это — внедрить мой собственный bean-компонент DefaultOAuth2RequestFactory, как говорит документ:

The AuthorizationServerEndpointsConfigurer allows you to inject a custom OAuth2RequestFactory so you can use that feature to set up a factory if you use @EnableAuthorizationServer.

Тогда я делаю

@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. Установка bean-компонента OAuth2RequestFactory в качестве основного не сработала. Я удалил некоторые вещи, чтобы сосредоточиться на реальной проблеме:


После этого наблюдения актуальная проблема:

насколько я понимаю, если у пользователя есть полномочия 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;
} 

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


person jscherman    schedule 13.07.2015    source источник


Ответы (1)


Вам нужно связать OAuth2RequestFactory с помощью кода, как здесь.

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

person Stackee007    schedule 14.07.2015
comment
Я, по-видимому, упустил из виду этот метод requestFactory(), поэтому первая «ошибка» будет решена путем ее внедрения с помощью этого метода. С другой стороны, я еще не нашел решения второй ошибки. Спасибо! - person jscherman; 19.07.2015
comment
Мне тоже было бы интересно узнать о последней проблеме. Может быть, @DaveSyer поможет :) - person Stackee007; 20.07.2015
comment
пожалуйста, @DaveSyer, нам нужна ваша помощь :) - person jscherman; 05.08.2015
comment
Да, это мое. я разместил его на jira, и он продублировал проблему на github - person jscherman; 06.08.2015
comment
Я как раз собирался сам открыть jira, когда увидел билет. Рад, что вы сделали. - person Stackee007; 06.08.2015