Sé que asegurar la API REST es un tema muy comentado, pero no puedo crear un pequeño prototipo que cumpla con mis criterios (y necesito confirmar que estos criterios son realistas). Hay tantas opciones sobre cómo asegurar los recursos y cómo trabajar con Spring Security, necesito aclarar si mis necesidades son realistas.
Mis requisitos
- Autenticador basado en token: los usuarios proporcionarán sus credenciales y obtendrán un token de acceso único y por tiempo limitado. Me gustaría administrar la creación de tokens, verificar la validez y el vencimiento en mi propia implementación.
- Algunos recursos REST serán públicos, no es necesario autenticarse en absoluto,
- Algunos recursos serán accesibles solo para usuarios con derechos de administrador,
- Se podrá acceder a otro recurso después de la autorización para todos los usuarios.
- No quiero usar la autenticación básica
- Configuración de código Java (no XML)
Estado actual
Mi API REST funciona muy bien, pero ahora necesito protegerla. Cuando buscaba una solución, creé un javax.servlet.Filter
filtro:
@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);
}
Pero esta solución javax.servlet.filters
no funciona como necesito porque hay un problema con el manejo de excepciones a través @ControllerAdvice
de Spring servlet dispatcher
.
Lo que necesito
Me gustaría saber si estos criterios son realistas y obtener ayuda, cómo comenzar a proteger la API REST con Spring Security. Leí muchos tutoriales (por ejemplo, Spring Data REST + Spring Security ) pero todos funcionan en una configuración muy básica: los usuarios con sus credenciales se almacenan en la memoria en la configuración y necesito trabajar con DBMS y crear un autenticador propio.
Por favor, dame algunas ideas sobre cómo empezar.