Oi Pessoal,
Em primeiro lugar peço desculpas pela demora - eu não estava
monitorando o tópico, mas agora vou ficar mais atento.
O auth está funcionando no meu novo site (ACL não, somente Auth), mas
existem algumas coisas que eu não testei como criar um usuário
(registro) e outras não implementadas ainda totalmente como multi-
nível (admin/user) - mas são pequenos detalhes.
Estou usando o cake 1.2 Beta (cake_1.2.0.6311-beta) que já possui o
Auth (acho que no 1.1 você tem que adicionar ele separadamente) -
assim este exemplo foi testado somente com o 1.2
Primeiro vamos à criação das tabelas:
CREATE TABLE `users` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`username` varchar(250) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL,
`group_id` smallint(6) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`email` varchar(250) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`status` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
----------------------
CREATE TABLE `groups` (
`id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`description` text,
`parent_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
----------------------
sobre a tabela users acima, você pode mais tarde usar o email como
username se preferir e remover o campo username (mas não modifique
nada agora, faça ele funcionar primeiro).
Na verdade meu exemplo não usa ainda a tabela groups.
user.php :
<?php
class User extends AppModel {
var $name = 'User';
var $validate = array(
'username' => VALID_NOT_EMPTY,
'password' => VALID_NOT_EMPTY
);
function beforeSave() {
if ($this->data['User']['password']) {
$this->data['User']['password'] = md5($this->data['User']
['password']);
}
return true;
}
}
?>
----------------------
Eu estou usando md5 para as senhas no banco, mas eu não testei ainda
esta rotina (copiei ela de um tutorial) que transforma em md5 antes de
armazenar a senha.
Agora modifique o seu app_controller.php para que o auth esteja
opcionalmente disponível em todos controllers (você escolhe quais
necessitam autenticação ou não adicionando-se o componente Auth):
app_controller.php:
<?php
class AppController extends Controller {
function beforeFilter() {
$this->_performAuth();
} //function beforeFilter()
function isAuthorized() {
if (isset($this->params[Configure::read('Routing.admin')])) {
if ($this->Auth->user('admin') == 0) {
return false;
}
}
return true;
}//isAuthorized
function _performAuth()
{
// se o controller possui o componente Auth,
// então é necessário autenticação para ter acesso à ele.
if (isset($this->Auth)) {
Security::setHash("md5");
//se você preferir email como nome do usuário, use:
'username' =>
'email' (não testei)
$this->Auth->fields = array('username' => 'username',
'password' =>
'password');
$this->Auth->loginAction = array('controller' =>
'users', 'action'
=> 'login');
//Se preferir que redirecione para uma página em
específico sempre
após o login (eu prefiro comentado pois redireciona para a página
anterior ao login)
//$this->Auth->loginRedirect = array('controller' =>
'users',
'action' => 'myaccount');
//se preferir que redirecione para uma página
específica após o
logout:
//$this->Auth->logoutRedirect = '/';
//mensagem flash em caso de erro de login (Não está
funcionando
comigo)
$this->Auth->loginError = 'Invalid e-mail / password
combination.
Please try again';
$this->Auth->authorize = 'controller';
}
} //function _performAuth()
}
?>
----------------------
users_controller.php:
<?php
class UsersController extends AppController
{
var $name = 'Users';
var $layout = 'management';
var $uses = array( 'User',
);
var $components = array('Auth', 'Session');
var $helpers = array('Html', 'Form', 'Session'
);
var $publicControllers = array('pages');
function index(){
} //index
//em qualquer controller que você adicionar o Auth, você pode
especificar Actions que os usuários tenham acesso sem necessidade de
autenticar. Neste caso /users/getAuthUser
function beforeFilter(){
$this->Auth->allow('getAuthUser');
parent::beforeFilter();
}
function login() {
if ($this->Auth->user()) {
if (!empty($this->data)) {
if (empty($this->data['User']['remember_me'])) {
$this->Cookie->del('User');
} else {
$cookie = array();
$cookie['username'] =
$this->data['User']['email'];
$cookie['token'] =
$this->data['User']['password'];
$this->Cookie->write('User', $cookie,
true, '+2 weeks');
}
unset($this->data['User']['remember_me']);
}
$this->redirect($this->Auth->redirect());
}
}//login()
function logout() {
$this->log("users_controller.php: logout()", LOG_DEBUG);
$this->layout = 'default';
$url_logout = $this->Auth->logout();
$this->Session->setFlash('You\'ve successfully logged out.');
$this->redirect($url_logout);
}
function myaccount()
{
//TODO
//set('',);
//return
}
//esta ação pode ser chamada de qualquer controller para verificar
qual usuário está logado.
function getAuthUser(){
if ($this->isAuthorized())
$user = $this->Auth->user();
else
$user = null;
return $user;
}
} // Class
?>
----------------------
users/myaccount.ctp:
<?php
// faça aqui sua página de gerencia de conta do usuário (troca de
senhas, etc..)
?>
----------------------
users/login.ctp:
<h1>Log In:</h1>
<?= isset($auth_msg) ? $auth_msg: ''?>
<?php e($form->create('User', array('action'=>'login')));?>
<?php echo $form->input('username');?>
<?php echo $form->input('password',
array('value'=>''));?>
<div class="submit"><input type="submit" value="Login" /></div>
<?php echo $form->end();?>
----------------------
Agora você pode incluir o auth no seu controller bastando incluir o
componente Auth:
var $components = array ( 'Auth');
Voce pode especificar actions (via requestAction por exemplo) deste
controller que não necessitam autenticação (muito útil com o tempo)
function beforeFilter(){
$this->Auth->allow('nome_action1', 'nome_action2');
parent::beforeFilter();
}
Eu tive dificuldades em adicionar meu próprio usuário na base de
dados, como o Auth cria o md5 - para adicionar a senha do usuário, eu
fiz um debug e verifiquei o hash que ele ia comparar com o db e
adicionei este manualmente como senha.
Como eu disse, ele não usa o ACL ainda ou faz qualquer diferenciação
entre usuários (user/admin) mas acho que é fácil implementar.
qualquer dúvida, agora estou monitorando o tópico - se achar erros no
código ou em caso de sugestões, por favor poste aqui!
Abraços
Érico
--~--~---------~--~----~------------~-------~--~----~
Recebeu esta mensagem porque está inscrito em Grupo "Cake PHP Português" do
Grupos Google.
Para enviar mensagens para este grupo, envie um email para
[email protected]
Para anular a inscrição neste grupo, envie um email para [EMAIL PROTECTED]
Para mais opções, visite este grupo em
http://groups.google.com/group/cake-php-pt?hl=pt-PT
-~----------~----~----~----~------~----~------~--~---