Tutorial Mentawai #3 – Autenticação

Padrão

Olá pessoal! Tudo certo?

No último post sobre o Mentawai, tivemos uma visão geral sobre Filtros, que basicamente são ações executadas sobre o conteúdo da input ou output, antes ou depois da execução de uma Action. A partir do uso de filtros giram praticamente todas as funcionalidades do framework.

No tutorial de hoje, vamos ver como funciona o controle de autenticação no Mentawai. A autenticação consiste em evitar o acesso de usuários não autenticados (que não realizaram um login, por exemplo). Vocês verão que este processo de controle é extremamente simples de se fazer com o Mentawai.

Primeiramente, precisamos criar uma action de login. Em vez de estender BaseAction, esta action deve estender BaseLoginAction.

package net.rafaeltoledo.mentawai.controller.action;</p>
<p>import org.mentawai.action.BaseLoginAction;</p>
<p>public class LoginAction extends BaseLoginAction {</p>
<p>	@Override<br />
	public String execute() throws Exception {</p>
<p>		String email = input.getString(&quot;email&quot;);<br />
		String senha = input.getString(&quot;senha&quot;);</p>
<p>		// Aqui você pode realizar a sua consulta ao banco<br />
		if (!&quot;admin@rafaeltoledo.net&quot;.equals(email) || !&quot;admin&quot;.equals(senha)) {<br />
			return ERROR;<br />
		}</p>
<p>		setUserSession(email);</p>
<p>		return SUCCESS;<br />
	}<br />
}

O lance dessa action é o método setUserSession() que deve ser chamado para iniciar a sessão de um usuário. Usuários sem uma sessão criada serão bloqueados pelo AuthenticationFilter que veremos logo a seguir.

Agora, precisamos adicionar um filtro no ApplicationManager que definirá opções de redirecionamento e alguns detalhes a mais:

package net.rafaeltoledo.mentawai.controller;</p>
<p>import net.rafaeltoledo.mentawai.controller.action.LoginAction;</p>
<p>import org.mentawai.core.ActionConfig;<br />
import org.mentawai.core.Forward;<br />
import org.mentawai.core.Redirect;<br />
import org.mentawai.filter.AuthenticationFilter;</p>
<p>public class ApplicationManager extends org.mentawai.core.ApplicationManager {</p>
<p>	@Override<br />
	public void loadActions() {<br />
		addGlobalFilter(new AuthenticationFilter());<br />
		addGlobalConsequence(AuthenticationFilter.LOGIN, new Redirect(&quot;/login.jsp&quot;));</p>
<p>		ActionConfig ac = new ActionConfig(&quot;Login&quot;, LoginAction.class);<br />
		ac.addConsequence(LoginAction.SUCCESS, new Redirect(&quot;/home.jsp&quot;));<br />
		ac.addConsequence(LoginAction.ERROR, new Forward(&quot;/login.jsp&quot;));<br />
		addActionConfig(ac);<br />
	}<br />
}

Perceba que adicionamos um filtro global, o AuthenticationFilter. É ele o responsável por tratar o bloqueio das páginas por usuários não autenticados. Além disso definimos uma consequência global, indicando para onde o usuário será redirecionado caso tente acessar alguma página protegida sem estar autenticado (no caso, redirecionamos para a página de login).

Além disso, configuramos a action de Login, definindo um redirecionamento para a home (login com sucesso) ou pra páginda de login (login sem sucesso). E qual a diferença entre o Redirect e o Forward? Enquanto o Redirect simplesmente redireciona para outra página ou action, o Forward redireciona mantendo os dados na saída, realizando um processamento prévio da página. Ele é útil, por exemplo, para exibirmos mensagens de aviso ao usuário (coisa que veremos em muito breve!).

Continuando nosso tutorial, assim como implementamos o login, precisamos implementar o Logout. Como o logout realiza praticamente a mesma tarefa em todas as aplicações, o Mentawai já fornece uma implementação pronta que pode ser utilizada. Caso você tenha dados específicos que necessitem tratamento, você pode criar a sua implementação, tomando como base o exemplo da documentação oficial. Então, basta configurarmos no ApplicationManager.

ac = new ActionConfig(&quot;Logout&quot;, LogoutAction.class);<br />
ac.addConsequence(LogoutAction.SUCCESS, new Redirect(&quot;/home.jsp&quot;));<br />
addActionConfig(ac);

Ok… já vimos como funciona toda essa parte de configuração… mas como eu projeto a minha página? Através de uma única tag!

&lt;%@ taglib uri=&quot;http://www.mentaframework.org/tags-mtw/&quot; prefix=&quot;mtw&quot; %&gt;<br />
&lt;mtw:requiresAuthentication /&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;O usuário só verá esta página se estiver autenticado!&lt;/h1&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;

Na configuração atual que temos, caso o usuário tente acessar uma página protegida, ele será redirecionado para a página de login e, caso o login seja realizado com sucesso, ele é redirecionado para a home. Em alguns casos, seria interessante que, após o login, ele fosse redirecionado de volta para a página que estava tentando acessar. Para isso, podemos adicionar um filtro na configuração da action de login para fazer esse trabalho pra gente.

ActionConfig ac = new ActionConfig(&quot;Login&quot;, LoginAction.class);<br />
ac.addConsequence(LoginAction.SUCCESS, new Redirect(&quot;/home.jsp&quot;));<br />
ac.addConsequence(LoginAction.ERROR, new Forward(&quot;/login.jsp&quot;));<br />
addActionConfig(ac);</p>
<p>ac.addFilter(new RedirectAfterLoginFilter());<br />
ac.addConsequence(RedirectAfterLoginFilter.REDIR, new Redirect());

E depois, basta adicionar  a opção redir=”true” na tag mtw:requiresAuthentication.

&lt;%@ taglib uri=&quot;http://www.mentaframework.org/tags-mtw/&quot; prefix=&quot;mtw&quot; %&gt;<br />
&lt;mtw:requiresAuthentication redir=&quot;true&quot; /&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;Após a autenticação, o usuário volta pra cá!&lt;/h1&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;

Então… é isso pessoal! No próximo tutorial, veremos como implementar um sistema de autorização com o Mentawai. Até lá! 😀