开发者社区 问答 正文

Fuse 7.5中的基本身份验证

我正在使用Redhat Fuse 7.5版本。我已经使用servlet组件实现了REST DSL,如下所示。

restConfiguration()
        .component("servlet")
        .host("0.0.0.0")
        .port("9999")
        .scheme("http")
        .contextPath("/xyz/rest")
        .bindingMode(RestBindingMode.json)
        .skipBindingOnErrorCode(false)
        .enableCORS(true);

rest("/api")
          .get("/checkServiceAvailabilty")
          .outType(MyAppResponse.class)
          .route()
          .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    exchange.getOut().setBody(new MyAppResponse(RESPONSE_CODE_200,RESPONSE_DESC_SUCCESS));
                }
            }).endRest();

我在Blueprint.xml中的servlet配置

<reference id="httpService" interface="org.osgi.service.http.HttpService"/>
  <bean class="org.apache.camel.component.servlet.osgi.OsgiServletRegisterer"
        init-method="register"
        destroy-method="unregister">
    <property name="alias" value="/ftsis/rest"/>
    <property name="httpService" ref="httpService"/>
    <property name="servlet" ref="camelServlet"/>
  </bean>
  <bean id="camelServlet" class="org.apache.camel.component.servlet.CamelHttpTransportServlet"/>

有人可以给我一些在Fuse 7中实现基本身份验证的指示。在Fuse 7中,默认的HTTP服务器是Undertow。

展开
收起
垚tutu 2019-12-04 17:16:05 640 分享 版权
阿里云 AI 助理回答

在Red Hat Fuse 7.5中,使用Undertow作为HTTP服务器时,可以通过添加一个安全过滤器来实现基本身份验证。以下是一个示例步骤,说明如何为你的REST服务配置基本认证:

步骤1: 添加依赖

确保你的项目包含必要的安全相关依赖。如果你使用的是Maven,可以在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jetty9</artifactId>
    <!-- 注意这里的版本号应与Fuse 7.5兼容 -->
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-security</artifactId>
    <!-- 同样注意版本兼容性 -->
</dependency>

尽管你使用的是Undertow,但Camel的Jetty组件提供了更直接的支持来处理安全相关的配置。

步骤2: 配置安全过滤器

你需要创建或修改一个SecurityConfiguration类,用于设置基本认证的用户和密码。这里是一个简单的例子:

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.http.common.HttpOperationFailedException;
import org.apache.camel.model.dataformat.JsonLibrary;
import org.apache.camel.model.rest.RestBindingMode;

public class SecurityConfiguration extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        // REST DSL配置保持不变
        restConfiguration()
            .component("jetty") // 这里改为使用jetty,因为它对安全配置支持更好
            .host("0.0.0.0")
            .port(9999)
            .scheme("http")
            .contextPath("/xyz/rest")
            .bindingMode(RestBindingMode.json)
            .skipBindingOnErrorCode(false)
            .enableCORS(true);

        // 定义安全过滤器
        onException(HttpOperationFailedException.class)
            .handled(true)
            .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(401))
            .setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
            .setBody(constant("Unauthorized"));

        // 实现基本认证逻辑
        jettyHttpEndpointConfigurer().basicAuth("username", "password"); // 替换为实际用户名和密码

        // REST服务定义保持不变
        rest("/api")
            .get("/checkServiceAvailabilty")
            ...
    }
}

请注意,上述代码中的.component("jetty")更改了组件以使用Jetty,因为Jetty提供了更直接的方式来配置安全性。然而,这可能需要你调整其他部分的配置以适应Jetty的行为。

步骤3: 部署并测试

完成上述配置后,重新部署你的应用,并尝试访问受保护的API端点。你应该会被要求提供用户名和密码,只有正确的凭据才能访问服务。

请记住,这个方法是基于Jetty组件的,虽然它在Fuse 7中不是默认的HTTP服务器,但它提供了更灵活的安全配置选项。如果必须使用Undertow且上述方案不适用,你可能需要探索Undertow的原生安全配置方式,这可能涉及到更深入的底层配置或自定义过滤器的开发。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: