Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保护RESTful web服务的安全_Java_Android_Security_Rest_Jax Rs - Fatal编程技术网

Java 保护RESTful web服务的安全

Java 保护RESTful web服务的安全,java,android,security,rest,jax-rs,Java,Android,Security,Rest,Jax Rs,我正在开发一个restful web服务,稍后将被Android应用程序使用 现在,我正在寻找一种方法来确保对我的资源的访问: 我找到了几种在网上实现的方法,但我不知道哪种方法最合适。 例如,我发现Oauth规范对于第三方应用程序更方便,但我的情况并非如此 那么,保护jersey API的最合适的方法是什么呢?如果有人能为我提供有关这方面的教程/文档,我将非常高兴 我使用的是GlassFishV4服务器和Jersey JAX-RS实现 最简单的方法是使用Java EE内置容器管理的安全模型来

我正在开发一个restful web服务,稍后将被Android应用程序使用

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

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

那么,保护jersey API的最合适的方法是什么呢?如果有人能为我提供有关这方面的教程/文档,我将非常高兴


  • 我使用的是GlassFishV4服务器和Jersey JAX-RS实现

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

我认为最好的方法是使用本文中描述的OAuth2。根据您使用的客户端类型(桌面、网页、移动客户端),除了为应用程序的特定范围(只读或完全访问)创建令牌等诸多好处外,还有不同的工作流。谷歌提供了许多不同的API,可以被同一个帐户访问。如果应用程序只需要来自日历api的数据,那么请求的令牌只允许您访问此特殊api,而不允许您访问帐户的全部资源(如邮件数据、注释等)。另一点是,安全处理与客户端分离,客户端应用程序中不必存储密码。 您可以自己实现所有功能,也可以使用类似的开源项目。它描述了它是如何工作的,代码非常好,但是它对spring框架有很多依赖性。对于我的用例,我已经开始用普通的JavaEE7代码替换它们,并基于这个开源项目的思想创建一个解决方案。替换背后的原因是它更加经得起未来的考验,并且在部署过程中避免了类装入器问题


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

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

一些示例代码:

你需要一个过滤器

public class AuthFilter implements ResourceFilter, ContainerRequestFilter {
  ...
}
以及安全上下文:

public class MySecurityContext implements SecurityContext {
  ...
}
和一个用户类:

public class User implements Serializable, Principal {
  ...
}
最后,您可以添加所需的过滤器,如下所示:(将ResourceConfig对象传递到此函数)

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

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

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

通常,您的应用程序需要某种形式的身份验证,可能是通过直接或使用oauth对用户进行身份验证。您的身份验证也可以是api密钥。您只需要找到一种方法将密钥传输到适合您的用例的应用程序。这是一个很好的问题,我之前问过同样的问题,但还没有得到适当的答案……您是在寻找基于用户的身份验证还是所有安卓客户端都会共享的共享令牌?身份验证是否适用于所有端点(资源/URL)?参考这个
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
          }));
}