Nesse post vou explicar como adicionar autenticação de usuários no @vorticephp, como base para o sistema vamos utilizar o exemplo que já vem com o framework.
Script de BD:
CREATE TABLE IF NOT EXISTS orgaos ( id int(11) NOT NULL AUTO_INCREMENT, sigla varchar(50) collate utf8_unicode_ci NOT NULL, nome varchar(150) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 CREATE TABLE IF NOT EXISTS usuarios ( id int(10) UNSIGNED NOT NULL, nome varchar(50) NOT NULL, email varchar(60) NOT NULL, senha char(32) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO usuarios (nome, email, senha) VALUES('Administrador', 'adm@ferrari.eti.br', md5('123'));
eu criei essa tabela com esse usuario e senha no database que já vem configurado no framework para vocês testarem localmente. Você pode configurar a conexão com o seu próprio banco de dados no arquivo app/app.php
Para iniciar vamos criar o objeto do usuário em: app/model/Usuario.php e codificar:
<?php class Usuario{ public function __construct($id=0, $nome='', $email='', $senha=''){ $this->id = $id; $this->nome = $nome; $this->email = $email; $this->senha = $senha; } }
agora que temos o objeto, vamos criar um DAO para realizar operações, crie o arquivo app/model/UsuarioDAO.php e segue o código:
<?php class UsuarioDAO{ public function getByEmail($email){ $sql = "SELECT * FROM usuarios WHERE email='$email'"; return Database::getInstance()->queryOne($sql); } }
vamos para o controller de usuários, crie o arquivo app/controller/UsuarioController.php e segue o codigo inicial:
<?php class UsuarioController extends Controller{ public function login(){ } }
Dai a gente cria o nosso formulário de login, edite app/view/usuario/login.php:
<h2>Login</h2> <fieldset> <form method="post"> <p><label>E-mail:</label><input type="text" name="email" /></p> <p><label>Senha:</label><input type="password" name="senha" /></p> <p><input type="submit" value="Logar!" /></p> </form> </fieldset>
Agora com o form criado, vamos editar a action login do controller Usuario, volte e edite o arquivo app/controller/UsuarioController.php:
<?php class UsuarioController extends Controller{ public function login(){ // se um formulario foi postado if (post){ // pega as variáveis do post $email = addslashes(p('email')); $senha = md5(p('senha')); // seleciona o usuario, armazena na variavel $u // e ainda verifica se o usuario existe if ($u = UsuarioDAO::getByEmail($email)){ // verifica se a senha digitada combina com // a que está no BD if ($u->senha == $senha){ // remove a senha do objeto $u->senha = null; // grava a session Session::set("u", $u); // Cria mensagem de sucesso e redireciona para o index Post::setSucesso("Olá {$u->nome}, você está logado", new Link("")); }else // Retorna erro Post::setErros("Senha incorreta!"); }else // Retorna erro Post::setErros("e-mail não encontrado!"); } } }
Para ficar bonita a url vamos criar um route para esta action, edite o arquivo app/routes.php e adicione:
Route::add("^login$", "usuario:login");
Agora o formulário de login já está funcionando, vamos fazer o sistema obrigar o usuario estar logado para fazer qualquer coisa no sistema, para isso edite o arquivo app/controller/MasterController.php, como queremos que para todo o sistema sejá necessário o login, vamos adicionar um construtor nessa classe com o seguinte código:
function __construct(){ // se a session "u" não existir, criar uma com um usuario vazio if (!Session::get("u")) Session::set("u", new Usuario()); // Se a session u tiver um objeto vazio.. // e o controller/action forem diferentes dos de login if (Session::get("u")->id == 0 && controller != 'usuario' && action != 'login'){ // redireciona para a tela de login redirect(new Link("login")); } }
Bom, com isso já deve estar tudo funcionando de forma eficiente e simples. Qualquer dúvida ou sugestão mande sem hexitar.
Ainda não testei, mas parece ser muito simples…
E a questão das permissões(Admin, Editor, etc) faço utilizando o Route?
@Renê Dettenborn
Cria um campo de “tipo” na tabela de usuários, e faz a checagem em cada controller ou action se o usuario logado tem permissão para executar aquela ação.. tipo:
if (Session::get(“u”)->tipo != “a”) redirect (new Link(“login”));
você ainda pode colocar essa checagem em uma função e no controller fazer algo assim:
checkTipo(“a”);
[]’s
Me devolveu:Fatal error: Cannot use object of type stdClass as array in E:\wamp3\www\vortice2\core\classes\Link.php on line 184
Não sei se tem algo errado ou não ….
Muito bom esse framework, simples, direto e de eficiente.
Dos testes que realizei, os resultados estão sendo muito bons.
Muito legal o framework! Bem fácil de usar! Bem fácil de compreender! Só faltou mesmo material e documentação. Seria legal disponibilizar uma aplicação completa de exemplo (como um site qualquer que você fez com ela, só que masi enxuto e sem referenciar alguma empresa). Assim ficaria mais fácil e prático entender o framework como um todo.
No aguardo de mais materiais e artigos!
muito bom esse framework, logo de cara se percebe a simplicidade e que foi feito da melhor forma, com certeza a difusão de documentaçao trará diversos usuários.
meus parabéns, com ctz minhas dúvidas serão resolvidas com mais alguns poucos posts…