【问题标题】:Server session management in GWTPGWTP 中的服务器会话管理
【发布时间】:2012-06-21 20:48:44
【问题描述】:

我对 GWTP 中的会话管理有几个基本问​​题。

  1. 现在,我们在用户登录到应用程序时创建一个新会话。现在,我可以打开浏览器并使用令牌直接输入应用程序 url 而无需登录。它将向用户呈现 UI 页面而无需任何检查。现在,我们在服务器端进行了会话检查。因此,如果 UI 页面仅在渲染时进行服务器调用,我会知道会话无效,我可以将他重定向到登录页面。但是,我们如何处理 UI 页面没有任何服务器端逻辑并且用户直接粘贴带有该令牌的 URL 的情况。

我是否必须对来自 GWTP 演示者的每个页面请求进行服务器调用才能检查会话是否有效?或者我们还有其他方法吗?

  1. 我没有将任何显式会话 ID 参数从 GWT 客户端传递到服务器。它只有 JSessionId 从浏览器自动传递到服务器。我们只是在服务器中执行 request.getSession() 并查看它是否为空(如果为空则不登录)。所以我希望我们对此没有任何安全问题。请确认。

  2. 由于 GWT 客户端在 Android 上运行,服务器端逻辑使用 Jersey 公开为 Restful Web 服务,我们如何维护会话,因为 Restful WS 是无状态的。现在我们如何在这种情况下实现用户会话?

【问题讨论】:

    标签: session gwt rest


    【解决方案1】:

    没有。您不需要每次都进行服务器调用。当你登录时,在登录的守护者类中只设置一次当前用户。 @UseGatekeeper 注释只检查当前用户实例,不进行任何服务器调用。如果当前用户存在,那么它将从 canReveal 方法返回 true。 并且它将允许访问 url 中的演示者名称令牌。

    假设您不需要任何会话访问,然后使用 @NoGatekeeper 代替它。

    >> let me know if the understanding is fine with your solution. Also, what about point 2 and 3 questions?
    

    A.1 U 可以使用 jsession 没有任何安全问题。 A.2 通过使用 JSESSION id,你可以传递 jsession id 来进行服务器调用,因为如果服务器获得相同的会话,它就可以工作。

    【讨论】:

    • 非常感谢您的宝贵意见。我将实现相同的逻辑。我正在等待任何人的第三个问题输入,稍后将关闭该主题。
    • 我还有一个非常基本的问题。对不起,如果它太傻了......一旦我完成了服务器调用,我将获得 User 对象。但是 GIN 一开始就已经创建了所有对象,而 LoggedInGateKeeper 将使用 null 用户创建。如何用我的服务器返回值注入 CurrentUser 成员?
    • 您只需在登录时为 home presenter.set 登录用户(当前用户 bean 对象)设置 @NoGatekeeper 注释。我想你会为其他演示者提供想法,它将为你提供当前用户。并且在注销后分配当前用户为空。
    • 非常感谢。最后我得到了它的工作。我只是希望有人能评论我的最后一点(宁静的 WS 会议)
    【解决方案2】:

    尽管应始终在服务器端强制实施安全性,但您可能不希望普通用户偷看您的管理页面。在 GWTP 中,您可以通过创建自定义 Gatekeeper 类来防止某些演示者暴露自己。

    @Singleton
    public class LoggedInGatekeeper implements Gatekeeper {  
    
      private final CurrentUser currentUser;
    
      @Inject
      public LoggedInGatekeeper (
          final CurrentUser currentUser ) {
        this.currentUser = currentUser;
      }
    
      @Override
      public boolean canReveal() {
        return currentUser.isLoggedIn();
      }
    }
    

    那么你只需将@UseGatekeeper注解添加到你想要保护的每个presenter的代理中:

      @ProxyCodeSplit
      @NameToken("userSettings")
      @UseGatekeeper( LoggedInGatekeeper.class )
      public interface MyProxy extends ProxyPlace<MainPagePresenter> {}
    

    您必须确保您的自定义 ginjector 具有 getLoggedInGatekeeper() 方法。在您的 ginjector 中,您还可以使用 @DefaultGatekeeper 方法注释 get 方法,该方法返回要用于任何未使用 @UseGatekeeper 注释的代理的 Gatekeeper 类。如果您使用 @DefaultGatekeeper 并希望指定代理不应使用任何网守,则在该代理上使用 @NoGatekeeper 注释。

    您必须确保处理错误的演示者没有使用 Gatekeeper,否则您可能会遇到错误。因此,最好使用@NoGatekeeper 注释此演示者的代理。演示者处理错误是您的自定义 PlaceManager 的 revealErrorPlace 方法所揭示的错误。如果您不覆盖该方法,那么它就是您的 revealDefaultPlace 方法所揭示的方法。

    更多信息请参考GWTP docs

    【讨论】:

    • 我从上面了解到的是,您必须进行服务器调用才能最终知道用户是否已登录,如果我想检查我的应用程序中的所有演示者,然后打开无论用户是否登录,每个页面请求我们都使用 GateKeeper 方法进行服务器调用。让我知道您的解决方案是否可以理解。另外,第 2 点和第 3 点问题呢?
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2011-03-27
    • 2020-04-26
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多