我有一个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);
}
}
还有其他想法吗? 提前谢谢。
答案 0 :(得分:3)
使用GWT应用程序不是为了保护您的一部分UI,而是为了保护您的服务器端,提供某个地方所需的数据。
如果某个用户前往需要登录的地方,则只需让远程服务无法提供任何数据。然后,您的演示者应该处理失败并可能重定向到登录位置。
当然,如果用户未登录,您可能希望限制客户端中的导航,并且您可以这样做,例如在你的活动地图制作者。
答案 1 :(得分:2)
将您的主ActivityMapper
换入FilteredActivityMapper。然后在提供给它的构造函数的Filter中实现你的身份验证/授权检查并返回例如如果没有用户登录,则为LoginFormPlace
。