Невозможно передать дополнительный параметр Spring-Security с OAuth2.0 - PullRequest
0 голосов
/ 25 января 2019

Добрый день.

У меня есть требование для реализации OAuth2 с использованием Spring-Security с использованием Springboot2 на основе приведенного ниже URL.

Имя URL: https://www.devglan.com/spring-security/spring-boot-oauth2-jwt-example

И я это сделал.

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

Мне нужно передать companyId вместе с userName и паролем и 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_description»: «запрос не вернул уникальный результат: 2; вложенное исключение - javax.persistence.NonUniqueResultException: запрос не вернул уникальный результат: 2» }

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

Может ли кто-нибудь помочь по этому вопросу. Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Bhanuprakash, у меня похожая проблема, но временно я сделал это:

В методе "loadUserByUsername" напишите это:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAribu()) GetRequest ().System.out.println ("compnayId:" + request.getParameter ("companyId"));

Я думаю, что есть более элегантное решение, но временно я использовал это.

Спасибо.

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, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...