Spring mvc 另一个春季安全问题

Spring mvc 另一个春季安全问题,spring-mvc,spring-security,Spring Mvc,Spring Security,我在SpringMVC应用程序中使用SpringSecurity进行用户身份验证。我发现了一个非常奇怪的行为,这可能是由于我对Spring Security的错误配置,或者是一个bug造成的。我需要帮助找出是哪一个 一个重要的注意事项是,在任何人将此问题标记为“Spring Security logout Back”按钮的复制品之前,类似问题:此问题与注销后的行为无关。这里的一切都发生在一个用户会话中 因此,我有一些页面对任何用户都可见,有些页面只对管理员可见home.jsp对任何用户都可见,并

我在SpringMVC应用程序中使用SpringSecurity进行用户身份验证。我发现了一个非常奇怪的行为,这可能是由于我对Spring Security的错误配置,或者是一个bug造成的。我需要帮助找出是哪一个

一个重要的注意事项是,在任何人将此问题标记为“Spring Security logout Back”按钮的复制品之前,类似问题:此问题与注销后的行为无关。这里的一切都发生在一个用户会话中

因此,我有一些页面对任何用户都可见,有些页面只对管理员可见
home.jsp对任何用户都可见,并且它是my
spring security.xml中的
默认目标url
<然而,code>users.jsp
页面(所有用户的列表)被认为只对管理员可见

现在有一个简单的场景:

  • 启动应用程序
  • 用户身份登录并重定向到任何用户都能看到的
    home.jsp
    页面
  • 导航到页面
    users.jsp
    只有管理员可以查看并拒绝访问(这是可以的)
  • 导航到任何其他页面
  • 点击后退按钮,出现
    users.jsp
    页面,我甚至可以看到管理员已经登录,但自从启动应用程序以来,我从未以管理员身份登录过!!!(通过使用
    ,我可以看到谁登录了每个jsp页面)
  • 这是我的
    spring security.xml

    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/essays/auth/login" access="permitAll"/>
        <intercept-url pattern="/essays/auth/logout" access="permitAll"/>
        <intercept-url pattern="/essays/auth/denied" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/essays/main/user/home" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/essays/main/user/list" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/essays/main/user/add" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/essays/main/user/{userId}/edit" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/essays/main/user/delete" access="hasRole('ROLE_ADMIN')"/>
    
        <form-login login-page="/essays/auth/login"
                    authentication-failure-url="/essays/auth/login?error=true"
                    default-target-url="/essays/main/user/home"
                    always-use-default-target="true"/>
    
        <access-denied-handler error-page="/essays/auth/denied"/>
    
        <logout invalidate-session="true"
                logout-success-url="/essays/auth/login"
                logout-url="/essays/auth/logout"/>
    </http>
    
    <authentication-manager>
        <authentication-provider user-service-ref="customUserDetailsService">
            <password-encoder hash="md5"/>
        </authentication-provider>
    </authentication-manager>
    
    
    

    有什么想法吗?这是一个bug还是我做错了什么?

    问题在于缓存页面。如果您使用的是Spring Security 3.2+,则可以很容易地防止出现这种情况:

    
    
    请先清除缓存。然后再试一次。如果问题仍然存在,请为指定的整个流附加Spring安全日志。清除缓存解决了问题。现在我觉得自己很笨。太谢谢你了,请回答我好让我接受。也许这会帮助其他正在努力学习编程的人:)@robwing缓存的这个问题,当然,当我以管理员身份登录时会再次发生,之后我以用户身份再次登录-这是合乎逻辑的,因为我没有再次清除缓存。我不能要求用户在每次注销后清除缓存:)有没有一种方法可以通过编程清除浏览器缓存?或者,更好的问题是——如何处理这个问题?如果可以,请为我指出正确的方向。将服务器配置为告诉浏览器不要缓存页面。这是。此外,您通常应该在安全应用程序中使用HTTPS,并在用户注销时告诉他们关闭浏览器。受保护的页面将不会保留在缓存中。
    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/essays/auth/login" access="permitAll"/>
        <intercept-url pattern="/essays/auth/logout" access="permitAll"/>
        <intercept-url pattern="/essays/auth/denied" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/essays/main/user/home" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/essays/main/user/list" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/essays/main/user/add" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/essays/main/user/{userId}/edit" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/essays/main/user/delete" access="hasRole('ROLE_ADMIN')"/>
    
        <headers />
    
        <form-login login-page="/essays/auth/login"
                    authentication-failure-url="/essays/auth/login?error=true"
                    default-target-url="/essays/main/user/home"
                    always-use-default-target="true"/>
    
        <access-denied-handler error-page="/essays/auth/denied"/>
    
        <logout invalidate-session="true"
                logout-success-url="/essays/auth/login"
                logout-url="/essays/auth/logout"/>
    </http>