Tutorial Mentawai #4 – Autorização

Padrão

Olá pessoal! Tudo certo?

No último tutorial sobre o Mentawai, vimos como implementar facilmente autenticação em um aplicativo web. No post de hoje, vamos complementar o conceito, mostrando o que o Mentawai pode oferecer em se falando de Autorização.

De fato, Autenticação e Autorização são conceitos complementares. Não faz sentido se falar em Autorização (o que cada usuário tem acesso) se o aplicativo não implementa Autenticação (apenas usuários autênticos podem ter acesso ao aplicativo).

No Mentawai, o conceito de Autorização é implementado através de Grupos e Permissões. Um Usuário possui um ou mais grupos. Um Grupo, por sua vez, possui uma ou mais Permissões.

A criação dos Grupos e consequente definição das permissões deve ocorrer no método init() do ApplicationManager, dessa forma:

@Override
public void init(Context application) {

	Group administrador = new Group("administrador");
	// Pode adicionar uma permissão de cada vez
	administrador.addPermission("criarUsuario");
	// Ou adicionar encadeada
	administrador.addPermission("configurarSistema").addPermission("visualizarMenu");
	AuthorizationManager.addGroup(administrador);

	Group usuarioComum = new Group("usuarioComum");
	usuarioComum.addPermission("visualizarMenu");
	AuthorizationManager.addGroup(usuarioComum);
}

Definidos os grupos, ao autenticar o usuário você atribui o(s) grupo(s) ao qual ele pertence.

@Override
public String execute() throws Exception {

	String email = input.getString("email");
	String senha = input.getString("senha");

	. . .

	if (email.equals("admin@rafaeltoledo.net")) {
		setUserSession(email);

		// pode-se fazer assim...
		setUserGroup("administrador");
		setUserGroup("usuarioComum");
		// ... ou assim!
		List<String> grupos = new ArrayList<String>();
		grupos.add("administrador");
		grupos.add("usuarioComum");
		setUserGroups(grupos);
	}

	return SUCCESS;
}

Já nas páginas, o Mentawai fornece algumas tags para controlar o que pode ou não ser visto por cada um dos usuários, controlando por grupos ou por permissões.

<!-- Protegendo a página toda, configurando vários grupos -->
<mtw:requiresAuthorization groups="administrador, usuarioComum"/>
<!-- Protegendo a página toda, configurando um grupo apenas -->
<mtw:requiresAuthorization group="administrador"/>
<!-- Ou ainda protegendo a página toda por permissões -->
<mtw:requiresAuthorization permission="configurarSistema"/>

<!-- Ou protegendo trechos da página por grupos... -->
<mtw:hasAuthorization group="administrador"><!-- também pode definir mais de um grupo -->
	<p>Só administradores veem isso.</p>
</mtw:hasAuthorization>
<!-- ... ou por permissões -->
<mtw:hasAuthorization permission="configurarSistema"><!-- também pode definir mais de uma permissão -->
	<p>Só quem tem a permissão configurarSistema vê isso.</p>
</mtw:hasAuthorization>

Para concluir, basta adicionar uma consequência global ao ApplicationManager para redirecionar os usuários sem determinada permissão para uma página de erro, por exemplo. Você também pode proteger, em vez da página, a própria chamada à Action.

@Override
public void loadActions() {
	addGlobalFilter(new AuthenticationFilter());
	addGlobalConsequence(AuthenticationFilter.LOGIN, new Redirect("/login.jsp"));
	addGlobalConsequence(AuthorizationFilter.ACCESSDENIED, new Redirect("/erro.jsp"));

	ActionConfig ac = new ActionConfig("CriarUsuario", CriarUsuarioAction.class);
	ac.addConsequence(CriarUsuarioAction.SUCCESS, new Redirect("/usuarioList.jsp"));
	ac.addFilter(new AuthorizationFilter(new Permission("criarUsuario")));
	addActionConfig(ac);

	. . .
}

Simples não? Se você tem os papéis de cada um dos usuários bem definidos dentro de seu aplicativo, é muito fácil criar o seu controle de acesso utilizando o Mentawai. Em 2010 precisei fazer um sistema mais “maleável” e apanhei um pouco… vou procurar o código e em breve faço um post mostrando como resolvi.

Por enquanto é só! Até a próxima! 😀

Deixe uma resposta