Aldeia Numaboa

  • Increase font size
  • Default font size
  • Decrease font size
Home Informática Tutoriais e Programação Joomla Plugin de Autenticação para o Joomla 1.5

Plugin de Autenticação para o Joomla 1.5

Indique esta página Imprimir PDF
(4 votos, média 5.0 de 5)

Joomla Os novos plugins de autenticação do Joomla 1.5 tornaram o sistema muito mais flexível e seguro. Agora é possível autenticar usuários das mais diversas origens - da base de dados interna do Joomla, do sistema Open ID, de um diretório LDAP, da base de dados do GMail ou qualquer outro sistema de autenticação que possa ser acessado usando PHP.

Neste tutorial veremos como criar um plugin de autenticação. É apenas um exemplo bem básico, com ênfase nos aspectos mais importantes... o assim chamado "caminho das pedras" para se criar um plugin personalizado.

A classe plgAuthenticationAutentica

Para criar um plugin Joomla 1.5 não precisamos começar do zero - basta usar a classe JPlugin como modelo. Quando criamos uma classe filha, ela herda todas as características da classe mãe. O novo objeto fornece toda a infraestrutura e todas as funcionalidades básicas e, a partir daí, só precisamos criar os métodos necessários para gerenciar o evento desejado.

Para criar um plugin de autenticação, o nome da classe filha precisa começar com plgAuthentication e terminar com o nome que você escolher. No nosso caso vamos usar o nome altamente criativo de Autentica sem graca, ou seja, nossa classe se chamará plgAuthenticationAutentica.

Esta classe terá dois métodos muito simples: constructor e onAuthenticate().

O construtor

O construtor precisa de um parâmetro, o qual deve ser passado por referência. Tudo o que o construtor faz é passar este parâmetro para o construtor da sua classe mãe. O nome deste método construtor é muito importante: deve ter o mesmo nome da classe. Veja abaixo:

function plgAuthenticationAutentica(& $ocorrencia) {
    parent::__construct( $ocorrencia );
}

O construtor da classe mãe vai nos fazer o favor de atrelar nosso observador de eventos (o plugin) à ocorrência (o despachador de eventos).

Lidando com o evento

Quando um usuário estiver se autenticando, queremos capturar e tratar este evento específico. Quando isto ocorre, o método que é chamado pelo sistema é o onAuthenticate(). Este método precisa de três parâmetros: nome do usuário, senha e uma referência a um objeto do tipo JAuthenticationResponse. Com estes parâmetros o método vai poder determinar se o nome do usuário e a senha são uma combinação válida e vai poder retornar o resultado obtido através do objeto JAuthenticationResponse.

Só a título de exemplo, a verificação de autenticidade que vamos fazer é muito simples. Vamos verificar se o nome do usuário consta na tabela de usuários e, caso tenha sido encontrado, vamos checar se a senha deste usuário é o nome dele ao contrário. Veja a seguir:

$db =& JFactory::getDBO();
$query = 'SELECT `id`'
    . ' FROM #__users'
    . ' WHERE username=' . $db->quote( $nome );
$db->setQuery( $query );
$resultado = $db->loadResult();
 
// para autenticar, o nome do usuário precisa estar na base de dados e a
// senha precisa ser o nome ao contrário (usuário maria teria a senha airam)
if($resultado && ($nome == strrev( $senha )))

Este código bobinho pode ser substituído por um mais parrudo, com uma autenticação mais consistente. Só depende de você e dos seus conhecimentos de PHP sorriso

Depois de determinarmos o que ocorreu com a autenticação podemos criar respostas de acordo com o resultado:

$db =& JFactory::getDBO();
$query = 'SELECT `id`'
    . ' FROM #__users'
    . ' WHERE username=' . $db->quote( $nome );
$db->setQuery( $query );
$resultado = $db->loadResult();
 
if (!$resultado) {
    $resposta->status = JAUTHENTICATE_STATUS_FAILURE;
    $resposta->error_message = 'Usuário não existe';
}
// para autenticar, o nome do usuário precisa estar na base de dados e a
// senha precisa ser o nome ao contrário (usuário maria teria a senha airam)
if($resultado && ($nome == strrev( $senha )))
{
    $email = JUser::getInstance($resultado); // Alinhar com o resto do sistema
    $resposta->email = $email->email;
    $resposta->status = JAUTHENTICATE_STATUS_SUCCESS;
}
else
{
    $resposta->status = JAUTHENTICATE_STATUS_FAILURE;
    $resposta->error_message = 'Nome e senha inválidos';
}

Para as falhas, definimos duas propriedades do objeto resposta: as propriedades status e error_message. Existem três valores de status que são reconhecidos - JAUTHENTICATE_STATUS_SUCCESS, JAUTHENTICATE_STATUS_FAILURE e JAUTHENTICATE_STATUS_CANCEL. Para maiores informações sobre valores de status consulte a biblioteca libraries/joomla/user/authentication.php.

A propriedade error_message é definida caso a autenticação falhe. No nosso plugin determinamos dois valores possíveis: 'Usuário não existe', que indica que o usuário não foi encontrado na base de dados, e 'Nome e senha inválidos', indicando que a senha não é o inverso do nome. Por uma questão de segurança, o usuário só vai receber a mensagem 'Nome e senha inválidos' ou logar sem receber mensagem alguma. O Joomla pode ser configurado para que estas mensagens de erro sejam colocadas num arquivo de log para facilitar o debug.

