2011-03-15 33 views
1

如果我有一个自定义的Jetty UserRealm实现并为其进行基本身份验证(使用SSL)进行配置,有没有办法在第三次登录失败后让它进入特定页面?Jetty UserRealm在第3次登录失败时重定向

嗯,真的,我只是想显示一些联系信息给用户,如果他们不能在3次尝试后登录。

替代地是能够显示这是我从

public Principal authenticate(final String username, final Object credentials, final Request request) 

方法投掷时其配置为基本认证异常?

感谢 尼尔

回答

1

BasicAuthenticator是负责发送403响应时,有在请求没有有效凭证。

望着码头6源,你是最好的选择可能是子类BasicAuthenticator并覆盖public void sendChallenge(UserRealm realm,Response response)

public class MyAuthenticator extends BasicAuthenticator { 
    @Override 
    public void sendChallenge(UserRealm realm, Response response) { 
     int numberOfAttempts = getNumberOfAuthenticationAttempts(); 

     if (numberOfAttempts > 3) { 
      sendContactDetails(realm, response); 
     } 
     else 
      super.sendChallenge(realm, response); 
    } 

    protected int getNumberOfAuthenticationAttempts() { ... } 
    protected void sendContactDetails(Response response) { ... } 

}

显然,这样做的问题是,你没有访问到HttpServletRequest这可能使跟踪请求尝试更加困难。您可能可以通过HttpConnection.getCurrentConnection()获得访问权限。否则,BasicAuthenticator的代码不适用于没有复制/粘贴的扩展名,但对您的情况可能没有问题。

我忽略了跟踪在同一个身份验证尝试中发出的请求数量的问题,这将取决于您的客户端如何连接。

或者,您可以在上下文中设置ErrorHandler,当调用HttpResponse.sendError时会使用该上下文,在您的领域中引发异常时将会出现这种情况。

我可能会选择使用第一种方法,因为它更清楚地区分责任。

+0

对于未知凭证Jetty现在发送了500错误https://bugs.eclipse.org/bugs/show_bug.cgi?id=486497您是否知道如何返回登录而不是500错误页面?我有一个扩展的ErrorHandler。我正在尝试挑出500错误并注销用户以清除http头中的基本身份验证:授权:基本QTo = – 2016-04-21 06:07:38

相关问题