Защитата с анотации за роли не работи (Джърси)

Нов съм тук, въпреки че съм намирал много отговори на проблемите си тук преди.

Сега търся помощ за това: имам този малък примерен ресурс за моя малък 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. Всъщност моят метод на филтър винаги се извиква, но моят метод isUserInRole никога не се извиква.

Следвах много съвети:

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

Упълномощаване с RolesAllowedDynamicFeature и Jersey

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

Най-добра практика за REST токен базирано удостоверяване с JAX-RS и Джърси

Но изглежда не работи с нищо.

Може ли някой да ми помогне? Не знам дали има нещо, което ми липсва

Благодаря на всички предварително

РЕДАКТИРАНЕ: Когато поискам URI поздравление/администратор, между другото получавам 403 Забранено (забравих да кажа това)


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