У меня есть требование интегрировать многофакторную аутентификацию (с использованием сторонних сервисов) в проект Spring Security. Основное требование - сначала проверить, действительны ли указанные ИД пользователя / пароль, а затем проверить, включен ли для пользователя MFA, а затем перенаправить пользователя на страницу MFA. На странице MFA будет 2 шага: 1) Если пользователь не зарегистрирован в MFA, разрешите пользователю ввести номер телефона 2) попросите пользователя ввести OTP. Если OTP правильный (оставьте API-интерфейс сторонним), затем сгенерируйте токен.
В классе CustomAuthenticationSuccessHandler я попытался перенаправить пользователя на страницу MFA, если для него включен MFA. Но при таком подходе я не могу остановить генерацию токенов до завершения MFA.
@ Открытый класс компонента CustomAuthenticationSuccessHandler расширяет SavedRequestAwareAuthenticationSuccessHandler реализует AuthenticationSuccessHandler {
AesBase64Wrapper aesBase64Wrapper = new AesBase64Wrapper();
@Autowired
private RestTemplate restTemplate;
@Autowired(required = true)
private Environment env;
public CustomAuthenticationSuccessHandler() {
super();
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
ResponseEntity<Boolean> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, Boolean.class);
if (responseEntity.getBody().booleanValue() == true) {
getRedirectStrategy().sendRedirect(request, response, "/mfa?username=" + encodedUsername);
} else {
setDefaultTargetUrl("/home");
try {
String clientAddress = "";
String sessionID = "";
if (request != null) {
clientAddress = request.getRemoteAddr();
sessionID = request.getSession().getId();
}
ClientAddress.removeClientAddress(clientAddress, sessionID);
} catch (Exception ex) {
System.out.println(ex.toString());
} finally {
super.onAuthenticationSuccess(request, response, authentication);
}
}
}
}