【发布时间】:2016-02-12 11:20:27
【问题描述】:
我已经使用 Jersey 实现了 REST 服务。为了提供更高的安全性,我在 REST 方法中添加了球衣安全注释(@PermitAll、@DenyAll)。
以下是我的示例 REST 服务:
@GET
@Path("/getall")
@Produces(MediaType.APPLICATION_JSON)
@PermitAll
public String getChartSupportedData(@QueryParam("items") int result) {
// my code goes here
}
但问题是之前我使用javax.servlet.Filter过滤器来验证URI。
web.xml:
<filter>
<filter-name>ApplicationFilter</filter-name>
<filter-class>web.filter.ApplicationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ApplicationFilter</filter-name>
<url-pattern>/rest/api/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
根据访问某些 REST 服务,HttpServletRequest 应该包含一个有效的令牌(由应用程序生成)。
某些 REST 端点不需要令牌即可访问服务。在这种情况下,我必须在过滤器实现中绕过它:
private static String[] bypassPaths = { "/data/getall" };
所以我的要求是这样的。
如果我们将某个 REST 端点声明为 @PermitAll,则该路径不应在过滤器中声明为旁路路径,这样任何人都可以在没有有效令牌的情况下访问它。
但问题是过滤器总是在请求进入服务器时进行过滤,如果它不在旁路数组中,即使我声明为@PermitAll,请求也不会继续。
我想知道是否可以在同一个 Web 应用程序中结合这两个安全选项。
【问题讨论】:
-
您是否考虑过使用 JAX-RS 作为名称绑定过滤器而不是 Servlet 过滤器?
-
不,我不会看的。