В приложении 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
если ни один пользователь не вошел в систему.