Spring security logout - 仅在登录用户触发注销时添加消息

Posted

技术标签:

【中文标题】Spring security logout - 仅在登录用户触发注销时添加消息【英文标题】:Spring security logout - add a message only when logout triggered from a logged in user 【发布时间】:2015-07-29 01:50:41 【问题描述】:

假设我的注销 URL 是:app/logout。 仅当通过单击注销按钮触发注销时,我才需要在注销页面中显示一条消息 - “您已成功注销”。 如果用户直接输入此 URL,则不应显示该消息。知道如何实现吗?

控制器:

@RequestMapping(value ="/logout", method = RequestMethod.GET)
    public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) 
            ModelAndView model = new ModelAndView();
       //some code here to distingish
            model.addObject("msg", "You are succesfully logged out!");
            model.setViewName("login");
        return model;
    

Spring-Security.xml:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd">

<http auto-config="true" create-session="ifRequired" use-expressions="true">        
<intercept-url pattern="/logout" access="IS_AUTHENTICATED_REMEMBERED"/>
    <form-login 
        login-page="/login" 
        default-target-url="/home" 
        authentication-failure-url="/login?error" 
        username-parameter="username"
        password-parameter="password" />
    <logout logout-success-url="/logout" invalidate-session="true" delete-cookies="JSESSIONID"/>
    <!-- enable csrf protection -->
    <csrf/>
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="mkyong" password="123456" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

【问题讨论】:

【参考方案1】:

对于 Spring Security,我认为最简单的方法是使用 Spring Security 将 /logout 限制为经过身份验证的用户。

使用命名空间:

<intercept-url pattern="/logout" access="IS_AUTHENTICATED_REMEMBERED"/>

使用Java配置,会是:

protected void configure(HttpSecurity http) throws Exception 
    http
        .authorizeRequests()
            .antMatchers("/logout").authenticated()
            ...

【讨论】:

面对错误:Failed to evaluate expression 'IS_AUTHENTICATED_REMEMBERED.' @Robby Failed to evaluate expression 'IS_AUTHENTICATED_REMEMBERED 的错误可以使用这个答案解决:***.com/a/33443212/3380951【参考方案2】:

添加 @RequestParam(value = "foo", required = false) Boolean foo

将此附加参数添加到注销按钮,如果foo 存在并且为真,请按照您的逻辑进行

【讨论】:

谢谢。这行得通。但是将注销 URL 限制为仅对经过身份验证的用户似乎是更好的方法。再次感谢。 :) 是的,这是更好的解决方案:)

以上是关于Spring security logout - 仅在登录用户触发注销时添加消息的主要内容,如果未能解决你的问题,请参考以下文章

调用 j_spring_security_logout 不起作用

spring-security login?logout 重定向到登录

Spring-Security文档笔记之logout

spring-security doc logout

Spring Security(10)——退出登录logout

前后端分离 Spring Security 对登出.logout()的处理