Joomla dışında oturumu verilerine erişme

13 Cevap php

Ben Joomla (bir eklenti olarak) dışında bir uygulamayı çalıştırmak için çalışıyorum ve kullanıcının bilgisi (userid) kaydedilir erişmek istiyorum. Ben nasıl bunu yaparken hakkında gitmeli merak ediyorum? Ben dahil bir dosya var mı? Ben $ _SESSION kullanarak çalıştı ama boş gösteriyor.

Benim soruna basit bir çözüm var mı? Zaman ayırdığınız için teşekkür ederiz.

13 Cevap

Aslında bu göründüğü kadar kolay değil. Eşsiz session-id-nesil ve yerde bazı şifreleme gelir ile Joomla kendi oturum yönetimini kullanır, bu nedenle Joomla oturum verilerine girmek için tek yol (diğerleri önerilen gibi) uygun Joomla işlevlerini kullanmaktır. Ben son zamanlarda biz ayrı bir uygulama içine Joomla doğrulanmış kullanıcının aktarmak için gerekli bir proje vardı. Biz, Joomla kullanıcı sınıflarını başlatır kullanıcı verilerini okur, şifrelenmiş bir tanımlama içine her şeyi koyar ve bizim uygulama geri yönlendirir bir Joomla adaptörü ekleyerek yaptım. Orada biz şifreli çerez okuma, kendi kullanıcı nesne örneğini ve çerez atın. Biz çerez şifreli olsa bile (ve içerdiğinden yolu, bir çerezi ile güvensiz yol kaçının - bu bir veritabanı tablosunda kullanıcı veri yazmak ve uygulama okumak için sistemi değiştirerek konum% 100 güvenli değil gibi ) bir kullanıcının kimliğini doğrulamak için yeterli duyarlı kullanıcı bilgileri tel üzerine transfer olacak ve kokladı olabilir.

define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(dirname(__FILE__)));
define( 'DS', DIRECTORY_SEPARATOR );

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

$mainframe = JFactory::getApplication('site');

Yukarıdaki Joomla kaynaklara erişmek için gerekli temel yazısıdır.

Çözüm tüm etki ve / veya site için oturumu ayarlamaktır. Eğer joomla kapsam dışında oturumu verilerine erişmek için çalışıyoruz eğer geçerlidir. Örneğin, joomla site http://example.com/joomla/ üzerinde bulunan ve üzerinde diğer site http://othersite.example.com/ daha sonra session id tutan çerez diğer siteye joomla iletilir değilse. Bu davranışı değiştirmek before every session_start() session_ set_ cookie_ params'ı kullanabilirsiniz (ben çok iyi joomla bilmiyorum, ama sen kod sadece birkaç satır eklemek olmalıdır) için. Bu şekilde kullanın:

session_set_cookie_params(86400, '/', '.example.com');

86400 is the lifetime of the session, set it to what you prefer (86400 is one day). '/' is the path of the cookie. It means that if your joomla site is located on http://example.com/joomla/ , the session cookie will still be sent if the user accesses http://example.com/ .

'. Example.com' etki alanıdır. Başında noktayı unutmayın, bu çok önemli. Bu oturum tanımlama example.com herhangi bir alt etki gönderilecektir diyor. Eğer koymazsanız, çerez sadece http://example.com/ ile başlayan adresler için gönderilecektir.

Eğer başka bir etki alanından oturum verilerini erişmeye çalıştığınız sürece bu sorunu çözmek gerekir. Bu durum buysa, ben bir şey bulmak cand olmadığını görürsünüz, burada bir yorum bırakın.

Çözelti Stefan Gehrig ile gösterdi

define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(dirname(__FILE__)));
define( 'DS', DIRECTORY_SEPARATOR );

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

$mainframe = JFactory::getApplication('site');

çalışıyor, ben erişim Joomla çalışan birçok uzun gece geçirdim! joomla klasörü dışında kaynaklar.

$session     = &JFactory::getSession();

Takip kodu, getApplication yöntem çağrılır edildiğinde çalışıyor.

Çözüm için teşekkürler.

Aşağıdaki gibi bazı Joomla'nın sabitleri (betimleyici) tanım sağlamak için her şeyden önce:

define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define( 'JPATH_BASE',$_SERVER['DOCUMENT_ROOT'].DS. basename(dirname(__DIR__)) );

JPATH_BASE sitenizin kök dizini temsil edilir: nerede. Bu doğru olmalıdır.

Sonra yerine, aşağıdaki gibi anahtar dosyaları kullanmak zorunda:

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

