Я знаю, что защита 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 ), но все они работают в очень простой конфигурации - пользователи с их учетными данными хранятся в памяти в конфигурации, и мне нужно работать с СУБД и создавать собственный аутентификатор.
Пожалуйста, дайте мне несколько идей, как начать.
источник
Безопасность Spring также очень полезна для обеспечения аутентификации и авторизации URL-адресов REST. Нам не нужно указывать какие-либо специальные реализации.
Во-первых, вам нужно указать точку входа-ref для restAuthenticationEntryPoint в конфигурации безопасности, как показано ниже.
<security:http pattern="/api/**" entry-point-ref="restAuthenticationEntryPoint" use-expressions="true" auto-config="true" create-session="stateless" > <security:intercept-url pattern="/api/userList" access="hasRole('ROLE_USER')"/> <security:intercept-url pattern="/api/managerList" access="hasRole('ROLE_ADMIN')"/> <security:custom-filter ref="preAuthFilter" position="PRE_AUTH_FILTER"/> </security:http>
Реализация restAuthenticationEntryPoint может быть такой, как показано ниже.
@Component public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException ) throws IOException { response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" ); } }
После этого необходимо указать RequestHeaderAuthenticationFilter. Он содержит ключ RequestHeader. Это в основном используется для идентификации аутентификации пользователя. Обычно RequestHeader передает эту информацию при выполнении вызовов REST. Например, рассмотрите ниже код
<bean id="preAuthFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter"> <property name="principalRequestHeader" value="Authorization"/> <property name="authenticationManager" ref="authenticationManager" /> </bean>
Вот,
<property name="principalRequestHeader" value="Authorization"/>
«Авторизация» - это ключ, представленный входящему запросу. Он содержит необходимую информацию для аутентификации пользователя. Также вам необходимо настроить PreAuthenticatedAuthenticationProvider, чтобы выполнить наше требование.
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> <property name="preAuthenticatedUserDetailsService"> <bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> <property name="userDetailsService" ref="authenticationService"/> </bean> </property> </bean>
Этот код будет работать для защиты URL-адресов REST с помощью аутентификации и авторизации без каких-либо пользовательских реализаций.
Для получения полного кода перейдите по ссылке ниже:
https://github.com/srinivas1918/spring-rest-security
источник
Я тоже долго искал, работаю над похожим проектом и обнаружил, что в Spring есть модуль для реализации сессий через redis. Выглядит просто и полезно. Я тоже добавлю в свой проект. Может быть полезно:
http://docs.spring.io/spring-session/docs/1.2.1.BUILD-SNAPSHOT/reference/html5/guides/rest.html
источник
Для проверки REST API есть 2 способа
1 - Обычная аутентификация с использованием имени пользователя и пароля по умолчанию, заданных в файле application.properties
Базовая аутентификация
2 - Аутентификация с использованием базы данных (userDetailsService) с фактическим именем пользователя и паролем
Расширенная аутентификация
источник