【问题标题】:Spring security welcome page accessible even after logout即使在注销后也可以访问 Spring 安全欢迎页面
【发布时间】:2013-09-05 07:26:09
【问题描述】:

我是 Spring Security 的新手。我正在关注本教程

http://www.mkyong.com/spring-security/spring-security-form-login-example/

当我们请求欢迎页面时一切正常,它重定向到登录表单,然后在输入凭据后给出欢迎页面。问题是当我单击注销时它确实注销但欢迎页面仍然可以访问我们我点击 ...@ localhost/SpringSecurity2/welcome 并且它不要求登录。我猜它与会话有关,但没有得到如何解决这个问题。我也使用了 delete-cookies="JSESSIONID" 但它不起作用。

我只想在用户注销并再次点击欢迎 url 时。他应该被引导到登录表单而不是欢迎页面,因为它需要身份验证。很快需要帮助 我的安全xml如下

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    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-3.0.3.xsd">

    <http auto-config="true">
        <intercept-url pattern="/welcome*" access="ROLE_USER" />
        <form-login login-page="/login" default-target-url="/welcome"
            authentication-failure-url="/loginfailed" />
        <logout 
        logout-success-url="/logout" />

    </http>

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

</beans:beans>

【问题讨论】:

  • 将此添加到您的注销标签中,并且您应该在您的应用程序中实现 logoutSuccessHandler。
  • 我已经这样做了,但那不起作用..它给出了 404 错误,它无法找到注销。你能告诉我如何实现 logoutsuccesshandler。
  • 检查您的 loginController 以及您为注销方法返回的内容。我说的是映射页面。
  • 听起来好像是缓存问题。如果您使用 Spring Security 3.2,则可以使用新的标头支持来解决此问题。见blog.springsource.org/2013/08/23/…
  • 我已经从mkyong.com/spring-security/spring-security-form-login-example 下载了源代码并将其构建到war。然后我部署到tomcat,它工作正常。我建议您也这样做并比较文件以找出您缺少的内容。

标签: spring spring-security logout


【解决方案1】:

最好的方法是通过实现javax.servlet.Filter 类来编写SessionFilter 类,如下所示。

package com.filter;
public class SessionFilter implements Filter {
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain arg2) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        if(null == session){
            response.sendRedirect("/login.html");
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }
}

并在您的 web.xml 文件中提及它,如下所示

<filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.filter.SessionFilter   
</filter-class>

并且不要忘记使用以下语句在注销控制器中使您的会话无效

request.getSession().invalidate();

希望这能解决您的问题

【讨论】:

  • 所以我们必须为此创建自己的过滤器...Spring Security 没有任何内置功能来终止该特定用户会话?
  • Spring Security 默认会终止会话。我的猜测是您正在查看欢迎页面的本地副本(缓存版本)。尝试以下操作,转到页面并刷新(或 CTRL 刷新),然后可能会要求您输入用户名/密码。
  • @palak spring 将在您在会话超时属性中提到的时间段后终止会话,但在您的情况下,您必须在注销事件时终止用户会话,因此您必须编写代码以使会话无效用户注销。
猜你喜欢
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多