使用Spring Security自定义注销URL

时间:2012-09-25 14:39:57

标签: java spring-security

我们在创建URI时遵循一定的约定。所有与身份验证相关的URI(例如/login/logout/changepassword等都属于子上下文/auth

因此,我们与身份验证相关的URI看起来像:

/auth/login
/auth/logout
/auth/changepassword

这就是我们在Spring安全上下文XML中所拥有的。

<http pattern="/auth/**" security="none" />
<http pattern="/resources/**" security="none" />

<http auto-config="true" access-decision-manager-ref="accessDecisionManager">
    <intercept-url pattern="/admin/**" access="ADMINISTRATIVE_ACCESS"/>
    <intercept-url pattern="/**" access="XYZ_ACCESS"/>

    <form-login
            login-page="/auth/login"
            default-target-url="/content"
            authentication-failure-url="/auth/loginFailed"
            authentication-success-handler-ref="authenticationSuccessHandler"/>

    <logout logout-url="/auth/logout" logout-success-url="/auth/login"/>
</http>

现在的问题是/auth/logout在访问时给了我404。但是,如果我将其更改为以/auth以外的其他内容(例如/abcd/logout/logout开头),则可以正常使用。

我认为这是因为我们已将/auth/**定义为不安全但仍尝试将其用作注销页面。 (如果您还没有登录,如何访问注销?)

为了取悦我们相当严格的URI命名约定,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:4)

你对这个部分说得对:

  

我认为这是因为我们已将/auth/**定义为   不安全但仍尝试将其用作注销页面。 (你怎么   如果您尚未登录,请访问注销?)

更精确的定义

<http pattern="/auth/**" security="none" />

表示没有对与/auth/**模式匹配的请求应用Spring Security过滤器,因此Spring Security不会控制/auth/logout URL。

由于Spring Security匹配模式从上到下,主/auth/logout<http>的简单覆盖不起作用,因此该问题的解决方案可以定义单独的模式:

<http pattern="/auth/login" security="none" />
<http pattern="/auth/changepassword" security="none" />
<http pattern="/resources/**" security="none" />

<http auto-config="true" use-expressions="true" access-decision-manager-ref="accessDecisionManager">
    <intercept-url pattern="/auth/logout" access="permitAll"/>
    <intercept-url pattern="/admin/**" access="ADMINISTRATIVE_ACCESS"/>
    <intercept-url pattern="/**" access="XYZ_ACCESS"/>
    <!-- rest of your config -->
</http>

如果您要处理许多/auth/*个网址,可以使用<http>的{​​{3}},但我不认为它会以这种方式呈现。

答案 1 :(得分:2)

而不是security="none",我认为您需要access="permitAll"explanation of permitAll in the docs)。

我不确定security="none"应该做什么,但我认为您可能会与filters="none"混淆,导致the Spring Security chain to be bypassed completely