Restlet 2.0.8:单个restlet应用程序实例的多种身份验证方法(BASIC、DIGEST)?

Posted

技术标签:

【中文标题】Restlet 2.0.8:单个restlet应用程序实例的多种身份验证方法(BASIC、DIGEST)?【英文标题】:Restlet 2.0.8: Multiple authentication methods (BASIC, DIGEST) for single restlet Application instance? 【发布时间】:2011-07-28 07:13:32 【问题描述】:

我们使用的是 Restlet 2.0.8 并且有一个应用程序实例覆盖了 org.restlet.Application#createInboundRoot()。在那里,我们创建了 Router 实例并(目前)返回一个 DigestAuthenticator,如下面的代码所示:

@Override
public synchronized Restlet createInboundRoot() 
    log.info("App::createInboundRoot called");

    this.authenticator = getAuthenticator();

    Router router = new Router(getContext());
    router.attach("/echo", EchoResource.class);
    router.attach("/status", StatusResource.class);

    authenticator.setNext(router);
    return authenticator;


private ChallengeAuthenticator getAuthenticator() 
    DigestAuthenticator auth = new DigestAuthenticator(getContext(), "Guard", "s3cret");
    auth.setWrappedVerifier(new SimpleVerifier("user","pass");
    auth.setOptional(false);
    return auth;

我想要实现的是:

让 EchoResource 使用摘要身份验证,而 StatusResource 应该使用 HTTP 基本身份验证

Restlets 可以做到这一点吗?

最好, 克里斯

【问题讨论】:

【参考方案1】:

这可以通过链接 DigestAuthenticator(可选:true)和 BasicAuthenticator(可选:false)来实现。伪代码:

   digestAuth.setNext(basicAuth);
   basicAuth.setNext(router);

【讨论】:

如果我错了,请纠正我,但这意味着 /echo 和 /status 至少都受到基本身份验证的保护,对吧? 我们想要的是让 Echo 仅受 Digest 保护,而 Status 受基本身份验证保护。我们所做的是引入一个“分叉”路由器,并将摘要和 basicAuth 路由器附加到不同的路径,如下所示(伪代码): forkingRouter.attach("/status", basicAuth, Template.MODE_STARTS_WITH); forkingRouter.attach("/echo", digestAuth, Template.MODE_STARTS_WITH);【参考方案2】:

在类似的情况下,我们创建了两个 org.restlet.Application 对象,需要对一个应用程序进行身份验证,如上述问题,并且确实将两个应用程序附加到 Servlet 容器中的不同路径。

【讨论】:

以上是关于Restlet 2.0.8:单个restlet应用程序实例的多种身份验证方法(BASIC、DIGEST)?的主要内容,如果未能解决你的问题,请参考以下文章

Restlet 简介

GWT 中的 RESTLET -RPC CALL

我如何在RESTlet中加载和编辑客户资料?

通过 OAuth 访问 NetSuite RESTlet

在 OSGi 中配置 Restlet 以使用 Jetty 连接器(非简单连接器)

restlet 2.3.5 org.restlet包导入eclipse出现的com.sun.net.httpserver类包找不到问题