Короткая версия
Метод javax.servlet.ServletRequest
setAttribute(<key>, <Object>)
используется только как средство передачи объектов между методами в коде Java?
Длинная версия
Давайтескажем, у меня есть javax.servlet.Filter
реализация для обработки аутентификации всех вошедших в систему пользователей с помощью куки:
в Spring Boot
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
Cookie[] cookies = null;
if (request instanceof HttpServletRequest) {
cookies = ((HttpServletRequest) request).getCookies();
}
Optional<User> user = mySessionAuthMethod(cookies);
if (user.isPresent()) {
request.setAttribute("user", user.get());
}
chain.doFilter(request, response);
}
}
Тогда позже я могу избежать ручногопроверка подлинности во всех методах Web API и просто проверьте атрибут user
.Пример использования метода @RestController
:
@RequestMapping(value = "/profile")
@CrossOrigin(origins = {MyProperties.ORIGIN}, allowCredentials = "true")
public ResponseEntity getProfile(HttpServletRequest request, HttpServletResponse response) {
String user = request.getAttribute("user");
if (user != null) {
return myGetProfileResponse(user);
}
return myNotLoggedInResponse();
}
Мои вопросы:
Безопасна ли эта форма аутентификации? Что язначит, атрибуты в ServletRequest
только добавляются и используются в Java для связи между методами, или они могут быть добавлены к запросу уже до достижения сервера?
Является ли этот способ аутентификации с использованием Filter
хорошей практикой, чтобы избежать дублирования кода?
Дополнительное объяснение
Настоящая причина этого не только аутентификация.У меня также есть Filter
s, которые должны обрабатывать каждый запрос и передавать объекты в Controller
s.Я определенно хочу, чтобы ни один из этих объектов и информации не мог быть подделан даже человеком, который знает реализацию системы.