Spring OAuth2.0: получение пользовательских ролей на основе ClientId (тип предоставления кода авторизации) - PullRequest
0 голосов
/ 28 мая 2019

У меня есть настройка весенней загрузки OAuth для AuthServer, и она позволяет обслуживать несколько серверов ресурсов для аутентификации с использованием spring-security-jwt.Моя проблема заключается в том, что во время аутентификации мне нужно загрузить роли пользователя, но специфичные для clientId.Например: если у user1 есть роли ROLE_A, ROLE_B для client1 и ROLE_C, ROLE_D для client2, то когда пользователь входит в систему, используя client1 или client2, он может видеть все четыре роли, т.е.ROLE_A, ROLE_B, ROLE_C, ROLE_D, потому что я получаю роли на основе имени пользователя.Если мне нужно иметь роль на основе клиента, тогда мне нужен clientId.К вашему сведению, я использую поток кода авторизации для аутентификации.Я видел подобный вопрос, но он основан на предоставлении пароля, но я пытаюсь использовать поток кода авторизации, и это решение не работает для меня.Вопрос о предоставлении пароля ссылка Ниже мой код, где мне нужен clientId MyAuthenticationProvider.java

@Override
    public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
        String userName = ((String) authentication.getPrincipal()).toLowerCase();
        String password = (String) authentication.getCredentials();
        String clientId = ? // how to get it
        ....
    }
}

MyUserDetailsService.java

@Override
    public UserDetails loadUserByUsername(String username) {
        String clientId = ? // how to get it 
        ....
    }
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Поскольку я не нашел подходящего решения для своего вопроса, я публикую решение, которое я использовал после поиска исходного кода и исследований.
MyJwtAccessTokenConverter.java (Расширить JwtAccessTokenConverter и реализовать метод расширения)

public class OAuthServerJwtAccessTokenConverter extends JwtAccessTokenConverter {
....
    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
    String clientId = authentication.getOAuth2Request().getClientId();
    // principal can be string or UserDetails based on whether we are generating access token or refreshing access token
    Object principal = authentication.getUserAuthentication().getPrincipal();
    ....
    }
....
}

Информация:
В расширенном методе мы получим clientId из authentication.getOAuth2Request () и userDetails / user_name из authentication.getUserAuthentication () .
Наряду с JwtAccessTokenConverter, AuthenticationProvider и UserDetailsService необходимы для аутентификации при создании шага токена доступа и шага обновления токена соответственно.

0 голосов
/ 29 мая 2019

Возможно, вам нужно увидеть OAuth2Authentication в Spring-security. Когда ваш клиент аутентифицируется с помощью oauth2, тогда ваша «аутентификация» фактически является экземпляром OAuth2Authentication, который в итоге реализует аутентификацию.

Если вы видите реализацию OAuth2Authentication, это делается, как показано ниже;

    public Object getPrincipal() {
       return this.userAuthentication == null ? this.storedRequest.getClientId() : this.userAuthentication
            .getPrincipal();
    }

поэтому, если запрос включает «clientId», вы сможете получить clientId, вызвав getPrincipal () и приведя тип к String, если ваш запрос не включает аутентификацию пользователя.

Для вашего второго случая имя пользователя фактически считается clientId. Вам нужно вызывать в памяти, RDBMS или любой другой реализации, в которой сохранен clientId и который возвращает ClientDetails. Вы сможете получить некоторую идею, заглянув в класс ClientDetailsUserDetailsService Spring Security.

...