Um die grundlegende Authentifizierung in RESTlet 2.0 zu tun (ich nehme an, Sie verwenden 2.0, da Sie ServerResource
erwähnen), müssen Sie eine ChallengeAuthenticator
verwenden. Wenn dies mit optional = true
konfiguriert ist, wird die Authentifizierung nur angefordert, wenn Sie ChallengeAuthenticator.challenge()
aufrufen.
Sie können Ihre Anwendung mit einer authenticate()
Methode erstellen, und das nennen, wenn Sie Zugriff auf eine Ressource müssen gesichert werden:
Anwendung:
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;
}
}
Ressource:
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
// ...
}
}
Zunächst einmal vielen Dank für Ihre Antwort, das sieht vielversprechend aus. Ich habe jedoch einige Probleme damit, dass Ihr Code funktioniert. Zum Beispiel gibt es keine 'getSubject()' Methode für ClientInfo (ich benutze 2.0m7). Außerdem bin ich nicht sicher, ob Ihre 'authenticate()' Methode korrekt ist? –
Ich benutzte einen früheren Schnappschuss; Ich habe die Beispiele aktualisiert, um mit 2.0m7 zu arbeiten. – Sam
Danke, jetzt, der Code kompiliert und POST ist immer verfügbar. Leider ist GET nie. Egal, ob ich keine, falsche oder korrekte BASIC Credentials erhalte, ich bekomme immer eine 401. –