Problema com autorização personalizada no DropWizard
Estou tentando adicionar uma autorização personalizada no dropwizard, mas não consigo.
Eu tenho uma autenticação personalizada adicionada para o dropwizard vinculando-o a authFactory
Authenticator ssoAuthenticator = createSSOAuthenticator(configuration.getSsoGrantClientConfiguration());
environment.jersey().register(AuthFactory.binder(
new SSOTokenAuthFactory<SSOGrant>(
ssoAuthenticator,
SYSTEM_PREFIX,
SSOGrant.class))
);
e adicionando um recurso dinâmico para autorização
environment.jersey().register(PermissionDynamicFeature.class);
Abaixo está a anotação criada
@Documented
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD})
public @interface PermissionsAllowed {
String[] value();
}
Estou verificando se a anotação está presente no método e depois registrando um filtro
public class PermissionDynamicFeature implements DynamicFeature {
@Override
public void configure(final ResourceInfo resourceInfo, final FeatureContext configuration) {
final AnnotatedMethod am = new AnnotatedMethod(resourceInfo.getResourceMethod());
final Annotation[][] parameterAnnotations = am.getParameterAnnotations();
for (Annotation[] annotations : parameterAnnotations) {
for (Annotation annotation : annotations) {
if (annotation instanceof PermissionsAllowed) {
configuration.register(new RolesAllowedRequestFilter(((PermissionsAllowed)annotation).value()));
return;
}
}
}
}
//@Priority(Priorities.USER) // authorization filter - should go after any authentication filters
private static class RolesAllowedRequestFilter implements ContainerRequestFilter {
private final boolean denyAll;
private final String[] rolesAllowed;
RolesAllowedRequestFilter() {
this.denyAll = true;
this.rolesAllowed = null;
}
RolesAllowedRequestFilter(final String[] rolesAllowed) {
this.denyAll = false;
this.rolesAllowed = (rolesAllowed != null) ? rolesAllowed : new String[] {};
}
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
if (!denyAll) {
if (rolesAllowed.length > 0 && !isAuthenticated(requestContext)) {
throw new ForbiddenException(LocalizationMessages.USER_NOT_AUTHORIZED());
}
for (final String role : rolesAllowed) {
if (requestContext.getSecurityContext().isUserInRole(role)) {
return;
}
}
}
throw new ForbiddenException(LocalizationMessages.USER_NOT_AUTHORIZED());
}
private static boolean isAuthenticated(final ContainerRequestContext requestContext) {
return requestContext.getSecurityContext().getUserPrincipal() != null;
}
}
}
Estou apenas tentando criar minha autorização com base nas mesmas linhas do filtro RolesAllowed.
O problema que estou enfrentando é que o filtro de autorização é chamado antes da autenticação. O que estou faltando para que a autenticação ocorra primeiro e o filtro de autorização seja chamado mais tarde?
O mesmo acontece quando registramos RolesAllowedDynamicFeature
environment.jersey().register(RolesAllowedDynamicFeature.class);
RolesAllowedDynamicFeature é chamado mesmo antes da autenticação acontecer.