Ich versuchte folgende this Tutorial und implementiert die Provider-Klasse wie im Beispiel angegeben.Filtermethode von JAX-RS Provider wird nie
@Provider
@Secured
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {
private static final String REALM = "example";
private static final String AUTHENTICATION_SCHEME = "Bearer";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// Get the Authorization header from the request
String authorizationHeader =
requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
// Validate the Authorization header
if (!isTokenBasedAuthentication(authorizationHeader)) {
abortWithUnauthorized(requestContext);
return;
}
// Extract the token from the Authorization header
String token = authorizationHeader
.substring(AUTHENTICATION_SCHEME.length()).trim();
try {
// Validate the token
validateToken(token);
} catch (Exception e) {
abortWithUnauthorized(requestContext);
}
}
private boolean isTokenBasedAuthentication(String authorizationHeader) {
// Check if the Authorization header is valid
// It must not be null and must be prefixed with "Bearer" plus a whitespace
// The authentication scheme comparison must be case-insensitive
return authorizationHeader != null && authorizationHeader.toLowerCase()
.startsWith(AUTHENTICATION_SCHEME.toLowerCase() + " ");
}
private void abortWithUnauthorized(ContainerRequestContext requestContext) {
// Abort the filter chain with a 401 status code response
// The WWW-Authenticate header is sent along with the response
requestContext.abortWith(
Response.status(Response.Status.UNAUTHORIZED)
.header(HttpHeaders.WWW_AUTHENTICATE,
AUTHENTICATION_SCHEME + " realm=\"" + REALM + "\"")
.build());
}
private void validateToken(String token) throws Exception {
// Check if the token was issued by the server and if it's not expired
// Throw an Exception if the token is invalid
//TODO validate against database
if(!token.equals("exampleString")) {
throw new AuthenticationException("Invalid token.");
}
}
}
Diese Provider-Klasse wird auch vom Server erkannt, die in den Protokollen zu sehen ist:
Dez 25, 2017 6:47:09 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFORMATION: Root resource classes found:
class com.jwt.service.AuthenticationEndpoint
class com.jwt.service.HelloWorldService
Dez 25, 2017 6:47:09 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFORMATION: Provider classes found:
class com.jwt.service.AuthenticationFilter
ich eine Schnittstelle für die Anmerkung erstellt:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Secured {
}
Und auch kommentierte mein REST-Endpunkt
Obwohl meine Provider-Klasse erkannt wird, tut sie immer noch nichts, wenn die annotierte Methode aufgerufen wird. Anstatt den unautorisierten Statuscode auszugeben, wird "Gesicherter getUser wird aufgerufen" zurückgegeben, obwohl keine Authentifizierung gesendet wurde.
Hat jemand eine Idee, warum die Filtermethode meiner Provider-Klasse nie aufgerufen wird?
'com.sun.jersey.api' Paket ist Jersey 1, während das Tutorial, das Sie folgen folgt mit Jersey 2. Upgrade auf Jersey 2 oder finden Sie eine Lösung mit Jersey 1. – Rouliboy
Nach dem Ändern meines Projekts Jersey 2 zu implementieren ist es arbeite jetzt, vielen Dank! :) – Fynn
Großartig! Ich fügte eine Antwort hinzu, um Menschen mit gleichen Problemen zu helfen. – Rouliboy