我正在开发一个宁静的Web服务,稍后将由Android应用程序使用。
现在,我正在寻找一种方法来保护对资源的访问:
我找到了几种在网上实现的方法,但我无法弄清楚什么是最合适的方法 例如,我发现Oauth规范对于第三方应用程序来说更方便,而不是我的情况。
那么什么是最适合保护球衣API的方法,如果有人能为我提供任何教程/文件,我会很高兴。
答案 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将被注入资源的上下文中,因此您可以使用
通过此设置,您可以使用@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)