Для моего приложения 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);
}
}