【问题标题】:auth-constraint - role-name - user - ignoredauth-constraint - 角色名 - 用户 - 忽略
【发布时间】:2015-05-15 15:38:50
【问题描述】:

我正在尝试了解 JAX-WS 中的身份验证,因此我制作了一个带有 JAX-WS 网络服务的小型 Netbeans8.0.2/Glassfish4.1 Web 应用程序,并且我试图使其不公开,但可供授权仅限用户。

此网络服务的 web.xml 文件包含:

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Fib Web Service</web-resource-name>
            <url-pattern>/FibServiceWithAuth/*</url-pattern>
            <http-method>*</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>user</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>file</realm-name>
    </login-config>

但是,当我制作另一个使用此服务的简单网络应用程序时, 它无需任何身份验证即可工作,请参见此处:

http://kempelen.ii.fmph.uniba.sk:8080/FibApp/

我知道我应该从处理这个 JSF 页面的 JSF 托管 bean 连接到服务,如下所示:

package fibapp;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.WebServiceRef;

@ManagedBean
@RequestScoped
public class FibBean 
{
    public FibBean() { }

    int n;
    String result;

    public int getN() { return n; }
    public void setN(int newN) { n = newN; }

    public String getResult() { return result; }
    public void setResult(String newResult) { result = newResult; }

    @WebServiceRef(wsdlLocation = "http://kempelen.ii.fmph.uniba.sk:8080/FibServiceWithAuth/FibWithAuth?wsdl")
    private FibWithAuth_Service fibService;

    public void compute() 
    {
        FibWithAuth fib = fibService.getFibWithAuthPort();
    //    ((BindingProvider) fib).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "someuser");
    //    ((BindingProvider) fib).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "somepass");
        result = fib.fib(n).toString();
    }
}

但即使这些用户/密码行被注释掉,bean 仍然从 web 服务中获取结果。

请问缺少什么?

【问题讨论】:

    标签: web-services jsf glassfish jax-ws java-ee-7


    【解决方案1】:

    查看您的WSDL(在您的托管bean 的@WebServiceRef 中指定),服务的端点是

    <soap:address 
    location="http://kempelen.ii.fmph.uniba.sk:8080/FibServiceWithAuth/FibWithAuth"/>
    

    这意味着您的网络服务资源是/FibWithAuth

    但是,您的 web.xml &lt;security-constraint&gt; 网址是

    <url-pattern>/FibServiceWithAuth/*</url-pattern> 
    

    我想你想把它改成

    <url-pattern>/FibWithAuth/*</url-pattern>
    

    如果您确实想将安全约束添加到整个 FibServiceWithAuth Web 应用程序,那么您的 &lt;security-constraint&gt; url 模式将是 /*

    最后,我想你也想改变

    <http-method>*</http-method>
    

    <http-method>POST</http-method>
    

    以便您的托管 bean 无需身份验证即可通过 GET 请求(根据您的 @WebServiceRef 注释)访问 WSDL。

    【讨论】:

    • 太好了,非常感谢!现在随着注释掉的行,我得到“com.sun.xml.ws.client.ClientTransportException:服务器发送 HTTP 状态代码 401:未授权”。但是当添加这些行时,我得到“com.sun.xml.ws.client.ClientTransportException:服务器发送 HTTP 状态代码 403:禁止” - 这是否意味着我的用户/密码不正确?我尝试使用命令行“asadmin create-file-user”添加用户。再次尝试添加同一用户时,它报告“将用户 2ain131 添加到文件领域文件失败。用户 2ain131 已存在。”还缺少什么吗?
    • 更新您的帖子并包含完整的堆栈跟踪。不清楚的是 WSDL 检索是获取 403 还是实际的服务调用。您是否遵循仅安全 HTTP POST 的最后建议?
    • 是的,我将 * 更新为 POST 并遵循您的所有建议,这让我向前迈进了一步,但现在仍然坚持这个禁忌。打开链接可以看到堆栈跟踪,输入数字并点击按钮:kempelen.ii.fmph.uniba.sk:8080/FibApp
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2018-11-04
    • 2017-02-10
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多