Я знаю, что защита REST API - это широко обсуждаемая тема, но я не могу создать небольшой прототип, который соответствует моим критериям (и мне нужно подтвердить, что эти критерии реалистичны). Есть так много вариантов, как защитить ресурсы и как работать с безопасностью Spring, мне нужно уточнить, реалистичны ли мои потребности.
Мои требования
- Аутентификатор на основе токена - пользователи предоставят свои учетные данные и получат уникальный и ограниченный по времени токен доступа. Я хотел бы управлять созданием токена, проверкой действительности, истечением срока действия в моей собственной реализации.
- Некоторые ресурсы REST будут общедоступными - без аутентификации вообще,
- Некоторые ресурсы будут доступны только пользователям с правами администратора,
- Другой ресурс будет доступен после авторизации для всех пользователей.
- Я не хочу использовать обычную проверку подлинности
- Конфигурация кода Java (не XML)
Текущий статус
Мой REST API работает очень хорошо, но теперь мне нужно его обезопасить. Когда я искал решение, я создал javax.servlet.Filter
фильтр:
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String accessToken = request.getHeader(AUTHORIZATION_TOKEN);
Account account = accountDao.find(accessToken);
if (account == null) {
throw new UnauthorizedException();
}
chain.doFilter(req, res);
}
Но это решение javax.servlet.filters
не работает так, как мне нужно, потому что есть проблема с обработкой исключений с помощью @ControllerAdvice
Spring servlet dispatcher
.
Что мне нужно
Я хотел бы узнать, реалистичны ли эти критерии и получить какую-либо помощь, как начать защищать REST API с помощью Spring Security. Я прочитал много руководств (например, Spring Data REST + Spring Security ), но все они работают в очень простой конфигурации - пользователи с их учетными данными хранятся в памяти в конфигурации, и мне нужно работать с СУБД и создавать собственный аутентификатор.
Пожалуйста, дайте мне несколько идей, как начать.