#spring #spring-boot #spring-security
#spring #spring-boot #spring-безопасность
Вопрос:
Я использую Spring Security и хотел бы обрабатывать аутентификацию с помощью контейнера jee. Итак, единственной причиной spring security является авторизация. Все фильтры предварительной аутентификации уже настроены и работают.
Я создал пользовательскую конечную точку для запуска аутентификации.
import javax.http.HttpServletRequest;
...
@PostMapping("/auth/login")
public void login(HttpServletRequest request) throws ServletException {
request.login("something", "something");
}
...
Похоже, что HttpServletRequest обернут SecurityContextHolderAwareRequestWrapper. Следующий метод (который предоставляется spring boot) обрабатывает аутентификацию:
HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper.login(…)
@Override
public void login(String username, String password) throws ServletException {
if (isAuthenticated()) {
throw new ServletException("Cannot perform login for '" username
"' already authenticated as '" getRemoteUser() "'");
}
AuthenticationManager authManager = HttpServlet3RequestFactory.this.authenticationManager;
if (authManager == null) {
HttpServlet3RequestFactory.this.logger.debug(
"authenticationManager is null, so allowing original HttpServletRequest to handle login");
super.login(username, password);
return;
}
Authentication authentication;
try {
authentication = authManager.authenticate(
new UsernamePasswordAuthenticationToken(username, password));
}
catch (AuthenticationException loginFailed) {
SecurityContextHolder.clearContext();
throw new ServletException(loginFailed.getMessage(), loginFailed);
}
SecurityContextHolder.getContext().setAuthentication(authentication);
}
Если AuthManager равен нулю, он должен инициировать вход с исходного HttpServletRequest.
Но в том-то и дело, что он не равен null из-за AnonymousAuthenticationProvider и PreAuthenticatedAuthenticationProvider, подключенных к ProviderManager. Есть ли другой способ инициировать вход в исходном HttpServletRequest?
Ответ №1:
Я обошел это, используя запрос моего контейнерного сервлета в моем методе:
import com.ibm.ws.webcontainer.srt.SRTServletRequest;
@PostMapping("/auth/login")
public void login(SRTServletRequest request) throws ServletException {
request.login("something", "something");
}