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!
Artigos relacionados:
- Como fazer upload de imagens usando Zend Framework
- Como criar conexão com banco de dados MySQL usando Zend Framework
- Como criar um plugin para wordpress – Parte 2
- Como criar um projeto usando a Zend_Tool do Zend Framework
- Como usar a Zend_Tool para criar um projeto em Zend Framework
Daniel Developer
12/03/2010 at 04:05
Marco,
1 – Não, deve estar dentro de modules/default/controllers;
2 – Ok;
3 – Perfeito;
4 – Certo;
5 – Você deve enviar para a view o formulário assim:
e na view admin.phtml você deve chama-lo assim:
Tente isso! Vai dar certo. Abraços
Vitor
12/03/2010 at 04:11
como eu seto as views como UTF-8?
Daniel Developer
15/03/2010 at 03:43
Vitor,
no seu application.ini coloque:
Abraços
Vitor
15/03/2010 at 05:17
já está assim!
Vitor
15/03/2010 at 06:02
estou tentado criar um helper mais está dando o seguinte erro
Message: Action Helper by name Toolbar not found
Meu helper
class Controller_Action_Helper_Toolbar extends Zend_Controller_Action_Helper_Abstract
{…} e chamada no controller
fico assim
$this->_helper->Toolbar->getToolbar();
sabe me dizer oq pode ser?
Vitor
18/03/2010 at 05:24
tem como configurar a pasta de upload no application.ini e capturar?
Nuno
26/03/2010 at 08:08
Oi Daniel gostei do seu blog! Bons tutoriais!
Eu ja tinha o meu sistema de login começado, de maneira que nem tudo está igual ao seu.
No meu sistema está a dar o seguinte erro
No entry is registered for key ‘db’
Gostaria que você me explicasse melhor o seguinte
código:
$authAdapter = new Zend_Auth_Adapter_DbTable(
Zend_Registry::get( ‘db’ ),
‘users’,
‘user_email’,
‘user_password’,
‘sha1(?)’
);
Obrigado
Daniel Developer
26/03/2010 at 14:10
Nuno,
me parece que não criou ainda conexão com o banco de dados. Veja meu artigo sobre http://www.danieldeveloper.com/2010/02/02/criando-conexao-com-banco-de-dados-usando-zend-framework/
Ao criar o banco de dados, você registra a conexão, nesse caso, dá-se o nome de ‘db’. No código: Zend_Registry::get( ‘db’ ) você busca a conexão feita.
Nuno
27/03/2010 at 18:41
Valeu Daniel.. ta funcionando bem agora!
Eu tou começando com esta framework ha pouco tempo. Ja fiz uns exemplos de leitura e escrita no banco de dados, mas nao tive a necessidade de criar esta conexão.
Por exemplo:
class Application_Model_DbTable_Posts extends Zend_Db_Table_Abstract
{
protected $_name = ‘posts’;
public function getPost($id)
{
$id = (int)$id;
$row = $this->fetchRow(‘id = ‘ . $id);
if (!$row) {
throw new Exception(“Count not find row $id”);
}
return $row->toArray();
}
}
neste exemplo eu nao preciso dessa conexão. Isso é por causa da classe Zend_Db_Table_Abstract que faz tudo automáticamente indo ao ficheiro application.ini?
Para o exemplo do login não é possível fazer algo igual, sem necessidade de registar a conexão?
Obrigado
maxwell
30/03/2010 at 07:44
opa ^^
cara, eu to meio enrolado, eu sou novo no zend, estudei o básico, mas tem coisas q eu n entendo, q é ond q ficam os arquivos por exemplo, nesse teu tuto, eu n sei o q vai no index.phtml, sim, os q vao na pasta controllers eu sei, mas os outros n =/
Daniel Developer
31/03/2010 at 03:45
Maxwell,
veja os artigos da categoria Sample Project, será muito útil. Abraços
Francisco Leal
29/04/2010 at 14:41
Daniel, teria um artigo seu aqui no blog pegando carona nesse de login, com tempo logado, tipo expirar por inatividade no site.
Daniel Developer
30/04/2010 at 11:52
Francisco,
no momento ainda não tenho nada postado sobre o assunto. Em breve um novo artigo sobre um login com mais funcionalidades será postado. Acompanhe o blog.
Abraços
Santiago
06/05/2010 at 03:53
Muito bom o seu blog! Tem me servido muito e espero por novos posts.
Você é o cara!
Ricardo
11/05/2010 at 10:59
Fala Daniel, blz ?
Estou iniciando com o zend e tenho uma dúvida, como eu posso pegar os dados do usuário para verificar se ele esta logado ou não em outras páginas.
Exemplo: ele fez o acesso na página index através do login e senha, e possui a página produtos que irá listar os produtos daquele usuário, como faço para pegar os dados na classe ProdutosController.
Abs.
Daniel
13/05/2010 at 06:42
Oi Daniel, parabéns pelo blog pois vejo que todos estão se entendendo bem com seus artigos.
Sou iniciante em PHP e acho que vou ficar deprimido! hehehe…
É que já li tudo quanto é artigo e não consigo sair do zero. Estou mais perdido do que cego em tiroteio.
Tem alguma solução pra mim?! Estou precisando muito começar!
Abraço!
Daniel Developer
13/05/2010 at 15:25
Daniel,
O ideal seria de início um bom curso em PHP, verifique na sua cidade ou alguns cursos online. Após se familiarizar com o PHP, você já pode começar a estudar um CMS como o WordPress que é excelente e também o nosso framework Zend Framework, onde você encontrará bons artigos por aqui.
Abraços.
Daniel Developer
17/05/2010 at 13:30
Ricardo,
este artigo que escrevi pode lhe ajudar. http://www.danieldeveloper.com/2010/01/29/como-verificar-se-o-usuario-esta-logado-zend-framework/
abraços
Felipe Duardo
04/06/2010 at 04:25
Bom artigo daniel parabéns!
acho que você poderia cumprir com sua palavra!!! hehe
e fazer um artigo com o zend_acl, mas não daqueles tipos
tradução do manual que se ve muito por ai… e sim um
com resources e roles armazenados em um db…
estou nesse desafio . heehhe
abraço
Alessandro
23/06/2010 at 06:22
Muito bom!
Parabéns Daniel, excelente didática.
Exemplos muito bem construídos.
Apoio sua iniciativa de contribuir com os que buscam conhecer mais sobre Zend Framework.
Continue assim…
Emilio C. Rodrigues
30/06/2010 at 06:01
Olá. Parabéns pelo Blog. Esta matéria me ajudou muito! Eu estava quase desistindo de utilizar o ZF. Mas agora vou pegar mais firme nos estudos. Agradeço o exemplo e parabéns mais uma vez. Vlw o/
Daniel
07/07/2010 at 09:34
Daniel,
me tira uma duvida, sou novo em zend e nao estou conseguindo chamar o login.php. coloquei no meu index.phtml a chamada para a função login.php porem me avisa que o login.php nao foi encontrado dentro do servidor. Existe algo que deva configurar para ter acesso? como ficaria um html simples dessa chamada? tem algo peculiar? valeu fera
Daniel Developer
13/07/2010 at 05:24
Xará,
como está chamando o login.php e onde?
Eric
11/08/2010 at 04:15
Olá Daniel, bom dia.
Primeiramente gostaria de agradecer essa grande colaboração aos Developer.
Estou iniciando com Zend, segui todos os módulos que vc disponibilizou no seu blog, porém estou com algumas dúvidas ainda.
Neste post eu não consegui captar o diretório e nome que podem ser salvos os scripts :
Criando o formulário de login
Criando o AuthController
Se você tiver o projetinho e puder disponibilizar no post…
Forte abraço
Daniel Developer
13/08/2010 at 04:30
Eric,
geralmente os locais e nomes dos scipts ficam a critério de cada desenvolvedor. No meu Sample Project, ficam bem claras as formas como eu desenvolvo, tente se espelhar por lá, é uma boa prática de programação.
Abraços