我正在尝试了解JAX-WS中的身份验证,因此我使用JAX-WS Web服务创建了一个小型Netbeans8.0.2 / Glassfish4.1 Web应用程序,我试图使其不公开,但可以授权仅限用户。
此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仍然会从webservice获得结果。
什么遗漏,拜托?
答案 0 :(得分:1)
在查看您的WSDL(在托管bean @WebServiceRef
中指定)时,服务的端点是
<soap:address
location="http://kempelen.ii.fmph.uniba.sk:8080/FibServiceWithAuth/FibWithAuth"/>
表示您的网络服务资源为/FibWithAuth
。
但是,您的web.xml <security-constraint>
网址是
<url-pattern>/FibServiceWithAuth/*</url-pattern>
我想你想把它改成
<url-pattern>/FibWithAuth/*</url-pattern>
如果您确实要将安全约束添加到整个FibServiceWithAuth
网络应用程序,那么您的<security-constraint>
网址格式将为/*
。
最后,我想你也想改变
<http-method>*</http-method>
到
<http-method>POST</http-method>
这样您的托管bean可以通过GET
请求(根据您的@WebServiceRef
注释)访问WSDL而无需身份验证。