【问题标题】:GWT-RPC or RequestFactory for Authentication?用于身份验证的 GWT-RPC 或 RequestFactory?
【发布时间】:2013-12-02 18:28:30
【问题描述】:

我正在尝试为我的 GWT 应用程序构建登录屏幕。单击登录按钮时,需要将凭据(用户名和密码)发送到服务器进行身份验证。我想知道哪种服务器通信方法最适合:GWT-RPC 或 RequestFactory。

我的理解是 RequestFactory 比 GWT-RPC 更高效且被推荐,但它更像是一个数据/实体/持久性框架,而不是像 RPC 这样的请求-响应框架。因此,尽管许多 GWT 爱好者建议使用 RequestFactory 而不是 GWT-RPC,但我认为 RequestFactory 不能用于这种情况。毕竟,我不想对登录请求进行 CRUD,我想将凭据发送到服务器,执行安全身份验证,并向客户端返回响应。

  1. 我说的对吗? GWT-RPC 是我唯一的选择吗?或
  2. 可以使用 RequestFactory。如果是,如何(需要查看客户端和服务器代码的代码示例)?

【问题讨论】:

    标签: java authentication gwt gwt-rpc requestfactory


    【解决方案1】:

    您可以使用其中任何一种,尽管 RF 非常适用于 EntityProxy,但它也被认为适用于 ValueProxy,这意味着传输任何类型。 RF 还有助于执行传递代理类型或原始类型的远程过程。

    也就是说,我会使用我的应用程序中主要使用的技术。如果您使用 RPC,请在 RPC 请求中发送您的登录名/密码,但如果您使用的是 RF,请使用它,以免混合使用,尽管您可以毫无问题地混合使用 RF、RPC 和普通 Ajax。

    你需要注意的是,通常情况下,在需要认证的应用程序中,你必须使用过滤器来检查用户在请求 RPC 或 RF 时是否有有效的会话,所以在发送登录请求的情况下,你必须以某种方式跳过 auth 过滤器。

    与安全有关,两种场景都是一样的,你必须在启用https的环境中做请求。

    [编辑]

    这可能是客户端的接口和远程登录的 RF 调用实现,正如您所看到的那样非常简单,您可以在这些类中添加您需要的任何方法:

    @Service(value = LoginUserService.class)
    public interface LoginUserRequest extends RequestContext {
      Request<Boolean> login(String username, String password);
    }
    
    public class LoginUserService {
       // Using static you dont need to provide a Locator for the service
       static Boolean login(String username, String password) {
          return true;
       }
    }
    

    与RF的auth过滤器相关的,你可以看看这个:GWT RequestFactory authentication functions

    【讨论】:

    • 感谢@Manolo (+1) 的精彩回答 - 两个后续问题:(1) 我更喜欢使用 RF,但我发现的所有代码示例都使用 EntityProxy 并演示了如何持久化数据(这不是我想做的)。 那么您能否提供一个使用 RF 进行超级简单身份验证的客户端和服务器端代码的代码示例? 那,或者指向我的代码示例?并且 (2) 我不可能是世界上唯一一个在 GWT 中处理过身份验证的人......
    • 如果您所说的(关于绕过身份验证过滤器)是真的,必须有一个标准的方法来做到这一点。您可以指出任何想法/代码示例吗? 再次感谢!
    • 通过“超级简单的身份验证”,让我们假设服务器代码只是这样做:if(username.equals("randy") &amp;&amp; password.equals("12345")) return true; else false; 如果我能看到“身份验证”在服务器射频代码中的位置,然后看看如何客户端射频代码调用它,我应该很高兴!
    • 发布了一个使用RF登录的实现
    【解决方案2】:

    使用这两种技术,您都可以将此类信息发送到服务器端,但正如您已经指出的那样,RequestFactory 专用于实体管理。在您的情况下最好使用 GWT-RPC,因为为了仅发送凭证服务器端并最终检索身份验证结果,您不需要 RequestFactory 剩余(增量传输,实体管理)。

    【讨论】:

    • 感谢@Fedy2 (+1) - 快速跟进:您提到 GWT-RPC 是一种“单向数据传输”,这让我有点担心。我仍然需要 2 路传输:1 用于请求(提交用户名/密码)和 1 用于响应(通过/失败)。 GWT-RPC 仍然是我的最佳选择,还是您会推荐其他方法用于身份验证?例如,我听说过 RequestBuilder、JSON/HTTP、JSONP 等……再次感谢!
    • 对不起,句子有歧义,修正了。
    • 再次感谢@Fedy2(再次+1)-但我仍然不完全理解。我需要向服务器发出同步请求,向它发送用户名和密码,并且我需要服务器发送响应(通过或失败)。我可以将 GWT-RPC 用于这种同步的 2 向通信,还是 GWT-RPC 仅在 1 个方向上进行,从客户端到服务器?很抱歉在这里很烦人,只是想准确地理解你在说什么。再次感谢迄今为止的所有帮助!
    • 再次更正了主要响应。 GWT-RPC 是双向的,所以是的,您可以将凭据发送到服务器端并取回身份验证结果。
    • @Fedy2,RF 专门用于实体管理的东西并不完全正确,它适用于实体,但实际上它涵盖了 ajax 应用程序中的所有用例:服务、实体和非实体数据对象.
    【解决方案3】:

    对于身份验证,我(几乎)总是使用 RequestBuilder,即简单的 HTTP(S!) POST。为什么?因为这样你可以实现一个通用的身份验证机制,它不仅可以被 GWT 应用程序使用。您可以灵活地添加简单的 HTML 登录页面、单点登录、标准服务器端机制(例如 Spring 安全性)等。

    一个简单的 GWT 重新登录对话框对于 RequestBuilder 也没有问题 - 只提交用户名/密码,GWT-RPC 或 RF 根本没有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-20
      • 2014-06-10
      • 1970-01-01
      • 2012-10-18
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多