Tôi gặp sự cố khi đặt tiêu đề Cấp quyền HTTP cho yêu cầu dịch vụ web bằng Apache CXF. Tôi đã thiết lập khách hàng của tôi qua mùa xuân:Xác thực cơ sở HTTP thông qua trình chặn đánh chặn CXF không hoạt động
<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<bean id="myHTTPAuthInterceptor" class="my.app.MyHTTPAuthInterceptor" autowire="constructor" />
<bean id="webServiceFactory" class="my.app.WebServiceFactory">
<property name="wsdlLocation" value="classpath:/my/app/webservice.wsdl" />
<property name="serviceURL">
<jee:jndi-lookup jndi-name="webservice/url" />
</property>
<property name="inInterceptors">
<list>
<ref bean="loggingInInterceptor" />
</list>
</property>
<property name="outInterceptors">
<list>
<ref bean="loggingOutInterceptor" />
<ref bean="myHTTPAuthInterceptor" />
</list>
</property>
</bean>
<bean id="myWebService" factory-bean="webServiceFactory" factory-method="getInstance" />
Headers được thiết lập thông qua MyHTTPAuthInterceptor như thế này:
public MyHTTPAuthInterceptor(ConfigDao configDao)
{
super(Phase.POST_PROTOCOL);
this.configDao = configDao;
}
@Override
public void handleMessage(Message message) throws Fault
{
Map<String, List<?>> headers = (Map<String, List<?>>) message.get(Message.PROTOCOL_HEADERS);
String authString = configDao.getUsername() + ":" + config.getPassword();
headers.put("Authorization", Collections.singletonList("Basic " + new String(Base64.encodeBase64(authString.getBytes()))));
}
Với tên người dùng và cả các thiết lập để 'thử', mọi thứ có vẻ là OK trong các bản ghi:
Headers: {SOAPAction=[""], Accept=[*/*], Authorization=[Basic dGVzdDp0ZXN0]}
Tuy nhiên, máy chủ trả lại HTTP 401: Không được ủy quyền.
Không biết chuyện gì xảy ra, tôi đã tiếp cận toàn bộ cách khác bằng cách thay đổi mã nhà máy dịch vụ web của khách hàng. Tôi đã thêm một chính sách cho phép cơ bản để ống dẫn của khách hàng như thế này:
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName("test");
authorizationPolicy.setPassword("test");
authorizationPolicy.setAuthorizationType("Basic");
httpConduit.setAuthorization(authorizationPolicy);
Tested thiết lập của tôi một lần nữa, cùng log (thứ tự khác nhau mặc dù):
Headers: {SOAPAction=[""], Authorization=[Basic dGVzdDp0ZXN0], Accept=[*/*]}
Bây giờ phản ứng của máy chủ là 200 OK!
Sự cố được giải quyết mà bạn có thể nghĩ, nhưng cách tiếp cận thứ hai không thực sự hiệu quả đối với tôi. Ứng dụng của tôi là môi trường nhiều người thuê, tất cả đều có tên người dùng và mật khẩu khác nhau. Với cách tiếp cận thứ hai tôi không thể tái sử dụng khách hàng của mình.
Làm cách nào để trình chặn đánh chặn hoạt động chính xác? Tôi đang cắm vào giai đoạn sai? Thứ tự của các tiêu đề có quan trọng không? Nếu vậy, làm thế nào để thay đổi nó?
Thử nó, nhưng than ôi, không may mắn ... – verhage
Ok, tôi phải sửa bản thân mình ở đây. Mắc lỗi. Nó hoạt động! Cảm ơn bạn rất nhiều, câu trả lời của bạn được chấp nhận :) – verhage