【问题标题】:Spring security with two realms, first default-target-url is never invoked具有两个领域的 Spring 安全性,从不调用第一个 default-target-url
【发布时间】:2012-11-12 09:42:44
【问题描述】:

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

【问题讨论】:

    标签: spring-security


    【解决方案1】:

    &lt;http&gt; 元素中的pattern 属性意味着只有 匹配该模式的请求将通过该过滤器链。

    特别是登录页面的提交(通常是到/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。

    【讨论】:

    • 我有两个登录表单:adminLogin 和 login。在浏览器中输入“/adminLogin”会打开 adminLogin 页面。但是成功的登录会被重定向到 /welcome,而不是被重定向到 /adminWelcome。 Spring 文档建议我应该能够设置多个 元素。
    • /adminLogin 也将通过第二个过滤器链,但不会受到影响,因为您没有与此模式匹配的安全约束,因此页面将按照您的预期呈现。您可以设置多个&lt;http&gt; 元素,但它更复杂,您需要仔细考虑您将发出哪些请求以及哪个过滤器链将处理每个请求。如果您确实确定需要两个块,则可以使用login-processing-url配置登录表单提交到的URL
    • 感谢您指出多个 元素的复杂性。我尝试了使用 login-processing-url 的建议,但这对我不起作用,因此使用了单个 元素。在我的 /welcome 控制器中,我检查用户的角色并相应地处理它。
    猜你喜欢
    • 2013-04-24
    • 2012-03-29
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多