当前位置: 首页 > 面试题库 >

RESTlet的细粒度身份验证

陶成化
2023-03-14
问题内容

我想使用带有细粒度身份验证的RESTlet公开资源。我只能ServerResource通过经过GET身份验证的成员(使用BASIC身份验证)访问。但是,POST无需任何身份验证的呼叫者也可以使用请求使用。

为了明确起见: http:// path / myapp /
user
应该允许任何人使用进行注册POST,但是只有注册的成员才能GET列出所有用户。

不幸的是,我对RESTlet的了解不多,我只找到对Restlets或Routers 使用粗略身份验证的示例。

那么,如何启用资源的可选身份验证并按方法级别检查它们呢?

提前致谢!


问题答案:

要在RESTlet 2.0中进行基本身份验证(自从您提到以来,我假设您正在使用2.0
ServerResource),则需要使用ChallengeAuthenticator。如果配置了,optional = true则只有在您调用时才需要身份验证ChallengeAuthenticator.challenge()

您可以使用authenticate()方法创建应用程序,并在需要访问要保护的资源时调用此方法:

应用:

package example;

import org.restlet.*;
import org.restlet.data.ChallengeScheme;
import org.restlet.routing.Router;
import org.restlet.security.*;

public class ExampleApp extends Application {

    private ChallengeAuthenticator authenticatior;

    private ChallengeAuthenticator createAuthenticator() {
        Context context = getContext();
        boolean optional = true;
        ChallengeScheme challengeScheme = ChallengeScheme.HTTP_BASIC;
        String realm = "Example site";

        // MapVerifier isn't very secure; see docs for alternatives
        MapVerifier verifier = new MapVerifier();
        verifier.getLocalSecrets().put("user", "password".toCharArray());

        ChallengeAuthenticator auth = new ChallengeAuthenticator(context, optional, challengeScheme, realm, verifier) {
            @Override
            protected boolean authenticate(Request request, Response response) {
                if (request.getChallengeResponse() == null) {
                    return false;
                } else {
                    return super.authenticate(request, response);
                }
            }
        };

        return auth;
    }

    @Override
    public Restlet createInboundRoot() {
        this.authenticatior = createAuthenticator();

        Router router = new Router();
        router.attach("/user", UserResource.class);

        authenticatior.setNext(router);
        return authenticatior;
    }

    public boolean authenticate(Request request, Response response) {
        if (!request.getClientInfo().isAuthenticated()) {
            authenticatior.challenge(response, false);
            return false;
        }
        return true;
    }

}

资源:

package example;

import org.restlet.data.MediaType;
import org.restlet.representation.EmptyRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.ServerResource;

public class UserResource extends ServerResource {

    @Override
    public Representation get() {
        ExampleApp app = (ExampleApp) getApplication();
        if (!app.authenticate(getRequest(), getResponse())) {
            // Not authenticated
            return new EmptyRepresentation();
        }

        // Generate list of users
        // ...
    }

    @Override
    public Representation post(Representation entity) {
        // Handle post
        // ...
    }

}


 类似资料:
  • 问题内容: 我正在尝试使用Restlet实现RESTful API,除了基本的角色和方法授权者之外,我发现的东西很少。我已经在数据库中存储了用户可以访问的路由和这些路由的方法。我现在遇到的问题是如何在Authorizer中获取路径。这是我需要收集的资源吗?我应该如何精确路由到授权者?我已经发布了到目前为止我正在查看的内容,如何在授权器中获取路径或资源。感谢您提供任何信息,尽管我浏览了书籍和许多通用

  • 我们使用Spring security LDAP身份验证 提前谢谢

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 问题内容: 我正在尝试在Node.js中使用Socket.IO,并试图允许服务器为每个Socket.IO客户端赋予一个身份。由于套接字代码不在http服务器代码的范围内,因此无法轻松访问已发送的请求信息,因此我假设在连接期间需要将其发送出去。什么是最好的方法 1)将有关谁通过Socket.IO连接到服务器的信息 2)验证他们说的是谁(如果正在使事情变得更容易,我目前正在使用Express) 问题答

  • 我试图使用swift代码在网站上找到这里,但响应是html代码与两个错误:“您必须输入密码!”和“您必须输入用户名!”我是NSURLSession的新手,试图更改用于身份验证的字符串,但无法更改响应。下面是我的代码: 这是控制台响应中的内容:

  • 我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web Tokens进行身份验证。以下是有效且安全的实现吗? < li >将开发一个REST API来接受用户名和密码并进行认证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还会有安全SSL < li >在认证时,将创建两个JWTs访问令牌和刷新令牌。刷新令牌将具有更长的有效期。这两个令牌都将写入coo