我正在使用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”网址。我错过了什么?
答案 0 :(得分:6)
pattern
元素中的<http>
属性意味着与该模式匹配的仅请求将通过该过滤器链传递。
特别是,登录页面(通常是/j_spring_security_check
)的提交将通过第二个链,它处理所有其他请求。因此它将由第二个{{创建的登录过滤器处理。登录后,1}}元素和用户将被重定向到form-login
。
听起来您最好使用单个过滤器链来处理所有请求,并使用AuthenticationSuccessHandler选择用户在登录后应重定向到的位置。
如果要配置提交管理员登录页面的URL以使登录请求通过第一个过滤器链,请使用/welcome
:
login-processing-url
然后修改您的管理员登录表单以提交到该URL。