1

我在我的 GWT 应用程序中使用 GWTP 并具有以下架构:

LoginPresenter (Presenter)
    DashboardPresenter (TabContainerPresenter)
        TabbedPresenter1 (Presenter)
        TabbedPresenter2 (Presenter)
        TabbedPresenter3 (Presenter)

第一次启动我的应用程序时,在 DashboardPresenter 中调用 onBind 和 addTab 方法,当我导航到选项卡时,在该演示者上调用 onbind 方法。

如果我创建一个 PlaceRequest 并通过我的 PlaceManager 导航回 LoginPresenter(通过按注销按钮),我将返回到登录演示者。

问题是,如果我再次登录,则不会调用所有 onBind 方法,因为它们仍在内存中。onReset 和 onReveal 被正确调用,但我非常希望每个 Presenter 都被重置,并且每次登录时都会调用 onBind。

如果用户没有足够的权限查看这些选项卡,我决定登录事件哪些选项卡应该对用户可见,并在 DashboardPresenter 的 addTab 方法中限制选项卡。但截至目前,这些选项卡是在用户第一次登录时设置的,但不会在下次登录时设置。这意味着如果具有较少权限的用户在管理员用户之后登录,他可以看到与管理员相同的选项卡。不好!

我应该如何处理?我非常想在用户注销(导航到登录页面)时“重置”所有演示者或会话。是否需要“重置” Ginjector,使其不会返回与以前相同的绑定对象?

澄清一下:我们确实有服务器端安全性,它禁止无权访问敏感数据的用户。但是当用户登录时,gwt 应用程序会收到用户可以访问的功能列表。这用于自定义 UI 以适应用户的权限。(例如,根据用户权限自定义可见选项卡)。

4

2 回答 2

0

我不确定这是否有效:

但是您可以尝试LogoutEvent在 global 上触发 a EventBus,在所有Presenters需要“卸载”(TabbedPresenter1等)的地方处理它并调用onUnbind()它们。然后导航回LoginPresenter

或者,您可以让我们自定义TabData(子类TabDataBasic并添加标志hasAccess)。再次触发 a LogoutEvent,当您处理它时,您可以执行以下操作:

TabDataDynamic tabData = (TabDataDynamic)getProxy().getTabData();
tabData.setHasAccess(false);
getProxy().changeTab(tabData);

TabPanel你的实现中,当标志设置为 false 时,你必须确保选项卡是隐藏的。

于 2012-12-03T10:52:57.683 回答
0

我认为您应该看看 GateKeeper,它可以很容易地与演示者一起使用,例如:

@ProxyCodeSplit
@NameToken(NameTokens....)
@UseGatekeeper( Your1GateKeeper.class)
public interface MyProxy extends TabContentProxyPlace<YourPresenter> {
}

您可以向 GateKeeper 注入 Dashboard Presenter 以检查此选项卡是否可用:

@Singleton
public class Your1GateKeeper implements Gatekeeper{

 private DashboardPresenter presenter;

 @Inject
 public ReadOnlyGateKeeper(DashboardPresenter presenter) {
    this.presenter = presenter;
 }

 @Override
 public boolean canReveal() {
    return presenter.isAvailable();
 }

}

因此,使用适当的 GateKeeper 将使您达到所需的安全性。

于 2012-12-07T21:59:38.333 回答