Opcionalmente, se a autenticação funcionar, podemos colocar informações da nossa fonte de autenticação na resposta. Neste exemplo estamos buscando informações do usuário na base de dados do Joomla e guardando seu endereço de email no objeto resposta. Para mais informações sobre o tipo de dado que pode ser colocado num objeto resposta consulte a API do Joomla. Estes dados podem ser usados quando se quiser criar usuários automaticamente ou realizar outras tarefas de login.

O código completo

Definidos os dois métodos que são necessários para a nossa classe, podemos colocá-la num arquivo PHP que tenha o mesmo nome do plugin. Como o plugin foi chamado de Autentica, o arquivo receberá o nome de autentica.php. Segue a listagem completa do código:

autentica.php
<?php /** * @version $Id: myauth.php 7180 2007-04-23 16:51:53Z jinx $ * @package Joomla.Tutorials * @subpackage Plugins * @license GNU/GPL */   // Check to ensure this file is included in Joomla! defined('_JEXEC') or die();   jimport('joomla.event.plugin');   /** * Examplo de Plugin de Autenticação. Baseado no plugin example.php instalado junto com o Joomla * * @package Joomla.Tutorials * @subpackage Plugins * @license GNU/GPL */ class plgAuthenticationAutentica extends JPlugin { /** * Construtor * * @param object $subject The object to observe * @since 1.5 */ function plgAuthenticationAutentica(& $ocorrencia) { parent::__construct($ocorrencia); }   /** * Este método deve gerenciar a autenticação e dar avisos * Este exemplo usa uma autenticação simples - checa se a senha é o reverso * do nome do usuário (e se o usuário está na base de dados). * * @access public * @param string $nome Nome do usuário * @param string $senha Senha * @param object $resposta Objeto resposta da autenticação * @return boolean * @since 1.5 */ function onAuthenticate( $nome, $senha, &$resposta ) { /* * Aqui ficam as rotinas de autenticação que usam as credenciais * * Neste exemplo, a variável $return será falsa se a rotina de * autenticação falhar ou terá a ID do usuário se ele for aceito */ $db =& JFactory::getDBO(); $query = 'SELECT `id`' . ' FROM #__users' . ' WHERE username=' . $db->quote( $nome ); $db->setQuery( $query ); $resultado = $db->loadResult();   if (!$resultado) { $resposta->status = JAUTHENTICATE_STATUS_FAILURE; $resposta->error_message = 'Usuário não existe'; } // para autenticar, o nome do usuário precisa estar na base de dados e a // senha precisa ser o nome ao contrário (usuário maria teria a senha airam) if($resultado && ($nome == strrev( $senha ))) { $email = JUser::getInstance($resultado); // Alinhar com o resto do sistema $resposta->email = $email->email; $resposta->status = JAUTHENTICATE_STATUS_SUCCESS; } else { $resposta->status = JAUTHENTICATE_STATUS_FAILURE; $resposta->error_message = 'Nome e senha inválidos'; } } } ?>

Note que, no início do código, importamos a definição da classe JPlugin com:

jimport('joomla.event.plugin');

O manifesto de instalação XML

O arquivo de instalação XML indica como o programa instalador do Joomla deve proceder. Neste caso, é bastante simples:

autentica.xml
<?xml version="1.0" encoding="utf-8"?> <install version="1.5" type="plugin" group="authentication"> <name>Authentication - Autentica</name> <author>Joomla! Documentation Project</author> <creationDate>May 30, 2007</creationDate> <copyright>(C) 2005 - 2007 Open Source Matters. All rights reserved.</copyright> <license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license> <authorEmail>ian.maclennan @help.joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>1.5</version> <description>An sample authentication plugin</description> <files> <filename plugin="autentica">autentica.php</filename> </files> <params/> </install>

Esta é praticamente a cópia do arquivo xml do exemplo do Joomla. Observe apenas alguns detalhes.

  • O atributo grupo do elemento raiz: para plugins de autenticação, o atributo grupo precisa ter o valor 'authentication'. Isto faz com que o Joomla trate o plugin como um plugin de autenticação.
  • O atributo versão do elemento raiz: 1.5 indica que se trata de um plugin escrito para Joomla 1.5 que deve funcionar sem o modo legado.
  • O nome 'Authentication - Autentica': você NÃO precisa seguir esta convenção de nome, mas fica melhor no gerenciador de plugins quando se segue o padrão.
  • O atributo filename: este tem um atributo chamado plugin, cujo valor é o nome do nosso plugin (plugin="autentica").

Isto é tudo! Agora é só zipar os dois arquivos (autentica.php e autentica.xml) para criar um pacote de instalação automática. O texto original deste HOWTO você encontra documentação online do Joomla 1.5.

Grande abraço

vovo Vicki vó Vicki

Atualização Sex, 26.06.2009 14:25  

Na Aldeia

Há 102 visitantes online

3632 registros
2 hoje
16 nesta semana
6 neste mês

Boas vindas: lacnes

Estatística

Membros: 3641
Artigos: 1045
Links: 90
Leituras: 6685884

Login

Kanji da hora




Faça contato







Não diga que não avisei ===> No Internet Explorer o meu site fica uma porcaria. Use qualquer outro navegador, porque não tenho tempo e nem paciência para ficar remendando todas as páginas só para atender as sandices do pessoal da microsoft. Que tal experimentar o Firefox, o Opera, o Chrome ou o Safari?