Ajax和Jersey Web服务的基本身份验证

时间:2012-03-21 14:58:08

标签: jersey jax-rs

我使用@RolesAllowed({“Customer”})保护了一个Web服务。我已经使用Jersey客户端API成功测试了代码和安全配置。现在,我正在尝试使用AJAX从JavaScript访问相同的服务。我在XMLHttpRequest的open方法中设置凭据:

xhr.open("GET", url, true, "bob", "paasss");

这根本不起作用。让我解释一下:

XHR首先发送没有Authorization标头的请求。只有当遇到401响应状态“WWW-Authenticate”标头时,它才会重试请求,这次发送Authorization标头。当使用@RolesAllowed保护服务时,Jersey会发送403状态。因此,永远不会发送授权标头。

我唯一可以让它工作的方法是自己设置授权标题:

xhr.setRequestHeader("Authorization", "Basic Ym9iOnBhc3N3MHJk");

这是可接受的做事方式吗?我可以以某种方式让Jersey返回401而不是403以及“WWW-Authenticate”标题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以通过在web.xml中为所需的URL模式添加auth约束来实现。例如:

<security-constraint>
    <display-name>Constraint1</display-name>
    <web-resource-collection>
        <web-resource-name>all</web-resource-name>
        <description/>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

如果没有用户通过认证,它就不会到达泽西岛 - 容器本身将返回401。

如果这不是您的选择,您可以扩展RolesAllowedFilterFactory以执行额外检查SecurityContext.getPrincipal()是否返回null并在这种情况下生成401,或者只是添加ContainerRequestFilter来执行此操作。