Spring登录会将我重定向到登录页面,即使我看到的页面没有受到保护

时间:2014-11-18 08:52:46

标签: java spring spring-mvc spring-security

我有问题。当我启动我的应用程序并且我第一次输入时,例如wwww.sitename.com/index,我被重定向到登录页面。然后,如果我再次输入wwww.sitename.com/index,我将重定向到索引页面。

我的配置可能有错误,但我无法理解错误

    <security:session-management invalid-session-url="/login" session-authentication-error-url="/login" >
           <security:concurrency-control max-sessions="1" expired-url="/login" error-if-maximum-exceeded="true"/>
    </security:session-management>          

    <security:form-login 
            login-page="/login"         
            default-target-url="/index" 
            always-use-default-target="true"
            authentication-success-handler-ref="customSuccessHandler"                 
            authentication-failure-handler-ref="customFailureHandler"   
            username-parameter="j_username"         
            password-parameter="j_password" />          

    <security:logout
             logout-success-url="/login"                             
             delete-cookies="JSESSIONID" 
             invalidate-session="true" />                               

    <security:intercept-url pattern="/" access="permitAll" />
    <security:intercept-url pattern="/prv/**" access="hasRole('ROLE_USER')" /> 
    <security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />       

根据我的拦截网址,我应该可以访问不在 prv admin 文件夹下的所有网页而无需记录,不是吗?

3 个答案:

答案 0 :(得分:2)

我认为问题是第一个陈述。

    <security:session-management invalid-session-url="/login" session-authentication-error-url="/login" >

这里你说,如果用户提供了无效的会话ID,那么他应该被重定向到登录页面。一段时间后访问该页面时,您的会话已过期,可能会发生这种情况。尝试删除所有Cookie并再次访问该页面。

答案 1 :(得分:1)

Spring安全性开始以声明顺序评估您的intercept-url模式,并在第一次匹配时停止。所以在你的情况下,它匹配第一行

<security:intercept-url pattern="/" access="permitAll" />

每一个请求,并停止给予一切免费许可。它没有机会评估其他表达方式。

定义拦截网址时,必须先添加更多特定模式。例如:

<security:intercept-url pattern="/operation-one/admin/**" access="hasRole('ROLE_ADMIN')" />
<security:intercept-url pattern="/operation-one/**" access="hasRole('ROLE_USER')" />     
<security:intercept-url pattern="/" access="permitAll" />

在你的情况下,只需将permit-all模式放在最后

答案 2 :(得分:1)

<security:intercept-url pattern="/" access="permitAll" />仅允许访问根URL。如果您想允许访问任何URL,除了那些您有更多限制要求的URL,您应该改为:

<security:intercept-url pattern="/prv/**" access="hasRole('ROLE_USER')" /> 
<security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" /> 
<security:intercept-url pattern="/**" access="permitAll" />

按照目前的说法,任何index子句都没有捕获到网址intercept-url

相关问题