具有两个领域的Spring安全性,从不调用第一个default-target-url

时间:2012-11-24 06:42:34

标签: spring-security

我正在使用Spring Security 3.1并配置了两个领域,一个用于管理员用户,另一个用于其他用户,如下所示:

<!-- Configure realm for administration users -->
<http pattern="/admin/**" >
    <intercept-url pattern="/admin*" access="ROLE_ADMIN,ROLE_USER" />
    <form-login login-page="/adminLogin" default-target-url="/adminWelcome"
        authentication-failure-url="/loginfailed" />
    <logout logout-success-url="/logout" />
</http>

<!--  Configure realm for normal users -->
<http>
    <intercept-url pattern="/welcome*" access="ROLE_USER" />
    <form-login login-page="/login" default-target-url="/welcome"
        authentication-failure-url="/loginfailed" />
    <logout logout-success-url="/logout" />
</http>

一切正常,但在所有成功登录 - 用户和管理员 - 上都会调用“欢迎”网址。管理员登录永远不会调用“adminWelcome”网址。我错过了什么?

1 个答案:

答案 0 :(得分:6)

pattern元素中的<http>属性意味着与该模式匹配的请求将通过该过滤器链传递。

特别是,登录页面(通常是/j_spring_security_check)的提交将通过第二个链,它处理所有其他请求。因此它将由第二个{{创建的登录过滤器处理。登录后,1}}元素和用户将被重定向到form-login

听起来您最好使用单个过滤器链来处理所有请求,并使用AuthenticationSuccessHandler选择用户在登录后应重定向到的位置。

更新

如果要配置提交管理员登录页面的URL以使登录请求通过第一个过滤器链,请使用/welcome

login-processing-url

然后修改您的管理员登录表单以提交到该URL。