【问题标题】:Securing a jersey RESTful web service保护 jersey RESTful Web 服务
【发布时间】:2014-09-13 21:05:41
【问题描述】:

我正在开发一个安静的网络服务,稍后将被 Android 应用程序使用。

现在,我正在寻找一种方法来保护对我的资源的访问:

我在网上找到了几种实现方法,但我不知道哪种方法最合适。
例如,我发现 Oauth 规范对第三方应用程序更方便,而我的情况并非如此。

那么保护球衣 API 的最合适的方法是什么,如果有人可以为我提供任何有关这方面的教程/文档,我会很高兴。


  • 我正在使用 Glassfish v4 服务器和 Jersey JAX-RS 实现。

【问题讨论】:

  • 通常您的应用需要某种形式的身份验证,可能通过直接对您的用户进行身份验证或使用 oauth。您的身份验证也可以是 api 密钥。您只需要找到一种方法将密钥传输到适合您用例的应用程序。
  • 这是一个很好的问题,我前段时间也问过同样的问题,但还没有合适的答案......
  • 您是在寻找基于用户的身份验证还是所有 android 客户端都将共享的共享令牌?身份验证是否适用于所有端点(资源/url)?引用此stackoverflow.com/questions/785973/…

标签: java android security rest jax-rs


【解决方案1】:

查看不同的选项后,我使用了身份验证过滤器和基本身份验证。很容易实现。

一些示例代码:

你需要一个过滤器

public class AuthFilter implements ResourceFilter, ContainerRequestFilter {
  ...
}

还有一个安全上下文:

public class MySecurityContext implements SecurityContext {
  ...
}

还有一个用户类:

public class User implements Serializable, Principal {
  ...
}

最后,你可以像这样添加你需要的过滤器:(将你的 ResourceConfig 对象传递给这个函数)

private void prepareFilters(ResourceConfig rc) {
  rc.getProperties().put("com.sun.jersey.spi.container.ContainerRequestFilters",
          getClassListing(new Class[]{
            AuthFilter.class
          }));

  rc.getProperties().put("com.sun.jersey.spi.container.ContainerResponseFilters",
          getClassListing(new Class[]{
            CORSFilter.class, //You might not need this
            GZIPContentEncodingFilter.class //You might not need this
          }));

  rc.getProperties().put("com.sun.jersey.spi.container.ResourceFilters",
          getClassListing(new Class[]{
            RolesAllowedResourceFilterFactory.class
          }));
}

顺便说一句,您可以将@Context SecurityContext securityContext; 添加到您的资源类或单个方法中,以实现更细粒度的访问控制。 SecurityContext 将被注入到您的资源的上下文中,因此您可以使用

访问每个请求的 User 对象

通过此设置,您可以使用 @PermitAll、@RolesAllowed 等注释您的 REST 方法,这样您可以很好地控制您的 RESTful 界面。

我刚刚使用 Jersey 完成了我的无状态(无会话)用户身份验证和管理。 如果您想要一个完整的示例,或者您想自己尝试一下,请告诉我;)

【讨论】:

    【解决方案2】:

    最简单的方法是使用 Java EE 内置容器托管安全模型来保护您的其余资源,如 tutorial 中所述。它允许您根据自己存储在数据库或文件领域in the web.xml or the the classes 中的用户和角色来配置安全性。 缺点是您必须启动一个会话,提取 JSESSIONID 并将其发送到您的每个请求中,以便服务器可以验证它,但这会使您的服务更加“有状态”并且违反了其余架构的无状态性。 另一种方法是通过使用 WebFilters 来实现自定义安全性,例如在每个请求中发送用户名和密码,并根据特殊数据库中的信息验证它们。如果信息与数据库中存储的信息不匹配,则可以在 Response 对象中返回重定向或特殊错误代码。

    我认为最好的方法是使用 specification 中描述的 OAuth2。取决于您使用的客户端类型(桌面、网页、移动客户端),有不同的工作流程,除了为您的应用程序的特殊范围创建令牌(只读或完全访问,...)等许多好处之外. Google 提供了许多不同的 API,可以由同一个帐户访问。如果应用程序只需要来自日历 api 的数据,则请求的令牌只会让您访问这个特殊的 api,而不是访问帐户的整个资源(如邮件数据、便笺等)。另一点是安全处理与客户端分离,并且客户端应用程序中不必存储密码。 你可以自己实现所有东西,也可以使用像this 这样的开源项目。它提供了关于它是如何工作的描述,并且代码非常好,但是它对 Spring 框架有很多依赖。对于我的用例,我已经开始用 vanilla Java EE 7 代码替换它们,并根据这个开源项目的想法创建了一个解决方案。替换的原因是它更具前瞻性,并且在部署期间避免了类加载器问题。

    在 Android 应用中,可以实现 Authenticator 以安全存储令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2012-09-10
      • 2017-01-19
      • 1970-01-01
      • 2017-05-24
      • 2013-12-29
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多