Spring Boot для аутентификации двумя способами: объединение аутентификации на основе LDAP и токена - PullRequest
0 голосов
/ 12 ноября 2018

Для моего приложения RESTfulll нам нужно иметь два вида аутентификации. Один основан на LDAP для всех внутренних сотрудников. Это недавно реализовано и работает нормально. Для всех внешних сотрудников нам нужна аутентификация на основе токенов.

Что я имею в виду? Эти сотрудники будут отправлять сгенерированный токен по электронной почте, этот токен хранится с датой истечения срока действия в нашей базе данных. Сотрудники должны иметь возможность «войти» с этим токеном. Итак, что было бы лучшим способом реализовать что-то подобное?

Моей первой мыслью было создать дополнительный ExternalAuthenticationProvider и добавить это в conf безопасности Это работает, пользователи могут войти с токеном как username, они получают JWT. Но когда им нравится получать доступ к любым ресурсам, ответом является HTTP 403 -ошибка Для меня эта реализация выглядит как грязный хак, мне не нравится подход, может быть, есть и лучший.

Спасибо за любые советы.

@Component
public class ExternalAuthenticationProvider implements AuthenticationProvider {
    @Autowired
    private ExternalEffortLinkManagementRepository externalEffortLinkManagementRepository;

    @Override
    public Authentication authenticate(Authentication auth) throws AuthenticationException {
        Collection<GrantedAuthority> gas = new HashSet<GrantedAuthority>();
        String userToken = auth.getName();

        ExternalEffortLinkManagement token = externalEffortLinkManagementRepository.getByLink(userToken);

        if (token != null && token.isActive()) {
            gas.add(new SimpleGrantedAuthority(SecurityConstants.ROLE_EXTERNAL));
            return new UsernamePasswordAuthenticationToken(userToken, null, gas);
        } else {
            throw new
                    BadCredentialsException("External system authentication failed");
        }
    }

    @Override
    public boolean supports(Class<?> auth) {
        return auth.equals(UsernamePasswordAuthenticationToken.class);
    }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Я нашел ошибку:

Фрагмент 1:

gas.add(new SimpleGrantedAuthority(SecurityConstants.ROLE_EXTERNAL)); // ROLE_EXTERNAL = "EXTERNAL"

было заменено на

Фрагмент 2:

gas.add(new SimpleGrantedAuthority("ROLE_" + SecurityConstants.ROLE_EXTERNAL));

Я использовал тот же код (фрагмент 1) для аутентификации LDAP, поэтому я просто передал строку "EXTERNAL" в конструктор SimpleGrantedAuthority. Но я сделал это в своем CustomLdapAuthoritiesPopulator, кажется, что Spring каким-то образом добавляет префикс ROLE_ в скрытый код. Но это не сработало с моим ExternalAuthenticationProvider, там нужно было добавить ROLE_ в строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...