Tchurma, tarrrdde.
Eu gostaria de opinião de vocês sobre uma arquitetura que estou pensando e gostaria dos pitacos de todos. É o seguinte, estou desenvolvendo uma aplicação web em que terei que verificar as autorizações dos usuários (trivial -> sem utilizar JAAS). Então, tenho as classes usuário e perfil e uma relação entre elas para saber quais permissões que o usuário tem. Mas, o usuário pode ter permissão de consulta, mas não ter de inclusão.
Fiz o seguinte, criei uma página, por exemplo, cadastro chamada cadastro.xhtml e passo como parâmetro a operação que o usuário está tentando executar. Exemplo: cadastro.xhtml?oper=1 sendo que o 1 seria consulta. Via JSF eu não renderizo os componentes de incluir, excluir e alterar.
Agora vem o caso.
O que fiz para os administradores do aplicação, que podem dar ou retirar permissões dos usuários.
Criei uma ENUM com todas as telas e operações da aplicação. Cada nova página deve-se ter, obrigatoriamente, uma entrada nesta ENUM que segue.
PG_PRINCIPAL() {
@Override
public String getPage() {
return CONTEXTO + "principal" + EXTENSAO;
}
public Collection<Integer> getOperations() {
return new HashSet<Integer>() {
private static final long serialVersionUID = 1L;
{
add(CONSULTAR);
}
};
}
},
PG_ENTRADA() {
@Override
public String getPage() {
return CONTEXTO + "entrada" + EXTENSAO;
}
public Collection<Integer> getOperations() {
return new HashSet<Integer>() {
private static final long serialVersionUID = 1L;
{
add(CONSULTAR);
}
};
}
};
public abstract String getPage();
public abstract Collection<Integer> getOperations();
private static final String CONTEXTO = "/secure/";
private static final String EXTENSAO = ".xhtml";
/** Operações **/
private static final int CONSULTAR = 1;
private static final int INCLUIR = 2;
private static final int ALTERAR = 3;
private static final int EXCLUIR = 4;
....
Na tela de associação de usuários a perfis, utilizo reflexão para buscar todas as telas e suas possíveis operações, associo isso a uma base de dados e pronto. Ao se logar na aplicação, sei quais as operações que cada tela tem e verifico se o usuário tem permissão em determinada operação.
A pergunta que não quer calar. Observe que a cada tela, tenho que inserir as operações da tela, e esse código fica repetitivo na ENUM. Ai, vim consultar os especialistas para saber se há outra forma de se fazer isso, e também, se poderia criar um método para incluir essas operações na ENUM sem repetir o método. Por exemplo, na classe ENUM ter um método chamado putOperations(args…) e fazer um iterator nesses args para popular a collections de operações.
Aceito até sugestões de melhorar isso!!!
Abraços e valeu!