Apesar de achar que da forma que faço é meio trabalhoso, mas permite ao administrador conceder qualquer permissão pré-definida no sistema:
De forma simplificada, tenho o seguinte:
É feita a anotação @Restricao (há uma interface para isso) nos métodos importantes de cada Controller:
@Restricao({"Incluir", "Alterar", "AlterarUnidadeConsumo", "AlterarUnidadeCompra"})
@Path("/estProduto/armazenar")
public void armazenar (EstProduto estProduto){
...
}
Os controles são cadastrados no banco com suas respectivas restrições, que também serão utilizados para gerar o menu dinâmico. Se o usuário não tiver permissão alguma naquele Controller nem precisa mostrar no menu.
Os usuários são agrupados em perfis que receberão suas respectivas permissões (sempre guardadas no banco de dados).
Ao tentar executar uma ação, o filtro checa e existência de uma anotação. Se houver, checa se há permissão para o perfil do usuário:
boolean temPermissao = true;
if ((userInfo.getUser() !=null) && (!userInfo.getUser().getPerfil().isAdministrador()) &&
(!userInfo.getUser().getPerfil().isDesenvolvedor())){
if(method.getMethod().isAnnotationPresent(Restricao.class)) {
temPermissao = verificaRestricao(userInfo.getUser().getPerfil().getId(), method.getResource().getType().getSimpleName(),
method.getMethod().getAnnotation(Restricao.class).value());
}
}
...
private boolean verificaRestricao(Long idPerfil, String controller, String[] restricoes){
int pos = controller.indexOf("Controller");
if (pos > 0) {
controller = controller.substring(0, pos);
}
boolean temPermissao = false;
for (String restricao : restricoes) {
temPermissao = permissaoDao.permissaoEm(idPerfil, controller, restricao); //verificar se o usuário possui esta permissão
if (temPermissao) break;
}
return temPermissao;
}
É isto …