3

我们在创建 URI 时遵循一定的约定。所有与身份验证相关的 URI,例如/login,/logout等都/changepassword属于 sub-context /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/logoutor even以外的其他内容开头/logout,则效果很好。

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

为了满足我们相当严格的 URI 命名约定,有什么办法可以解决这个问题吗?

4

2 回答 2

4

你是对的部分:

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

更精确的定义

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

意味着没有 Spring Security 过滤器应用于匹配/auth/**模式的请求,因此 Spring Security 不会控制/auth/logoutURL,而它应该。

因为 Spring Security 从上到下匹配模式,所以/auth/logoutmain 中的简单覆盖<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/*URL 需要处理,你可以使用<http>'s request-matcher="regex",但我不认为那样可读。

于 2012-09-25T14:57:14.447 回答
2

而不是security="none",我认为你想要access="permitAll"在文档中对 permitAll 的解释)。

我不确定security="none"应该做什么,但我认为您可能会将其与 混淆filters="none",这会导致Spring Security 链被完全绕过

于 2012-09-25T14:52:06.247 回答