Я пытаюсь реализовать экран, требующий действия после входа пользователя в систему Spring Безопасность? У меня есть требование, когда пользователь должен выполнить для заполнения формы (сменить пароль, принять Условия использования и т.д.), А затем, как только пользователь завершит это действие, он сможет использовать остальную часть приложения. Я использую Spring OAuth2 с экраном входа, который использует поток Spring безопасности.
До сих пор я пытался использовать http.formLogin().successHandler()
, который имеет пользовательскую реализацию SavedRequestAwareAuthenticationSuccessHandler
, которая определяет, требуется ли пользователю действие, а затем перенаправляет пользователя на страницу, когда он может заполнить форму, но проблема с этим что если пользователь перейдет от этой страницы, он войдет в приложение и сможет использовать его, не пропуская форму. Но я пытаюсь запретить пользователю устанавливать сеанс до тех пор, пока эта форма действия не будет завершена. После того, как он будет заполнен, пользователь должен автоматически войти в систему (например, если пользователь согласился с Условиями использования, он должен войти в систему без повторного ввода пароля)
Вот код, который у меня до сих пор является пользовательским обработчиком:
public class CustomLoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Autowired
UserService userService;
public final static String TARGET_URL_SESSION_ATTR_NAME = "target-url";
public CustomLoginSuccessHandler(String defaultTargetUrl) {
setDefaultTargetUrl(defaultTargetUrl);
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
HttpSession session = request.getSession();
AuthorityUser authorityUser = (AuthorityUser)authentication.getPrincipal();
String userId = authorityUser.getUserId();
User u = userService.getById(userId);
Boolean changeRequiredDob = u.getChangeRequiredDob();
Boolean changeRequiredPwd = u.getChangeRequiredPwd();
Boolean changeRequiredTou = u.getChangeRequiredTou();
if(changeRequiredDob || changeRequiredPwd || changeRequiredTou){
String targetUrl = determineTargetUrl(request, response);
session.setAttribute(TARGET_URL_SESSION_ATTR_NAME, targetUrl);
getRedirectStrategy().sendRedirect(request, response, "/action-required");
} else {
super.onAuthenticationSuccess(request, response, authentication);
}
}
}
И затем, как только он будет успешно завершен, я перенаправляю пользователя на TARGET_URL_SESSION_ATTR_NAME
, который был сохранен в сеансе.
Также было бы полезно узнать, как обнаружить и перенаправить пользователя на экран требуемого действия в течение установленных сеансов (если пользователь вошел в систему, а позже, когда он выполнил вход в систему, устанавливает флажок требуемого действия в своей учетной записи).