Olá,
Estou com um problema que ainda não consegui resolver.
Estou Usando Angular 2+ no Frontend e Vraptor 4 no backend.
Eu tenho um interceptor para verificar se o usuário tem permissão para acessar o método x, caso o usuário não tenha permissão o sistema deverá retornar o erro 401.
O interceptor está funcionando corretamente, interceptando o request entrando no método de retornar o erro, mas mesmo após a interceptação ele ainda continua a execução entrando no método que está bloqueado para o acesso.
Como parar a execução e retornar somente o erro 401 com suas devidas mensagens ?
Lembrando que eu estou trabalhando com JSON e não tenho uma JSP para redirecionar em caso de erro.
Segue os códigos.
Método do controller que possui as anotações de permissões.
@Permissao({AcaoSiteEnum.EMP_ALTERAR, AcaoSiteEnum.EMP_EXIBIR, AcaoSiteEnum.EMP_EXPORTAR, AcaoSiteEnum.EMP_INCLUIR, AcaoSiteEnum.EMP_EXCLUIR})
@Get("/{id}/loaddataangular")
public void loadDataAngular(Long id) {
try {
Empresa empresaAux = new Empresa();
Empresa empresaRetorno = new Empresa();
ArrayList<String> msgs = new ArrayList<>();
try {
empresaAux = this.repository.loadById(id);
empresaRetorno.setCodigo(empresaAux.getCodigo());
empresaRetorno.setRazaoSocial(empresaAux.getRazaoSocial());
} catch (Exception e) {
msgs.add("Falha no (" + NomeController + ") método (loadDataAngular(Long id)) (" + id + "), por favor tente novamente!");
repository.returnErrorValidatorMessage(500, msgs, e, repository.getDatabaseProductName());
}
if (empresaAux == null) {
msgs.add("Registro de ID (" + id + ") não Encontrado!");
repository.returnErrorValidatorMessage(412, msgs, null, repository.getDatabaseProductName());
} else {
this.result.use(Results.json()).withoutRoot().from(empresaRetorno).serialize();
}
} finally {
}
}
Interceptor que testa se o usuário tem permissão.
@BeforeCall
public void intercept() {
ArrayList<String> msgs = new ArrayList<>();
try {
Permissao controllerList = method.getController().getType().getAnnotation(Permissao.class);
Permissao methodList = method.getMethod().getAnnotation(Permissao.class);
if (!(this.hasAccess(methodList) && this.hasAccess(controllerList))) {
List<AcaoSiteEnum> permissaoList = new ArrayList<AcaoSiteEnum>();
if (methodList != null) {
permissaoList.addAll(Arrays.asList(methodList.value()));
}
if (controllerList != null) {
permissaoList.addAll(Arrays.asList(controllerList.value()));
}
String message = "Usuário não possui permissão para: ";
String dado[];
String acao = "";
String controller = "";
dado = this.request.getRequestURI().split("/");
acao = dado[dado.length - 1];
if (permissaoList.size() > 0) {
dado = permissaoList.get(0).getAcao().split("_");
controller = dado[0];
}
message += acao.toUpperCase() + " " + controller.toUpperCase() + ".";
msgs.add(message+ acao + controller);
usuarioParamEmpRepository.returnErrorValidatorMessage(401, msgs, null, usuarioParamEmpRepository.getDatabaseProductName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
ele entra no interceptor, pegando o erro 401, mas depois da execução do interceptor e depois continua a execução entrando no método do controller.
Como abortar a requisição caso entre no erro 401 e não entrar no método do controller, retornando somente as mensagems de não autorizado ?