4

我正在使用 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” url 永远不会在管理员登录时调用。我错过了什么?

4

1 回答 1

6

元素中的pattern属性<http>意味着只有与该模式匹配的请求才会通过该过滤器链。

特别是登录页面的提交(通常是/j_spring_security_check通过第二个链,它处理所有其他请求。所以它会被第二个元素创建的登录过滤器处理,并且用户在登录form-login后将被重定向到/welcome在。

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

更新

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

<http pattern="/admin/**" >
  <intercept-url pattern="/admin*" access="ROLE_ADMIN,ROLE_USER" />
  <form-login login-page="/adminLogin" login-processing-url="/admin/login.do" default-target-url="/adminWelcome"
    authentication-failure-url="/loginfailed" />
  <logout logout-success-url="/logout" />
</http>

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

于 2012-11-24T15:32:54.667 回答