У меня есть отдых api, где я аутентифицируюсь с использованием весенней безопасности. Основная авторизация, при которой клиент отправляет имя пользователя и пароль для каждого запроса. Теперь я хотел реализовать аутентификацию на основе токенов, где я пошлю токен в заголовке ответа, когда пользователь будет аутентифицирован сначала. Для дальнейших запросов клиент может включить этот токен в заголовок, который будет использоваться для аутентификации пользователя для ресурсов. У меня есть два провайдера аутентификации tokenAuthenticationProvider и daoAuthenticationProviderАутентификация на основе токена на основе Spring безопасности
@Component
public class TokenAuthenticationProvider implements AuthenticationProvider {
@Autowired
private TokenAuthentcationService service;
@Override
public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
final HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
final String token = request.getHeader(Constants.AUTH_HEADER_NAME);
final Token tokenObj = this.service.getToken(token);
final AuthenticationToken authToken = new AuthenticationToken(tokenObj);
return authToken;
}
@Override
public boolean supports(final Class<?> authentication) {
return AuthenticationToken.class.isAssignableFrom(authentication);
}
}
И в daoAuthenticationProvider я устанавливаю пользовательские UserDetailsService и аутентификация с пользовательской информацией авторизации, запрашивая его из базы данных (который работает отлично до тех пор, как имя пользователя и пароль, которые передаются с помощью Авторизация: Basic bGllQXBpVXNlcjogN21wXidMQjRdTURtR04pag == в качестве заголовка)
Но когда я включаю маркер в заголовке, используя X-AUTH-лексеме (что Constants.AUTH_HEADER_NAME), tokenAuthenticationProvider не вызывается. Я получаю ошибку как
{"timestamp":1487626368308,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource","path":"/find"}
И вот как я добавляю поставщиков аутентификации.
@Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception {
final UsernamePasswordAuthenticationProvider daoProvider = new
UsernamePasswordAuthenticationProvider(this.service, this.passwordEncoder());
auth.authenticationProvider(this.tokenAuthenticationProvider);
auth.authenticationProvider(daoProvider);
}
Просьба предложить, как я могу реализовать аутентификацию на основе токена, не нарушая при этом текущего поведения весенней безопасности.
У вас есть разные способы сделать это. Вы можете @Autowired провайдера непосредственно на каждом фильтре или установить это Провайдеры в одном Authentication Manager и работать с ним в обоих FIlters. Конечно, вы должны установить оба фильтра в Spring Security FilterChain. – Dani