如何在Spring Security 4中禁用UsernamePasswordAuthenticationFilter

时间:2015-05-20 16:20:35

标签: spring jsf spring-security

我将JSF应用程序从Spring Security 3.2迁移到4.0.1。此版本会更改许多默认网址,例如默认登录网址为/login

应用程序有自己的登录页面(使用JSF AJAX)并且在调用/login时仍然显示,但是对此URL的所有POST请求(以及来自Login-Page的所有AJAX请求)都是由UsernamePasswordAuthenticationFilter捕获并且正在尝试处理身份验证,导致请求再次重定向到loginform。

在查看代码之后,这个网址似乎是硬编码的:

public UsernamePasswordAuthenticationFilter() {
    super(new AntPathRequestMatcher("/login", "POST"));
}

所以我必须完全禁用此过滤器,或者更好,避免它的创建。任何人都可以指出我是如何做到的。

将我的登录页面更改为另一个URL正在运行,但这不是一个很好的解决方案。

编辑:我在Spring Security中为此创建了一个Bugticket:https://jira.spring.io/browse/SEC-2992

编辑2:我发现了另一种解决方法:如果我将表单登录的login-processing-url设置为未使用的东西,那么它正在运行,但似乎非常hacky。应该有办法完全禁用它。此外,应该在迁移指南中说明,我发现这个时间之前已经失去了几个小时。

2 个答案:

答案 0 :(得分:1)

我将假设您正在尝试升级到Spring Security 4.0.0(最新版本为4.0.1)。

Spring Security 3.x使用spring_security_login作为默认登录网址(sourceofficial documentation)。这可以设置为自定义值<security:form-login login-page="/login">并映射到控制器以呈现自定义页面。

Spring Security 4.x已放弃spring_security_login并切换为login作为默认登录网址(sourceofficial Spring Security 4.x migration guide)。因此,URL login现在转到默认的Spring Security基础结构,该基础结构显示默认的自动生成的登录页面。

was a bug in 4.0.0因为在将/login手动映射到自定义控制器方法的情况下仍然使用默认基础结构{{3}}。此错误已在4.0.1中修复。请尝试升级到Spring Security 4.0.1,看看是否可以使用/login作为登录URL。

答案 1 :(得分:0)

您似乎可以致电setFilterProcessesUrl(String)(或等效地setRequiresAuthenticationRequestMatcher(RequestMatcher))来覆盖默认的/login