Я знаю, что защита 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 Безопасность), но все работают в очень простой конфигурации - пользователи с их учетные данные сохраняются в памяти в конфигурации, и мне нужно работать с СУБД и создавать собственный аутентификатор.
Пожалуйста, дайте мне несколько идей о том, как начать.