Angular 2+ - Vraptor 4 Interceptor abortar execução do request caso o usuário não tenha permissão

67 views
Skip to first unread message

André Faria

unread,
Jul 31, 2018, 10:25:17 AM7/31/18
to caelum-vraptor
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 ?

Thiago Nobrega

unread,
Oct 31, 2018, 3:41:44 PM10/31/18
to caelum-vraptor
Oi, 

Eu acho que pelo seu código você não está dizendo para onde ele deve ir, está só interceptando e executando a logica, e aí ele segue o caminho normal.

Talvez para funcionar você deva fazer algo para mudar a direção da requisição dentro do metodo intercept, utilizando um result.redirect... apontando para uma rota diferente do padrão...
Reply all
Reply to author
Forward
0 new messages