Как реализовать OAuth2.0 с пружинной безопасностью, добавив дополнительный параметр - PullRequest
0 голосов
/ 25 января 2019

Я реализую oauth2 с помощью Spring-Security, используя springboot2, основываясь на ссылке ниже.

https://www.devglan.com/spring-security/spring-boot-oauth2-jwt-example

И я успешно его реализую.

Здесь у меня естьдругой вариант использования вышеуказанного кода при аутентификации пользователя.

Мне нужно передать companyid вместе с именем пользователя и паролем и grant_type (пароль) на вкладке "x-www-form-urlencoded" в почтальоне.И я должен выбрать пользователя на основе имени пользователя и companyId.

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

Вот яполучать только электронную почту.Мне нужен адрес электронной почты вместе с идентификатором компании.

@Override
@Transactional
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {

    User user = userRepository.findByEmail(email).orElseThrow(
            () -> new UsernameNotFoundException("User Not Found with -> username or email : " + email));
    return UserPrinciple.build(user);
}

Expected:

@Override
@Transactional
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {

    User user = userRepository.findByEmailAndCompanyId(email,companyId).orElseThrow(
            () -> new UsernameNotFoundException("User Not Found with -> username or email : " + email));
    return UserPrinciple.build(user);
}

В настоящее время с именем пользователя и паролем все работает нормально.

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

{"error": "unauthorized", "error_description": "запрос не дал уникальный результат: 2; вложенное исключение - javax.persistence.NonUniqueResultException:запрос не вернул уникальный результат: 2 "}

Мне нужно выбрать пользователя на основе имени пользователя, пароля и companyId, что приведет к одному пользователю.

1 Ответ

0 голосов
/ 25 января 2019

Если вам нужна дополнительная информация с токенами доступа, вы можете использовать класс TokenEnhancer, чтобы сделать это.

CustomTokenEnhancer.java

public class CustomTokenEnhancer implements TokenEnhancer {

    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
        User user = (User) authentication.getPrincipal();
        final Map<String, Object> additionalInfo = new HashMap<>();

        additionalInfo.put("id", user.getCompanyId());
        additionalInfo.put("authorities", user.getAuthorities());

        ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);

        return accessToken;
    }

}

Затем используйте экземпляр этого класса для аннулирования метода configure (AuthorizationServerEndpointsConfigurer endpoints), подобного этому

AuthorizationServerConfig.java

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.authenticationManager(authenticationManager)
            .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
            .tokenEnhancer(new CustomTokenEnhancer());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...