【问题标题】:Basic authentication for Ajax and Jersey web serviceAjax 和 Jersey Web 服务的基本身份验证
【发布时间】:2012-03-21 14:58:07
【问题描述】:

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

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

这根本行不通。让我解释一下:

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

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

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

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

谢谢!

【问题讨论】:

    标签: jersey jax-rs


    【解决方案1】:

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

    <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>
    

    这样,如果没有用户通过身份验证,它甚至不会到达 Jersey - 容器本身将返回 401。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多