我使用@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”标题吗?
谢谢!
答案 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来执行此操作。