我想同时拥有表单和基本身份验证。
如果请求来自https://username:password@mysite.com/,则使用基本身份验证。 如果请求来自https://mysite.com表单身份验证,则使用。
这可能吗?
答案 0 :(得分:3)
是的,这是可能的。
假设您正在使用命名空间配置,这非常简单。默认情况下,如果在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,并允许您自定义过滤器如何响应成功和失败的身份验证尝试。它们不是必需的。
答案 1 :(得分:1)
我刚观看了Ben Alex的Spring Security演讲。
基本上,他的小应用程序使用表单身份验证,但是, 如果您点击链接,请滚动到'29:00',在那里他谈到开箱即用的基本身份验证。