2011-08-08 14 views
4

私の目的はJoomla ユーザ名パスワードが外部アプリケーションから有効であることを確認することです。ユーザーがシステムにログインしている必要はなく、アカウントが存在するだけです。 Joomla認証(JOOMLA_PATH/plugins/authentication/joomla)に基づいて独自の認証プラグインを作成することにしました。私はそれを呼び出すときJoomla 1.7外部アプリケーションからの認証

<?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); 

しかし:私はそれをtest_auth.phpと呼ばれる、

<?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'); 
     } 
    } 
} 

私は認証にアクセスするために、私のプラグインに1以上のファイルを追加し、それはこのように書きます:私は名前だけを変えました

Warning: Missing argument 1 for JPlugin::__construct(), called in C:\xampp\htdocs\joomla\plugins\authentication\Webservice\test_auth.php on line 25 and defined in C:\xampp\htdocs\joomla\libraries\joomla\plugin\plugin.php on line 57
Fatal error: Call to a member function attach() on a non-object in C:\xampp\htdocs\joomla\libraries\joomla\base\observer.php on line 41

私は間違っていますか? 私はjoomlaの外にあり、すべてのPHPスクリプトを置くことができ、require_once(JPATH_BASE .DS.'includes'DS.'defines.php ')などで動作すると思います。 または、プラグインを作成して、拡張機能利用できないjoomlaフレームワークでは苦労しません。しかし、実際には、define.phpとframework.phpを省略しても動作しません。

Joomla 1.7でプラグインを作成するためのガイドが役立つと思います。

+0

外部アプリケーションではどのような言語を使用していますか? 別のホストにありますか?あなたはJoomlaトークンについて認識していますか? – WooDzu

+0

こちらをご覧まったく同じ質問: http://stackoverflow.com/questions/2176595/joomla-login-authentication-from-external-app – WooDzu

+0

@WooDzu私の外部アプリがJoomlaのと同じホスト上にあり、私が使用してこのためのPHP。私はJoomlaトークンについて認識していません。これはまだjoomla 1.7で使用されていますか? –

答えて

4

[OK]を、私は完全に私の最初の試みを落とした。

代わりに、JOOMLA_ROOT/libraries/joomla/user/authentication.phpを使用します(JOOMLA_ROOT/libraries/joomla/application/application.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); 

私test_auth.phpは次のようになります!

EDIT:プラグインのインストールを終了しました。それはJoomla自身から呼び出されない単純な外部スクリプトです。私は単にそれをJoomlaのルートの新しいフォルダに移動しました。

+0

とはどのように動作していますか? – WooDzu

+0

正常に動作するようです。しかし、これが意図された方法であるかどうかはわかりません。いくつかのJoomlaのアップデートの後でこれは動作しますか?セキュリティはどうですか? –

+0

セキュリティは、資格情報をアプリケーションに渡す方法によって異なります – WooDzu

関連する問題