【问题标题】:Can you have both form and basic authenication using Spring 3您可以使用 Spring 3 同时进行表单和基本身份验证吗
【发布时间】:2010-06-17 15:26:40
【问题描述】:

我希望同时拥有表单和基本身份验证。

如果请求来自https://username:password@mysite.com/,则使用基本身份验证。 如果请求来的像https://mysite.com,则使用表单身份验证。

这可能吗?

【问题讨论】:

  • 你的意思是让用户能够在浏览器中使用它并且具有基本类型的行为、没有过期、没有注销等。或者你只是希望能够从命令行工具?

标签: java spring-security


【解决方案1】:

是的,这是可能的。

假设您正在使用命名空间配置,这真的很简单。默认情况下,如果您在 http 元素上使用自动配置,它们都会启用。请参阅 springsecurity3 参考文档的第 2.2 节。您可以使用 http 元素上的 realm 属性为基本身份验证设置自定义领域。表单和基本身份验证都将使用配置的任何身份验证提供程序。

如果您没有在 http 元素上使用自动配置,您只需将 <http-basic /> 标记作为子元素添加到 http 元素即可启用基本身份验证。很有可能您对表单身份验证的默认配置不感兴趣,因此该标签可能会更复杂一些。

我的看起来像这样:

    <form-login login-page="/login.html"
        default-target-url="/home.html" always-use-default-target="true"
        authentication-success-handler-ref="authenticationSuccessHandler"
        authentication-failure-handler-ref="authenticationFailureHandler"
        login-processing-url="/j_spring_security_check" />

显然,必须允许匿名访问 /login.html 路径。该页面需要呈现一个提交给 /j_spring_security_check 的表单,过滤器将拦截该表单,找到用户名和密码,并根据配置的身份验证提供程序进行身份验证。如果您深入研究命名空间的其余部分,您会发现可以覆盖字段的名称等。

我不确定 spring 是否总是默认使用表单身份验证,除非在请求中提供了 Authorization 标头并且它缺少有效的用户名/密码对,或者它是否默认为第一个过滤器或最后一个过滤器,或者什么.但是实验应该能让你很容易地弄清楚这一点。查看第 8 章的最后一节和第 9 章的第一节,它看起来好像会将所有未经身份验证的用户发送到表单入口点,除非请求中有 Authorization 标头,在这种情况下,将导致身份验证失败在对客户端的基本身份验证所需的响应中。如果您想手动配置所有内容而不是使用命名空间,第 8 章和第 9 章也是您可以查看的地方。

authentication-success-handler 和 authentication-failure-handler 必须实现 AuthenticationSuccessHandler 和 AuthenticationFailureHandler 并允许您自定义过滤器如何响应成功和失败的身份验证尝试。它们不是必需的。

【讨论】:

    【解决方案2】:

    我刚刚观看了 Ben Alex 在 Spring Security 上的演示。

    基本上,他的小应用程序使用表单身份验证,但是, 如果您点击链接,请滚动到“29:00”,他谈到开箱即用支持基本身份验证。

    【讨论】:

      猜你喜欢
      • 2022-10-05
      • 2013-09-14
      • 2012-07-28
      • 2010-10-04
      • 2012-06-05
      • 2015-02-06
      • 2012-10-26
      • 2014-09-22
      相关资源
      最近更新 更多