我们希望实现一个集成在我们的软件(用 java 编写)中的公共 RESTful API,它可能被各种客户端用来构建小型电子商务应用程序(例如,用于 Android 或 iPhone)。此 API 包括获取产品列表、类别、购物车支持等。
我们需要提供一个允许用户注册和其他一些敏感功能的 API。我们应该如何保护这个 API 免受垃圾邮件和暴力破解?在我们使用的标准产品中reCAPTCHA
。REST 对应的任何替代方案?
首先,考虑关注点分离。REST API 的目的是什么?
REST API 应该为客户端提供服务。客户端通过 REST 协议发送请求,并获得其请求的响应。在代码中,这看起来像:
@GET
public Response getClientInfo(@QueryParam("clientId") Integer clientId) {
ClientDTO clientDTO = database.getClientInfo(clientId);
return ResponseWrapper.wrap(clientDTO);
}
现在,您希望您的 REST 方法仅执行此操作而不执行其他操作。否则,您会将块暴力和垃圾邮件逻辑放入您的 REST 方法中,并且您会得到一堆不可扩展、难以版本化等的代码。如果您想更改您的例如黑名单策略,您会必须更改每个 REST 方法,而且它很笨重。如果您想在使用 REST 方法之前检查调用,请查看过滤器。每个请求和响应都通过一系列过滤器,并且可以检查服务器是否被滥用。
我不知道您的技术堆栈是什么,但我建议您研究一下:
例如:
@LoggedInUser
@GET
public Response getClientInfo(...) {
...
}
这个安全注释@LoggedInUser
(顺便说一下,你定义的)会给拦截器签名以检查这个安全约束,例如
@Secures (built in annotation)
@LoggedInUser
public boolean hasRight(Identity identity) {
return identity.isLoggedIn(); //or if he is in certain group of users
}
过滤器示例
@Startup
@ApplicationScoped
@Filter(around= "org.jboss.seam.web.ajax4jsfFilter")
public class IPTrackerFilter extends AbstractFilter {
//IPTracker is your @ApplicationScoped bean that remembers all IP addresses accessing the application.
@Inject
private IPTracker fIPTracker;
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if (!(req instanceof HttpServletRequest)) {
chain.doFilter(req, res);
return;
}
final String ipAddress= ((HttpServletRequest)req).getRemoteAddr();
if (fIPTracker.isBlackListed(ipAddress)) {
//implement error message here
sendErrorMessage(response);
return;
} else {
//all good, continue
chain.doFilter(req, res);
}
}
}
PS。我给了你DeltaSpike的链接,因为其他人真的很容易找到。此外,如果您发现 DeltaSpike 难以理解,请尝试使用JBoss Seam 安全框架。