Защита с помощью аннотаций ролей не работает (Джерси)

Я новичок здесь, хотя я уже нашел здесь много ответов на свои проблемы.

Теперь я ищу помощь в этом: у меня есть этот небольшой пример ресурса в моем маленьком REST API:

@Path("/greeting")
@PermitAll
public class HelloResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("all")
    public String sayHelloToAll() {
        return "Hello, everybody!";
    }

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed("admin")
    @Path("admin")
    public String sayHelloToAdmin() {
        return "Hello, admin!";
    }
}

Для фильтрации ролей у меня есть реализация SecurityContext:

public class Authorizer implements SecurityContext {

    @Override
    public String getAuthenticationScheme() {
        return null;
    }

    @Override
    public Principal getUserPrincipal() {
        return null;
    }

    @Override
    public boolean isSecure() {
        return false;
    }

    @Override
    public boolean isUserInRole(String role) {
        return true;
    }
}

И эта реализация ContainerRequestFilter:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthorizationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        requestContext.setSecurityContext(new Authorizer());
    }
}

Это мой класс приложения:

@ApplicationPath("/")
public class Application extends ResourceConfig {

    public Application() {
        super(HelloResource.class);
        register(AuthorizationFilter.class);
        register(RolesAllowedDynamicFeature.class);        
    }
}

При этом, когда я запрашиваю URI приветствие/все, все ок, строка "Привет, всем!" Показано. Но когда я запрашиваю приветствие/администрирование URI, которое должно вызываться, когда его запрашивает пользователь в роли администратора, никогда не вызывается, даже если мой метод isUserInRole всегда возвращает true. На самом деле мой метод filter вызывается всегда, а мой метод isUserInRole никогда не вызывается.

Я следовал многим советам:

SecurityContext не работает с @RolesAllowed

Авторизация с помощью RolesAllowedDynamicFeature и Jersey

Как получить доступ к ресурсу Джерси, защищенному @RolesAllowed

Рекомендации по аутентификации на основе токенов REST с JAX-RS и Джерси

Но это, кажется, не работает ни с чем.

Кто-нибудь может мне помочь, пожалуйста! Я не знаю, есть ли что-то, чего мне не хватает

Спасибо всем заранее.

РЕДАКТИРОВАТЬ: Когда я запрашиваю приветствие URI/admin, я, кстати, получаю 403 Forbiden (забыл сказать это)


person Jhonathan Abreu    schedule 28.12.2015    source источник


Ответы (1)


Взгляните на исходный код для RoleAllowedRequestFilter. Когда пользователь аутентифицируется, ожидается, что будет связан Principal. Фильтр проверяет это здесь

if (rolesAllowed.length > 0 && !isAuthenticated(requestContext)) {
    throw new ForbiddenException(LocalizationMessages.USER_NOT_AUTHORIZED());
}
...
private static boolean isAuthenticated(final ContainerRequestContext requestContext) {
    return requestContext.getSecurityContext().getUserPrincipal() != null;
}

Итак, вам нужно вернуть Principal в getUserPrincipal из SecurityContext

@Override
public Principal getUserPrincipal() {
    return new Principal() {
        @Override
        public String getName() {
            return "Some Name";
        }
    };
}
person Paul Samsotha    schedule 28.12.2015
comment
Большое спасибо. я не думал об этом - person Jhonathan Abreu; 28.12.2015