GWT аутентификация - PullRequest
       4

GWT аутентификация

2 голосов
/ 16 сентября 2010

Я занимаюсь разработкой приложения GWT + Spring и испытываю трудности с интеграцией GWT с системой Spring Security.

Сервисы защищены весенней безопасностью и ответом: 401 для неаутентифицированных пользователей (анонимных) и 403 для неавторизованного доступа.Моя проблема здесь в том, что я не могу заставить неуспешные AsyncRequests обрабатывать эти ошибки так, как я хочу, без повторного ввода снова и снова шаблонных заглушек для этой обработки.

Мне удалось разработать собственный фильтр для Spring Security, который отвечаетс заголовком «authorizeform», который содержит URL-адрес формы входа для исключения 401.

Поэтому возникает вопрос: есть ли способ обрабатывать исключения 401/403 глобально без стандартного кода onFailure и перенаправлять на URL-адрес из указанного заголовка?

Предстоящий RequestFactory имеет что-то вроде «AuthenticationFailedHandler», но 2.1 почти полностью еще не документирован и «находится в стадии быстрой разработки», поэтому похоже, что это не вариант.

Заранее спасибо!

1 Ответ

0 голосов
/ 22 сентября 2010

Очень простой способ обработки сбоев безопасности на уровне приложения - это определить абстрактный обратный вызов для вашего приложения, который позаботится о шаблоне onFailure в одном согласованном месте.Для каждого запроса на обслуживание в вашем коде вы сможете использовать обратный вызов и реализовать любую конкретную обработку.

public abstract class ServiceCallback<T> implements MethodCallback<T> {
private ServiceCallbackListener listener;

public ServiceCallback(ServiceCallbackListener serviceCallbackActions) {
    this.listener = serviceCallbackActions;
}

@Override
public void onFailure(Method method, Throwable exception) { 
    if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) {
        listener.onUnAuthorizedAccess();
    } else {
        onError(method, exception);
    }
}

public abstract void onError(Method method, Throwable exception);
}

Теперь вы можете вызывать службу следующим образом:

service.callToServer(new ServiceCallback<ServiceResponse>(sessionListener) {
        @Override
        public void onSuccess(Method method, ServiceResponse response) {
            Log.debug("It worked!");
        }

        @Override
        public void onError(Method method, Throwable exception) {
            Log.debug("Didn't work.. ");
        }
    });

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

...