Sonra daha bir uygulama nesne oluşturmak ve aynı zamanda başlatmak zorunda:

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

Bazı diğer kütüphaneler almak istiyorsanız, o zaman aşağıdaki gibi yapabilirsiniz [Bu isteğe bağlıdır]:

jimport( 'joomla.user.user');
jimport( 'joomla.session.session');
jimport( 'joomla.user.authentication');

Aşağıdaki gibi Yani dosya için çekirdek kodu:

define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define( 'JPATH_BASE',$_SERVER['DOCUMENT_ROOT'].DS. basename(dirname(__DIR__)) );

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

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

//optional use depend on requirement 
jimport( 'joomla.user.user');
jimport( 'joomla.session.session');
jimport( 'joomla.user.authentication');

kullanıcı kimliği almak için Joomlas işlevleri kullanmak gerekir:

$user =& JFactory::getUser();
$user->get('id');

Eğer kullanıcı kimliği almanızı sağlayacaktır. i usefult şapka sizin için nasıl olacak bilmiyorum bu yüzden ancak joomla sayfanın bu içini yapmak gerekir.

Bu uygulamak mod_login.php

After: $user =& JFactory::getUser();

echo "<p>Your usertype is {$user->usertype} which has a group id of {$user->gid}.</p>";

Ben Joomla index.php kod altına koymak ve bu benim için iyi çalışıyor bulunuyor.

//Set session to access it outside
$user =& JFactory::getUser();
$username = $user->get('username');

session_start();
$_SESSION['username'] = $username;

Şimdi aşağıdaki gibi Joomla dışında oturum değişkeni kullanabilirsiniz

session_start();
$_SESSION['username'];

Bu Wordpress gibi, Joomla herhangi bir 'oturum' verileri kullanmak değil, aksine doğrudan veritabanından veri çeker olması çok mümkündür. Bu durumda Joomla'nın doğal işlevleri kullanmak gerekir.

Ama bu sadece Wordpress ile benim deneyim olduğunu.

Updated

I guess I was wrong.
Supposidly this is the api class for accessing Joomla Session variables:

// Returns a reference to the global JSession object, only creating it if it doesn't already exist $session = &JFactory::getSession();

// Get a value from a session var $value = $session->get('var_name', null);

// Put a value in a session var $session->set('var_name', $value);

Böyle jFusion gibi uygulama köprüleri nasıl sağlandığını görmek için yararlı olabilir. Ben yüklemek joomla ihtiyaç ve uygulama onApplicationInitialize shipto her şeyi almak için joomla fonksiyonları kullanacağız Joomla için en az bir sistem eklentisi, öneririz. En önemli konu ur veri akışı modelleme olacak!

Joomla kullanıcı kimliği kullanmak almak:

$user =& JFactory::getUser();
$user_id = $user->get('id');

ve kullanıcı oturum kimliği kullanmak almak için:

$session = & JFactory::getSession();
$session_id = $session->getId();

Eğer veritabanında oturumları saklamak, bu açıklama olarak oturum verileri deşifre olabilir:

http://www.php.net/manual/en/function.session-decode.php#79244

Ben uygulama tarafından başka bir web sitesi demek olduğunu varsayalım. Yapabileceğiniz en iyi şey, Joomla başlangıç ​​dosyasını başlatmasını bu uygulama bir iframe var iframe kullanıcı kimliği almak, geçerli oturum kimliği ile birlikte bir yerde veritabanında depolamak ve daha sonra başka bir uygulama tarafından geri almak için. Ama biraz zaman alacaktır.

(Çok benzer diğer sürümleri prosedür için eminim): Ben nasıl Joomla 1.5 yukarıda sürümleri ile o yapar ama içinde Joomla 1.5 burada yapmanız nasıl söyleyemem

Joomla generates Unique session id for front-end of the website and back-end. To access session data all you need is know the session id.

Joomla yapılandırma dosyasındaki "secret" adlı bir parametre yok

Arka uç için bu session id oluşturmak nasıl:

$session_id = md5( md5( JConfig::$secret.'administrator' ) );

ve ön ucu için:

$session_id = md5( md5( JConfig::$secret.'site' ) );

Bu basit bir sorgulama sonra

mysql_query( 'SELECT `data` FROM jos_session WHERE session_id="'.$sessionId.'"  )

will give you access to session data. All you need is to decrypt it with session_decode and session data will be in $_SESSION variable.

session_decode, aksi takdirde çalışmaz önce session_start koymak unutma