Я хочу выставить ресурс с помощью RESTlet с мелкомодульной аутентификацией. Мой ServerResource
должно быть доступным через GET
только для аутентифицируемых участников (использующий Стандартную аутентификацию). Однако использование запросов POST
должно быть доступно также вызывающим сторонам без любой аутентификации.
Чтобы к clearify: http://path/myapp/user должен позволить любому регистрировать использование POST
, но только зарегистрированные члены должны смочь GET
список всех пользователей.
Я, к сожалению, не очень в RESTlet, и я только нахожу примеры с помощью более грубой аутентификации для целого Restlet
s или Router
s.
Таким образом, как я включаю дополнительную аутентификацию для ресурсов и проверяю их на уровне на метод?
Заранее спасибо!
Для выполнения базовой аутентификации в 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
// ...
}
}