Как передать параметр вместе с URL успеха выхода из системы в весенней безопасности?
Я использую конфигурацию безопасности Spring на основе Java в своем приложении для весенней загрузки. Когда пользователь нажимает на ссылку выхода из системы, он перенаправляется на страницу входа. Здесь, в этом случае, мне нужно передать пользовательский параметр в URL успеха выхода из системы.
например, когда я выхожу, приложение перенаправляется на http://localhost:8080/app/login, но я хочу, чтобы у него был параметр, подобный приведенному ниже http://localhost:8080/app/login?idletimeout=true
Я создал свой собственный LogoutSuccesshandle для этого. Я получаю значение параметра в обработчике, а затем создаю URL успеха и затем перенаправляю на него. Но затем при выходе из системы этот параметр пропадает.
Ниже мой код обработчика.
public class LogoutSuccessHandlerImpl extends SimpleUrlLogoutSuccessHandler {
private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
request.getSession().invalidate();
SecurityContextHolder.clearContext();
request.setAttribute("isLoggedOut", "true");
String contextPath = request.getContextPath();
String redirectURL = "/login";
String isIdleTimeOut = request.getParameter("idleTimeout");
request.setAttribute("idleTimeout", isIdleTimeOut);
System.out.println(isIdleTimeOut + " isIdleTimeOut ");
if (isIdleTimeOut != null && isIdleTimeOut.equalsIgnoreCase("true")) {
System.out.println("in if ");
redirectURL += "?idleTimeout=" + isIdleTimeOut;
}
// setDefaultTargetUrl(redirectURL);
// response.sendRedirect(redirectURL);
// super.onLogoutSuccess(request, response, authentication);
redirectStrategy.sendRedirect(request, response, redirectURL);
}
Ниже мой код конфигурации Java.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/checkLogin")
.defaultSuccessUrl("/home")
.failureUrl("/login?login_error=1")
.usernameParameter("username")
.passwordParameter("password")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(new LogoutSuccessHandlerImpl())
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.permitAll()
.and()
.authorizeRequests()
.antMatchers("/login**").permitAll()
.antMatchers("/error**").permitAll()
.antMatchers("/checkLogin**").permitAll()
.anyRequest()
.authenticated()
.accessDecisionManager(accessDecisionManager)
.and()
.exceptionHandling()
.accessDeniedPage("/accessDenied")
.and()
.headers()
.frameOptions()
.disable()
.and()
.sessionManagement()
.invalidSessionUrl("/login")
.maximumSessions(1);
}
2 ответа
Что вы можете сделать, это подготовить свой собственный метод выхода из системы (пользовательский URL-адрес выхода) для вашего приложения:
1) Подготовьте свой LogoutController:
@Controller
@RequestMapping(value = "/logout")
public class LogoutController {
@RequestMapping(value = {"", "/"})
public String logout(HttpServletRequest request) {
SecurityContextHolder.clearContext();
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
return "redirect:" + <your-logout-success-url>;
}
}
Здесь, аннулирование сеанса и очистка контекста предоставляет вам механизм выхода из системы.
2) Обновите ваши URL для выхода из системы внутри jsp файлов:
<a href="/logout" id="logout_" title="Log out"><span>Log out</span></a>
3) Кроме того, для сценариев выхода из системы по умолчанию вы все равно можете продолжать использовать выход из системы Spring Security:
<logout logout-success-url="/" invalidate-session="true" delete-cookies="JSESSIONID"
logout-url="/j_spring_security_logout"/>
Таким образом, в этом методе выхода из системы вы можете делать все, что захотите, с объектом запроса, когда пользователь запрашивает процесс выхода из системы. Вам не нужно передавать параметры сейчас.
Должно быть как то так
http
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/login?idletimeout=true"));
В XML
<logout invalidate-session="true" logout-success-url="/login?idletimeout=true"/>