Joomla 1.7 Аутентификация из внешнего приложения - PullRequest
4 голосов
/ 08 августа 2011

Моя цель - убедиться, что Joomla имя пользователя и пароль действительны из моего внешнего приложения.Нет необходимости, чтобы пользователь входил в систему, просто существует его учетная запись.Я решил создать свой собственный плагин аутентификации на основе аутентификации Joomla (JOOMLA_PATH / plugins / authentication / joomla).Я только изменил имя:

<?php
/**
 * @version     $Id: joomla.php 21097 2011-04-07 15:38:03Z dextercowley $
 * @copyright   Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die;

jimport('joomla.plugin.plugin');

/**
 * Joomla Authentication plugin
 *
 * @package     Joomla.Plugin
 * @subpackage  Authentication.Webservice
 * @since 1.5
 */
class plgAuthenticationWebservice extends JPlugin
{
    /**
     * This method should handle any authentication and report back to the subject
     *
     * @access  public
     * @param   array   Array holding the user credentials
     * @param   array   Array of extra options
     * @param   object  Authentication response object
     * @return  boolean
     * @since 1.5
     */
    function onUserAuthenticate($credentials, $options, &$response)
    {
        jimport('joomla.user.helper');

        $response->type = 'Webservice';
        // Joomla does not like blank passwords
        if (empty($credentials['password'])) {
            $response->status = JAUTHENTICATE_STATUS_FAILURE;
            $response->error_message = JText::_('JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED');
            return false;
        }

        // Initialise variables.
        $conditions = '';

        // Get a database object
        $db     = JFactory::getDbo();
        $query  = $db->getQuery(true);

        $query->select('id, password');
        $query->from('#__users');
        $query->where('username=' . $db->Quote($credentials['username']));

        $db->setQuery($query);
        $result = $db->loadObject();

        if ($result) {
            $parts  = explode(':', $result->password);
            $crypt  = $parts[0];
            $salt   = @$parts[1];
            $testcrypt = JUserHelper::getCryptedPassword($credentials['password'], $salt);

            if ($crypt == $testcrypt) {
                $user = JUser::getInstance($result->id); // Bring this in line with the rest of the system
                $response->email = $user->email;
                $response->fullname = $user->name;
                if (JFactory::getApplication()->isAdmin()) {
                    $response->language = $user->getParam('admin_language');
                }
                else {
                    $response->language = $user->getParam('language');
                }
                $response->status = JAUTHENTICATE_STATUS_SUCCESS;
                $response->error_message = '';
            } else {
                $response->status = JAUTHENTICATE_STATUS_FAILURE;
                $response->error_message = JText::_('JGLOBAL_AUTH_INVALID_PASS');
            }
        } else {
            $response->status = JAUTHENTICATE_STATUS_FAILURE;
            $response->error_message = JText::_('JGLOBAL_AUTH_NO_USER');
        }
    }
}

Я добавил еще один файл в свой плагин для доступа к аутентификации, я назвал его test_auth.php и он выглядит так:

<?php
define('_JEXEC', 1 );
define('JPATH_BASE', 'C:\xampp\htdocs\joomla');
define( 'DS', DIRECTORY_SEPARATOR );

require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

include("Webservice.php"); 

$credentials = array(
    'username' => 'test',
    'password' => 'test');

$options = array();

$response = array();

$auth = new plgAuthenticationWebservice();
$auth->onUserAuthenticate($credentials, $options, &$response);

var_dump($response);

Нокогда я вызываю его, он получает следующие ошибки:

Предупреждение: отсутствует аргумент 1 для JPlugin :: __ construct (), вызываемого в C: \ xampp \ htdocs \ joomla \ plugins \ authentication \ Webservice \ test_auth.php в строке 25 и определяется в C: \ xampp \ htdocs \ joomla \ library \ joomla \ plugin \ plugin.php в строке 57
Неустранимая ошибка: вызов функции-члена attach () для необъекта в C: \ xampp \ htdocs \ joomla \ library \ joomla \ base \ наблюдатель.php в строке 41

Что я делаю не так?Я думаю, что я мог бы разместить все php-скрипты снаружи и независимо от joomla и работать с require_once (JPATH_BASE .DS.'include'.DS.'defines.php ') и т. Д. Или я мог бы написать плагин, установить его с помощью менеджера расширений ине будет бороться с недоступными рамками Joomla.Но на самом деле это не сработает, если я не укажу define.php и framework.php.

Я думаю, что руководство по созданию плагинов в Joomla 1.7 было бы полезно.

1 Ответ

4 голосов
/ 09 августа 2011

ОК, я полностью отбросил свою первую попытку.

Вместо этого я сейчас использую JOOMLA_ROOT / library / joomla / user / authentication.php (принадлежит JOOMLA_ROOT / library / joomla / application / application.php).

Мой test_auth.php теперь выглядит следующим образом:

<?php

define('_JEXEC', 1 );
define('DS', DIRECTORY_SEPARATOR);
define('JPATH_BASE', dirname(__FILE__) . DS . '..' . DS . '..' . DS . '..'); // assuming we are in the authorisation plugin folder and need to go up 3 steps to get to the Joomla root

require_once (JPATH_BASE .DS. 'includes' .DS. 'defines.php');
require_once (JPATH_BASE .DS. 'includes' .DS. 'framework.php');
require_once (JPATH_BASE .DS. 'libraries' .DS. 'joomla'. DS. 'user' .DS. 'authentication.php');

$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();

$credentials = array(
    'username' => 'test',
    'password' => 'test');

$options = array();

$authenticate = JAuthentication::getInstance();
$response   = $authenticate->authenticate($credentials, $options);

if ($response->status === JAUTHENTICATE_STATUS_SUCCESS) {
    echo('<br />It works<br />');
}
var_dump($response);

За любые улучшения я был бы глубоко признателен!

РЕДАКТИРОВАТЬ: я отклонил установку плагина.Это простой внешний скрипт, который не будет вызываться из самой Joomla.Я просто переместил его в новую папку в корне Joomla.

...