Мелкомодульная аутентификация с RESTlet

Я хочу выставить ресурс с помощью RESTlet с мелкомодульной аутентификацией. Мой ServerResource должно быть доступным через GET только для аутентифицируемых участников (использующий Стандартную аутентификацию). Однако использование запросов POST должно быть доступно также вызывающим сторонам без любой аутентификации.

Чтобы к clearify: http://path/myapp/user должен позволить любому регистрировать использование POST, но только зарегистрированные члены должны смочь GET список всех пользователей.

Я, к сожалению, не очень в RESTlet, и я только нахожу примеры с помощью более грубой аутентификации для целого Restlets или Routers.

Таким образом, как я включаю дополнительную аутентификацию для ресурсов и проверяю их на уровне на метод?

Заранее спасибо!

7
задан b_erb 7 February 2010 в 16:50
поделиться

1 ответ

Для выполнения базовой аутентификации в 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
        // ...
    }

}
16
ответ дан 6 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: