2012-03-21 151 views
1

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

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

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

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

只有这样我能得到这个工作组的授权头自己:

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

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

谢谢!

回答

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。