我们在创建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命名约定,有没有办法解决这个问题?
答案 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。