保护平针织RESTful Web服务

时间:2014-07-22 20:53:03

标签: java android security rest jax-rs

我正在开发一个宁静的Web服务,稍后将由Android应用程序使用。

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

我找到了几种在网上实现的方法,但我无法弄清楚什么是最合适的方法 例如,我发现Oauth规范对于第三方应用程序来说更方便,而不是我的情况。

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


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

3 个答案:

答案 0 :(得分: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接口的良好控制。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

查看我的问题的已接受答案(问题开始令人困惑)。答案远比问题清楚得多: Securing REST Web Service using token (Java)