栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring Security,注销:将参数从/ logout传递到/ login

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Security,注销:将参数从/ logout传递到/ login

您需要

logoutSuccessHandler
代替下面的
.logoutSuccessUrl("/login?logout")

配置
logoutSuccessHandler

@Overrideprotected void configure(final HttpSecurity http) throws Exception{    http        .authorizeRequests() .antMatchers("/resources/**", "/", "/login", "/api/**")     .permitAll() .antMatchers("/app/admin/*")     .hasRole("ADMIN") .antMatchers("/app/user/*")     .hasAnyRole("ADMIN", "USER")        .and().exceptionHandling().accessDeniedPage("/403")        .and().formLogin() .loginPage("/login").usernameParameter("userName") .passwordParameter("password") .defaultSuccessUrl("/app/user/dashboard") .failureUrl("/login?error=true")        .and().logout() .logoutSuccessHandler(new CustomLogoutSuccessHandler()) .invalidateHttpSession(true)        .and().csrf().disable();    http.sessionManagement().maximumSessions(1).expiredUrl("/login?expired=true");}

我考虑过写自己的/ logout处理程序

实际上,这不是注销处理程序,而是注销启动器。
使用CustomLogoutSuccessHandler,可以在其中获取请求参数,然后可以再次设置它,如下所示。

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.security.core.Authentication;import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler{    @Override    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException    {        cookie cookie = new cookie("JSESSIONID", null);        cookie.setPath(request.getContextPath());        cookie.setMaxAge(0);        response.addcookie(cookie);        if(request.getParameter("expired") != null)        { response.sendRedirect(request.getContextPath()+"/login?expired=true");        }        else        { response.sendRedirect(request.getContextPath() + "/login?logout=true");        }    }}

从我的应用程序中,我发出了这个Spring Security注销URL(注销是自动的,因此我没有特定的处理程序)

servlet / spring安全性没有自动注销功能。只有我们能实现的是
1.自动化客户端以发送注销请求
。2.在服务器中,我们可以设置会话的maxInactiveInterval,以便可以通过删除cookie
/将cookie的使用期限设置为过去的日期来使会话无效。一旦会话对下一个请求无效,spring安全过滤器链中的一个过滤器会将其重定向到/ param过期的/
login页面。

/login?expired

如果您启动注销,spring security将删除cookie /使会话无效,并使用param注销重定向到/
login页面。
/login?logout

在Spring Security中,有两种配置可以实现注销。

.and().logout().invalidateHttpSession(true)//or.deletecookies("JSESSIONID")

编辑:看到OP的答案后。 缺少在此处添加的信息。OP和我在临时答案(该聊天和答案已被删除)中进行了长时间聊天,我们在其中找到了 LOGIN-
WALL

“登录墙”是配置错误的结果,您将在其中定义一个自定义登录页面,并将其配置为在身份验证后允许访问的资源。(

access=isAuthenticated
),但如果我们在使会话无效的情况下重定向到登录页面,则从CustomLogoutSuccessHandler进行弹簧安全性阻止登录页面访问(401-未授权),因为该页面仅允许经过身份验证的用户使用。阻止Spring安全性后,将负责重定向到配置中配置的页面。`.loginPage(“
/ someloginpage”)。它迫使人们认为注销正确发生,可以正确重定向到登录页面,但是我在查询字符串中发送的参数没有进入登录页面。
如果我称其为难题,那没错,这很难猜



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369736.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号