Spring的安全性在IE中确实很奇怪

时间:2013-05-13 19:21:31

标签: java spring spring-security fiddler

我遇到过前所见过的最奇怪的问题。

我正在使用的应用程序使用spring security 3.1.3来提供身份验证支持。有一个自定义登录表单,我已经实现了自定义authenticationmanager / successhandler和failurehandler。

出于某种原因在Internet Explorer上我总是收到错误消息“请填写所有必填字段”。这是因为将/ login?error = 1附加到我的url的末尾,只能通过以下代码(redirectAndAddError方法)访问:

public class TideUserNamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

public TideUserNamePasswordAuthenticationFilter() {
    super();
}

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {

    String username = request.getParameter(SPRING_SECURITY_FORM_USERNAME_KEY);
    String password = request.getParameter(SPRING_SECURITY_FORM_PASSWORD_KEY);

    if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
        redirectAndAddError(response);
        return null;
    }

    return super.attemptAuthentication(request, response);
}

private void redirectAndAddError(HttpServletResponse response) {
    try {
        response.sendRedirect("/tide/login?error=1");
    } catch (IOException e) {
        throw new AuthenticationServiceException(e.getMessage(), e);
    }
}

所以我尝试使用Fiddler2,这是一个Web调试代理,用于查看两个参数中的一个是否实际为空。奇怪的是,当这个程序运行时,错误不再发生,我可以成功登录。

以前有人遇到过类似的问题吗?我认为这与我的代码无关,因为运行该工具会突然“解决”问题。

此问题仅发生在Internet Explorer中,这使其更加奇怪。

修改

我使用了另一个工具来观察请求,这就是IE中发生的事情:

首先将POST请求发送到uri / authenticate,我自己设置了这样:

<beans:property name="filterProcessesUrl" value="/authenticate"/>

该请求的响应具有http状态代码302,暂时移动并返回新位置为/ login?error = 1(我的表单中包含必填字段错误)。

之后,GET请求发生在/ login?error = 1,状态码为401:Unauthorized。拦截网址设置如下:

 <intercept-url pattern="/login**" access="permitAll"/>

下一个请求是对/ login的错误请求?错误= 1,这次状态代码显示为:ERROR_INTERNET_CONNECTION_RESET,看起来可能有问题。

在Google Chrome中,提出以下请求:

POST到/ authenticate,结果是302:临时移动到仪表板页面(我登录后显示)

1 个答案:

答案 0 :(得分:0)

我的团队中的某个人终于找到了在chrome bugtracker中发现此问题后的问题:

https://code.google.com/p/chromium/issues/detail?id=62687

通过在我们的登录控制器中添加此问题已解决此问题

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doLogin() throws ServletException, IOException {
    return "forward:/authenticate";
}

并将表单发布的网址更改为此网址而不是弹出安全提供的身份验证网址(我们现在手动重定向到该网页)