Olá Marco, segue a classe completa e o arquivo de rotas:
package controllers;
import java.util.Optional;
import org.mindrot.jbcrypt.BCrypt;
import com.google.inject.Inject;
import autenticadores.UsuarioAutenticado;
import daos.TokenDeCadastroDAO;
import daos.UsuarioDAO;
import models.EmailDeCadastro;
import models.TokenDeCadastro;
import models.Usuario;
import play.api.libs.mailer.MailerClient;
import play.data.DynamicForm;
import play.data.Form;
import play.data.FormFactory;
import play.mvc.*;
import play.mvc.Security.Authenticated;
import validadores.ValidadorDeUsuario;
import views.html.*;
public class UsuarioController extends Controller {
public static final String AUTH = "auth";
@Inject
FormFactory formularios;
@Inject
private ValidadorDeUsuario validadorDeUsuario;
@Inject
private MailerClient enviador;
@Inject
private TokenDeCadastroDAO tokenDeCadastroDAO;
@Inject
private UsuarioDAO usuarioDAO;
public Result formularioDeNovoUsuario() {
play.data.Form<Usuario> formulario = formularios.form(Usuario.class);
return ok(formularioDeNovoUsuario.render(formulario));
}
public Result salvaNovoUsuario() {
Form<Usuario> formulario = formularios.form(Usuario.class).bindFromRequest();
if (validadorDeUsuario.temErros(formulario)) {
flash("danger", "Existem erros no preenchimento do cadastro");
return badRequest(formularioDeNovoUsuario.render(formulario));
}
Usuario usuario = formulario.get();
String criptoSenha = BCrypt.hashpw(usuario.getSenha(), BCrypt.gensalt());
usuario.setSenha(criptoSenha);
usuario.save();
TokenDeCadastro token = new TokenDeCadastro(usuario);
token.save();
enviador.send(new EmailDeCadastro(token));
flash("success", "Um email foi enviado para confirmar seu cadastro!");
return redirect(routes.UsuarioController.formularioDeNovoUsuario());
}
public Result confirmaCadastro(String email, String codigo) {
Optional<TokenDeCadastro> possivelToken = tokenDeCadastroDAO.comCodigo(codigo);
Optional<Usuario> possivelUsuario = usuarioDAO.comEmail(email);
if (possivelUsuario.isPresent() && possivelToken.isPresent()) {
TokenDeCadastro token = possivelToken.get();
Usuario usuario = possivelUsuario.get();
if (token.getUsuario().equals(usuario)) {
token.delete();
usuario.setVerificado(true);
usuario.update();
flash("success", "Usuario cadastrado com sucesso!");
return redirect(routes.UsuarioController.painel());
}
}
flash("danger", "Falha na tentativa de cadastro");
return redirect(routes.UsuarioController.formularioDeNovoUsuario());
}
@Authenticated(UsuarioAutenticado.class)
public Result painel() {
return ok(painel.render());
}
public Result formularioDeLogin() {
return ok(formularioDeLogin.render(formularios.form()));
}
public Result fazLogin() {
DynamicForm formulario = formularios.form().bindFromRequest();
String email = formulario.get("email");
String senhaCriptografada = BCrypt.hashpw(formulario.get("senha"), BCrypt.gensalt());
Optional<Usuario> possivelUsuario = usuarioDAO.comEmailESenha(email, senhaCriptografada);
if (possivelUsuario.isPresent()) {
Usuario usuario = possivelUsuario.get();
if (usuario.isVerificado()) {
session(AUTH, usuario.getEmail());
flash("success", "Login efetuado com sucesso!");
return redirect(routes.UsuarioController.painel());
} else {
flash("warning", "Usuario não confirmado, verfique seu email.");
}
} else {
flash("danger", "Credenciais inválidas");
}
return redirect(routes.UsuarioController.formularioDeLogin());
}
@Authenticated(UsuarioAutenticado.class)
public Result fazLogout(){
session().clear();
flash("success", "Logout efetuado com sucesso!");
return redirect(routes.UsuarioController.formularioDeLogin());
}
}
rotas:
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
#Rotas de cadastro
GET /produto/novo controllers.ProdutoController.formularioDeNovoProduto
POST /produto/novo controllers.ProdutoController.salvaNovoProduto
GET /usuario/novo controllers.UsuarioController.formularioDeNovoUsuario
POST /usuario/novo controllers.UsuarioController.salvaNovoUsuario
#Rotas de busca
GET /api/produto controllers.ApiController.comFiltros
GET /api/produtos/todos controllers.ApiController.todosOsProdutos
GET /api/produtos/tipo/:tipo controllers.ApiController.doTipo(tipo)
#Rota de confirmacao
GET /usuario/confirma/:email/:codigo controllers.UsuarioController.confirmaCadastro(email, codigo)
#Rotas de login
GET /login controllers.UsuarioController.formularioDeLogin
POST /login controllers.UsuarioController.fazLogin
GET /usuario/painel controllers.UsuarioController.painel
GET /logout controllers.UsuarioController.fazLogout
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)