Я знаю, що захист REST API є широко коментованою темою, але я не можу створити невеликий прототип, який відповідає моїм критеріям (і мені потрібно підтвердити, що ці критерії реалістичні). Є так багато варіантів, як захистити ресурси та як працювати з Spring security, мені потрібно пояснити, чи реалістичні мої потреби.
Мої вимоги
- Аутентифікатор на основі токенів - користувачі надаватимуть його облікові дані та отримуватимуть унікальний та обмежений у часі маркер доступу. Я хотів би керувати створенням маркера, перевіркою дійсності, закінченням терміну дії у власній реалізації.
- Деякі ресурси 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 ), але всі працюють у дуже базовій конфігурації - користувачі з їхніми обліковими даними зберігаються в пам'яті в конфігурації, і мені потрібно працювати зі СУБД і створити власний автентифікатор.
Будь ласка, дайте мені кілька ідей, як почати.