[英]Accessing session data outside Joomla
我試圖在 Joomla 之外運行一個應用程序(不是作為插件),我想訪問登錄用戶的信息(用戶 ID)。 我想知道我該怎么做? 有我可以包含的文件嗎? 我嘗試使用 $_SESSION 但它顯示為空。
我的問題有簡單的解決方案嗎? 感謝您的時間。
事實上,這並不像聽起來那么容易。 Joomla 使用它自己的會話處理,帶有獨特的會話 ID 生成和一些適當的加密,因此進入 Joomla 會話數據的唯一方法是使用適當的 Joomla 功能(正如其他人所建議的那樣)。 我最近有一個項目,我們需要將經過 Joomla 身份驗證的用戶轉移到一個單獨的應用程序中。 我們通過添加一個 Joomla 適配器來實現這一點,該適配器實例化 Joomla 用戶類、讀取用戶數據、將所有內容放入加密的 cookie 中並重定向回我們的應用程序。 在那里我們讀取加密的 cookie,實例化我們自己的用戶對象並丟棄 cookie。 由於這不是 100% 安全,我們正在更改系統以將用戶數據寫入數據庫表並從我們的應用程序中讀取它 - 我們通過這種方式避免了通過 cookie 的不安全方式,因為即使 cookie 是加密的(並且包含足以對用戶進行身份驗證的敏感用戶信息)它將通過電匯傳輸並可能被嗅探。
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');
以上是訪問Joomla資源所需的基本腳本。
define( '_JEXEC', 1 );
define('JPATH_BASE', 'your joomla basedir goes here' );
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
JDEBUG ? $_PROFILER->mark( 'afterLoad' ) : null;
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
JPluginHelper::importPlugin('system');
JDEBUG ? $_PROFILER->mark('afterInitialise') : null;
$mainframe->triggerEvent('onAfterInitialise');
$user =& JFactory::getUser();
if ($user->guest) {
echo 'stuff';
//redirect('/');
} else {
echo 'user';
}
解決方案是為整個域和/或站點設置會話。 如果您嘗試訪問 joomla 范圍之外的會話數據,則它適用。 例如,如果您的 joomla 站點位於http://example.com/joomla/而您的其他站點位於http://othersite.example.com/則保存會話 ID 的 cookie 不會從 joomla 傳輸到另一個地點。 要修改此行為,請在每個 session_start() 之前使用 session_ set_ cookie_ params (我不太了解 joomla,但您應該只需要添加幾行代碼)。 以這種方式使用它:
session_set_cookie_params(86400, '/', '.example.com');
86400 是會話的生命周期,將其設置為您喜歡的(86400 是一天)。 '/' 是 cookie 的路徑。 這意味着如果您的 joomla 站點位於http://example.com/joomla/ ,則如果用戶訪問http://example.com/ ,會話 cookie 仍將被發送。
'.example.com' 是域。 注意開頭的點,這很重要。 它表示會話 cookie 將在 example.com 的任何子域上發送。 如果您不輸入,cookie 將僅針對以http://example.com/開頭的地址發送。
這應該可以解決您的問題,除非您嘗試從另一個域訪問會話數據。 如果是這樣,請在此處發表評論,我會看看是否可以找到一些東西。
首先,您必須為某些 joomla 的常量(標識符)提供定義,如下所示:
define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define( 'JPATH_BASE',$_SERVER['DOCUMENT_ROOT'].DS. basename(dirname(__DIR__)) );
其中: JPATH_BASE 代表您站點的根目錄。 它必須是正確的。
之后,您必須按如下方式使用密鑰文件:
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
之后,您必須創建一個應用程序對象並對其進行初始化:
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
[這是可選的] 如果你想導入一些其他的庫,那么你可以這樣做:
jimport( 'joomla.user.user');
jimport( 'joomla.session.session');
jimport( 'joomla.user.authentication');
所以你的文件的核心代碼如下:
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');
Stefan Gehrig展示的解決方案
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');
工作正常,我花了很多個漫長的夜晚試圖訪問 Joomla! joomla 文件夾外的資源。
$session = &JFactory::getSession();
在后續代碼中, getApplication
方法時工作正常。
感謝您的解決方案。
要獲取您需要使用 Joomlas 功能的用戶 ID:
$user =& JFactory::getUser();
$user->get('id');
會讓你得到用戶ID。 但是,您需要在 joomla 頁面內執行此操作,因此我不知道這對您有多大用處。
在mod_login.php
應用它
之后: $user =& JFactory::getUser();
echo "<p>Your usertype is {$user->usertype} which has a group id of {$user->gid}.</p>";
很可能像 Wordpress 一樣,Joomla 不使用任何“會話”數據,而是直接從數據庫中提取數據。 在這種情況下,您需要使用 Joomla 的本機功能。
但這只是根據我使用 Wordpress 的經驗。
更新
我想我錯了。
假設這是訪問 Joomla Session 變量的 api 類:
// 返回對全局 JSession 對象的引用,僅在它不存在時才創建它 $session = &JFactory::getSession();
// 從會話中獲取一個值 var $value = $session->get('var_name', null);
// 在會話中放入一個值 var $session->set('var_name', $value);
了解如何在 jFusion 等應用程序橋接中實現這一點可能會有所幫助。 我建議至少為 Joomla 安裝一個系統插件,它將使用 joomla 功能從 joomla 安裝中獲取您需要的一切,並在 ApplicationInitialize 上發送到您的應用程序。 最重要的問題將是您的數據流建模!
我把下面的代碼放在 Joomla index.php 中,它對我來說很好用。
//Set session to access it outside
$user =& JFactory::getUser();
$username = $user->get('username');
session_start();
$_SESSION['username'] = $username;
現在您可以在 Joomla 之外使用會話變量,如下所示
session_start();
$_SESSION['username'];
我不能告訴你的Joomla與上述版本1.5請問是怎么但是在1.5的Joomla這里是你如何做到這一點:(我相信對於其他版本的程序非常相似)
Joomla 為網站的前端和后端生成唯一的會話 ID。 要訪問會話數據,您只需要知道會話 ID。
在 joomla 配置文件中有一個名為“ secret ”的參數
對於后端,這是生成會話 ID 的方式:
$session_id = md5( md5( JConfig::$secret.'administrator' ) );
對於前端:
$session_id = md5( md5( JConfig::$secret.'site' ) );
在此之后一個簡單的查詢
mysql_query( 'SELECT `data` FROM jos_session WHERE session_id="'.$sessionId.'" )
將使您能夠訪問會話數據。 您只需要使用session_decode解密它,會話數據將在$_SESSION變量中。
不要忘了把在session_start前session_decode否則將無法正常工作
要獲取 Joomla 用戶 ID,請使用:
$user =& JFactory::getUser();
$user_id = $user->get('id');
並獲取用戶會話 ID 使用:
$session = & JFactory::getSession();
$session_id = $session->getId();
如果您將會話存儲在數據庫中,則可以按照以下注釋對會話數據進行解碼:
http://www.php.net/manual/en/function.session-decode.php#79244
Joomla 3 的解決方案,不使用任何庫。
require_once '../configuration.php'; // load Joomla configuration file
$jConfig = new \JConfig();
$secret = $jConfig->secret;
$dbprefix = $jConfig->dbprefix;
$cookieName = md5(md5($secret . 'site'));
$sessionId = $_COOKIE[$cookieName];
$sql = "select userid from {$dbprefix}session where client_id = 0 and session_id = ?";
$userId = $db->lookup($sql, [$sessionId]);
(上面的代碼是簡化的,沒有任何錯誤處理。)
我假設您所說的應用程序是指另一個網站。 最好的辦法是在該應用程序中使用 iframe 實例化 Joomla 啟動文件,在該 iframe 中獲取用戶 ID,將其與當前會話 ID 一起存儲在數據庫中的某個位置,然后由其他應用程序檢索它。 不過需要一些時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.