Arquitetura de autorizações

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!

Alguém poderia dar um pitaco?