Developers,
primeiramente entendam que Zend_Auth lida apenas com autenticação e não autorização (mais para frente iremos ver como através da Zend_Acl). A autenticação é feita com base em credenciais, verificando a identidade do usuário, portanto vamos criar uma tabela de usuários chamada users em nosso banco de dados Sample Project.
Criando a tabela no banco de dados
CREATE TABLE `sampleproject`.`users` (
`user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_name` VARCHAR( 150 ) NOT NULL ,
`user_email` VARCHAR( 64 ) NOT NULL ,
`user_password` CHAR( 40 ) NOT NULL
) ENGINE = MYISAM COMMENT = 'Tabela de usuários';
Criando conexão com o banco de dados
Recentemente publiquei um artigo sobre como criar conexão com banco de dados MySQL usando Zend Framework. Nele a aplicação está bem completa.
Criando o formulário de login
class Sample_Form_Login extends Zend_Form
{
public function init()
{
$this->setAction('');
$this->setMethod('POST');
$user_email = new Zend_Form_Element_Text('user_email');
$user_email ->setLabel('Email');
$user_password = new Zend_Form_Element_Password('user_password');
$user_password->setLabel('Senha');
$act = new Zend_Form_Element_Submit('act');
$act->setLabel('Entrar');
$this->addElements(
array(
$user_email,
$user_password,
$act
)
);
}
}
Criando o AuthController
Nesse controlller é onde criaremos nossas regras de negócios de login e logout.
class AuthController extends Zend_Controller_Action
{
public function init()
{
}
public function indexAction()
{
// Redireciona para o login
$this->_redirect('auth/login');
}
public function loginAction()
{
// Instancia o formulário de login
$objFormLogin = new Sample_Form_Login();
$this->view->objFormLogin = $objFormLogin;
// Verifica se foi submetido via POST
if( !$this->_request->isPost() )
return false;
// Obtém os dados passados via POST
$data = $this->_request->getPost();
// Se os dados forem validos
if( !$objFormLogin->isValid($data))
return false;
// Cria uma instancia de Zend_Auth
$objAuth = Zend_Auth::getInstance();
/**
* Instancia o Auth Db Table Adapter
*
* Quando se instancia este objeto, precisamos informar as configurações
* do BD, nome da tabela onde os dados de login estão, o campo do nome
* do usuário, e o campo da senha na tabela.
*/
$authAdapter = new Zend_Auth_Adapter_DbTable(
Zend_Registry::get( 'db' ),
'users',
'user_email',
'user_password',
'sha1(?)'
);
// Configura as credencias user_email e user_password informadas pelo usuário
$authAdapter->setIdentity( $data['user_email'] )->setCredential( $data['user_password']);
// Tenta autenticar o usuário
$result = $objAuth->authenticate($authAdapter);
/**
* Se o usuário for autenticado redireciona para a index e grava seu email,
* caso contrário exibe uma mensagem de alerta na página
*/
if ( $result->isValid() ) :
/**
* Pega os dados do usuário, omitindo a senha
* http://framework.zend.com/manual/en/zend.auth.adapter.dbtable.html
*/
$authData = $authAdapter->getResultRowObject( null, 'user_password' );
// Armazena os dados do usuário
$objAuth->getStorage()->write( $authData );
echo 'Login efetuado com sucesso!';
else :
echo 'Os dados informados (e-mail e/ou senha) não são válidos.';
endif;
}
public function logoutAction()
{
$objAuth = Zend_Auth::getInstance();
// Limpa a autenticação
$objAuth->clearIdentity();
}
}
Registrando o namespace “Sample”
Para que o zend entenda ao chamar a classe Sample_Form_Login(), é necessário que dentro do seu bootstrap você registre o namespace “Sample”, que é onde você vai guardar seus formulários, dentre eles o formulário de login.
Nesta função é criada um auto-carregamento dos conteúdos que ali estão, veja como ficará seu bootstrap.
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoLoader()
{
// Cria uma instancia de autoloader
$autoloader = Zend_Loader_Autoloader::getInstance();
// Registra o namespace Sample
$autoloader->registerNamespace('Sample');
}
}
Concluindo
Bom pessoal, aprendemos como criar uma conexão com banco da dados MySQL, criamos um formulário de login usando Zend_Form e criamos nossa classe de autenticação AuthController com as actions de login e logout. Nossa muito conteúdo para apenas um post!
Então pessoal, agora é vocês adaptarem esse sistema na aplicação de vocês!
Abraços e comentem suas dúvidas, críticas e/ou elogios!