 | Tor, até o momento
No fim da Parte 1, você recebeu a oportunidade de usar suas habilidades
para construir algumas funcionalidades faltantes no Tor. Login/Logout,
índice, o uso de senhas em hash e fazer login e registrar automaticamente
um usuário estavam na sua lista de deveres. Como você se saiu?
A visualização de login
Sua visualização de login talvez se pareça à Listagem 1.
Listagem 1. Visualização de login
<?php
if (isset($error)) {
echo('Invalid Login.');
}
?>
<p>Please log in.</p>
<?php echo $form->create('User', array('action' => 'login')); ?>
<?php
echo $form->input('username');
echo $form->input('password');
?>
<?php echo $form->end('Login');?>
<?php echo $html->link('Register', array('action' => 'register')); ?>
|
Sua visualização de índice talvez se pareça à Listagem 2.
Listagem 2. Visualização de índice
<p>Hello, <?php echo($user['first_name'] . ' ' . $user['last_name']); ?></p>
<?php echo $html->link('knownusers', array('action' => 'knownusers')); ?>
<?php echo $html->link('logout', array('action' => 'logout')); ?>
|
Ambas as visualizações devem parecer bem simples. A visualização de índice
verifica na sessão o nome de usuário e, se não houver, o envia para o login.
A visualização de login não determina uma mensagem de erro específica, de
modo que alguém que tente invadir o sistema por tentativa e erro não saberá
que partes estão corretas.
Seu controlador talvez se pareça à Listagem 3.
Listagem 3. Controlador
<?php
class UsersController extends AppController
{
var $name = 'Users';
var $helpers = array('Html', 'Form' );
function register()
{
if (!empty($this->data))
{
$this->data['User']['password'] = md5($this->data['User']['password']);
if ($this->User->save($this->data))
{
$this->Session->setFlash('Your registration information was accepted');
$this->Session->write('user', $this->data['User']['username']);
$this->redirect(array('action' => 'index'), null, true);
} else {
$this->data['User']['password'] = '';
$this->Session->setFlash('There was a problem saving this information');
}
}
}
function knownusers()
{
$this->set('knownusers', $this->User->findAll(null,
array('id', 'username', 'first_name', 'last_name'), 'id DESC') ) ;
}
function login()
{
if ($this->data)
{
$results = $this->User->findByUsername($this->data['User']
['username']);
if ($results && $results['User']['password'] ==
md5($this->data['User']
['password']))
{
$this->Session->write('user', $this->data['User']['username']);
$this->redirect(array('action' => 'index'), null, true);
} else {
$this->set('error', true);
}
}
}
function logout()
{
$this->Session->delete('user');
$this->redirect(array('action' => 'login'), null, true);
}
function index()
{
$username = $this->Session->read('user');
if ($username)
{
$results = $this->User->findByUsername($username);
$this->set('user', $results['User']);
} else {
$this->redirect(array('action' => 'login'), null, true);
}
}
}
?>
|
O uso de md5() para senhas em hash e
a comparação dos seus valores em hash significa que você não precisa
armazenar senhas em texto simples no banco de dados — desde
que faça o hash das senhas antes de armazená-las. Quanto a usuários
que você já tenha criado, você terá de atualizar suas senhas em texto
simples com as versões MD5 delas: UPDATE users SET PASSWORD = md5( PASSWORD ) WHERE 1.
A ação logout não precisa de visualização. Só precisa
limpar os valores que você coloca na sessão.
Não há problema se suas soluções não forem exatamente iguais a estas. Se você
não conseguiu suas próprias soluções, atualize seu código usando o acima para
ficar pronto para concluir o restante deste tutorial.
|  |