我使用CXF组件用apachecamel创建了一个Web服务,如下所示:
blueprint.xml:
<bean class="ngtrend.ws.Testws"/>
<!-- Defined the server endpoint to create the cxf-rs consumer -->
<cxf:rsServer id="rsServer" address="http://localhost:9050/route"
serviceClass="ngtrend.ws.Testws" />
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route id="timerToLog">
<from uri="cxfrs://bean://rsServer"/>
<to uri="bean:ngtrend.ws.HelloBean?method=test(Exchange)"/>
<log message="${body}"/>
</route>
</camelContext>
Testws.java:
public class Testws {
@GET
@Path("/test/{id}")
@Produces("application/xml")
//@Consumes("text/xml")
public Integer getAssets(@PathParam("id") int id){
return null;
}
}
我想确保它的安全,迫使客户发送(如果使用浏览器,则在对话框中输入)登录名和密码(BASIC Http身份验证)。如何进行此配置?
在CXF框架中,restful服务身份验证可以通过以下方法完成:
<cxf:rsServer id="rsServer"
address="http://localhost:9050/route">
<jaxrs:serviceBeans>
<ref bean="serviceBean"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="authenticationHandler"/>
</jaxrs:providers>
</cxf:server>
<bean id="serviceBean" class="ngtrend.ws.Testws"/>
<bean id="authenticationHandler" class="yourpackage.Class" />
为authenticationHandler创建您自己的处理程序,该处理程序将实现导入org.apache.cxf.jaxrs.ext.RequestHandler
。使用此类中所需的身份验证策略,例如根据数据库等进行身份验证。这应该允许基本的身份验证。
您可以编写一个实现ContainerRequestFilter的类。然后在cxf:providers中设置如下:
<bean id="authenticationHandler" class="a class which implements ContainerRequestFilter" />
<cxf:rsServer id="xxxRsServer"
address="/xxxservice" serviceClass="xxx.XXXService"
loggingFeatureEnabled="true" loggingSizeLimit="20">
<cxf:providers>
<ref component-id="authenticationHandler"/>
</cxf:providers>
</cxf:rsServer>
通过这种方式,您可以覆盖以下方法
public void filter(ContainerRequestContext requestContext)
例如,您可以基于requestContext.getHeaderString("UserPassInfo")进行简单的身份验证。如果成功,则不执行任何操作,否则调用requestContext.abortWith(Response.status(401).header("WWW-Authenticate","Basic").build());