В приложении GWT, как защитить свои Места и Действия от неавторизованных пользователей?

У меня есть приложение GWT, использующее шаблон "Действия" и "Места" для навигации по различным местам в моем приложении. В приложении есть места, которые может просматривать только авторизованный пользователь.

Механизм авторизации следующий:

1 - пользователь вводит имя пользователя + пароль

2- проверьте сервер для такого пользователя с предоставленным паролем.

3 - добавить токен в хранилище данных, содержащий SID, имя пользователя и дату истечения срока действия (я использую GAE bwt)

4- Отправьте токен Клиенту.

Теперь, прежде чем я позволю пользователю перейти на место, я должен проверить, авторизован ли он / она, проверяя, действителен ли его / ее токен, т.е. ранее сохраненный в хранилище с помощью операции авторизации. Я закончил с некоторым ActivityMapper как этот.

public class ApplicationActivityMapper implements ActivityMapper {

  private ActionDispatcherServiceAsync service;

  private SecurityTokenProvider provider;
  private HashMap<Class<? extends Place>, ActivityPlaceMeta> placesActivitiesMap;

  @Inject
  public ApplicationActivityMapper(ActionDispatcherServiceAsync service, SecurityTokenProvider provider, HashMap<Class<? extends Place>, ActivityPlaceMeta> placesActivitiesMap) {

    this.service = service;

    this.provider = provider;

    this.placesActivitiesMap = placesActivitiesMap;

    this.placesActivitiesMap.put(PlaceNotFoundPlace.class, new ActivityPlaceMeta() {
      @Override
      public Activity getActivity(Place place) {
        return new PlaceNotFoundActivity();
      }
    });
  }

  @Override
  public Activity getActivity(Place place) {

    if (place instanceof SecuredPlace) {
      Token token = provider.getToken();
      service.dispatch(new CheckAuthorizationAction(token), new GotResponse<CheckAuthorizationResponse>() {
        @Override
        public void gotResponse(CheckAuthorizationResponse result) {
          if (result.isAuthorized()) {
            //here comes tht problem .... !!! 
            //how to return the place ???
          }
        }
      });
    }

    ActivityPlaceMeta returnedActivity = placesActivitiesMap.get(place.getClass());

    if (returnedActivity == null) {
      return placesActivitiesMap.get(PlaceNotFoundPlace.class).getActivity(new PlaceNotFoundPlace());
    }
    return returnedActivity.getActivity(place);
  }
}

Есть другие идеи? Заранее спасибо.

2 ответа

Решение

В приложениях GWT речь идет не о защите части вашего пользовательского интерфейса, а о защите вашей серверной части, которая предоставляет данные, необходимые для определенного места.

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

Конечно, вы можете захотеть ограничить навигацию в своем клиенте, если пользователь не вошел в систему, и вы можете сделать это, например, в ваших таблицах активности.

Оберните свой главный ActivityMapper в FilteredActivityMapper. Затем в фильтре, предоставленном его конструктору, осуществите ваши проверки подлинности / авторизации и верните LoginFormPlace если ни один пользователь не вошел в систему.

Другие вопросы по тегам