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
-~----------~----~----~----~------~----~------~--~---

Responder a