Как разрешить исходному HttpServletRequest обрабатывать вход с использованием Spring Boot Security

#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");
}