Wiem, że zabezpieczanie REST API jest szeroko komentowanym tematem, ale nie jestem w stanie stworzyć małego prototypu spełniającego moje kryteria (i muszę potwierdzić, że te kryteria są realistyczne). Jest tak wiele opcji, jak zabezpieczyć zasoby i jak pracować z zabezpieczeniami Spring, muszę wyjaśnić, czy moje potrzeby są realistyczne.
Moje wymagania
- Token uwierzytelniający - użytkownicy dostarczą swoje poświadczenia i otrzymają unikalny i ograniczony czasowo token dostępu. Chciałbym zarządzać tworzeniem tokena, sprawdzaniem jego ważności, wygaśnięciem we własnej implementacji.
- Niektóre zasoby REST będą publiczne - nie trzeba w ogóle uwierzytelniać,
- Niektóre zasoby będą dostępne tylko dla użytkowników z uprawnieniami administratora,
- Inne zasoby będą dostępne po autoryzacji dla wszystkich użytkowników.
- Nie chcę używać uwierzytelniania podstawowego
- Konfiguracja kodu Java (nie XML)
Aktualny stan
Mój REST API działa bardzo dobrze, ale teraz muszę go zabezpieczyć. Szukając rozwiązania stworzyłem javax.servlet.Filter
filtr:
@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);
}
Ale to rozwiązanie javax.servlet.filters
nie działa tak, jak potrzebuję, ponieważ występuje problem z obsługą wyjątków przez @ControllerAdvice
Spring servlet dispatcher
.
Czego potrzebuję
Chciałbym wiedzieć, czy te kryteria są realistyczne i uzyskać pomoc, jak zacząć zabezpieczać REST API za pomocą Spring Security. Czytałem wiele tutoriali (np. Spring Data REST + Spring Security ), ale wszystkie działają w bardzo podstawowej konfiguracji - użytkownicy wraz z ich poświadczeniami są przechowywani w pamięci w konfiguracji i muszę popracować z DBMS i stworzyć własny token uwierzytelniający.
Proszę, daj mi kilka pomysłów, jak zacząć.