Перенаправление Jetty UserRealm при 3-м неудачном входе - PullRequest
1 голос
/ 15 марта 2011

Если у меня есть пользовательская реализация Jetty UserRealm и она настроена для базовой аутентификации (с SSL), есть ли способ заставить ее перейти на определенную страницу после 3-го неудачного входа в систему?

Ну, на самом деле я просто хочу показать некоторую контактную информацию пользователю, если он не может войти в систему после 3 попыток.

В качестве альтернативы можно отобразить исключение, которое я выбрасываю из

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

метод, когда он настроен как базовая аутентификация?

Спасибо Neil

1 Ответ

1 голос
/ 30 марта 2011

BasicAuthenticator отвечает за отправку ответа 403. Если в запросе нет действительных учетных данных.

Глядя на источник Jetty 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,это будет тот случай, когда вы создадите исключение в своей сфере.

Я бы, вероятно, решил использовать первый метод, так как он более четко разделяет обязанности.

...