访问Joomla外部的会话数据

时间:2009-07-24 03:20:49

标签: php joomla

我正在尝试在Joomla之外运行一个应用程序(不是作为插件),我想访问登录用户的信息(userid)。我想知道我该怎么做呢?有没有我可以包含的文件?我尝试使用$ _SESSION,但它显示为空。

我的问题有一个简单的解决方案吗?谢谢你的时间。

15 个答案:

答案 0 :(得分:19)

实际上并不像听起来那么容易。 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资源所需的基本脚本。

答案 1 :(得分:8)

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

答案 2 :(得分:4)

解决方案是为整个域和/或站点设置会话。如果您尝试访问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/开头的地址。

除非您尝试从其他域访问会话数据,否则这应该可以解决您的问题。如果是这样的话,请在这里发表评论,我会看看我是否能找到一些东西。

答案 3 :(得分:2)

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方法时可以正常工作。

感谢您的解决方案。

答案 4 :(得分:2)

首先,您必须为某些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');

答案 5 :(得分:1)

获取用户ID,您需要使用Joomlas功能:

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

将允许您获取用户ID。但是你需要在joomla页面内做这个,所以我不知道如何使用你的帽子。

答案 6 :(得分:1)

mod_login.php

中应用此功能

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

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

答案 7 :(得分:0)

很可能像Wordpress一样,Joomla不使用任何“会话”数据,而是直接从数据库中提取数据。在这种情况下,您需要使用Joomla的本机函数。

但这只是我对Wordpress的体验。

<强>更新

我想我错了。
这是用于访问Joomla Session变量的api类:

  

//返回对全局的引用   JSession对象,只在创建它时   它还没有存在$ session =   &安培; JFactory ::的getSession();

     

//从会话变量中获取值   $ value = $ session-&gt; get('var_name',   空);

     

//在会话var中放置一个值   $ session-&gt; set('var_name',$ value);

答案 8 :(得分:0)

了解如何在jFusion等应用程序桥中实现这一目标可能会有所帮助。我建议至少为Joomla提供一个系统插件,它将使用joomla函数从joomla安装中获取所需的一切,并将其发送到应用程序onApplicationInitialize。最重要的问题是你的数据流建模!

答案 9 :(得分:0)

要使用Joomla用户ID:

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

并获取用户会话ID:

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

答案 10 :(得分:0)

如果您将会话存储在数据库中,则可以在此注释中解码会话数据:

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

答案 11 :(得分:0)

我认为应用程序是指另一个网站。最好的办法是在该应用程序中使用iframe实例化Joomla启动文件,在该iframe中获取用户ID,将其与当前会话ID一起存储在数据库中的某个位置,然后由其他应用程序检索它。虽然需要一些时间。

答案 12 :(得分:0)

我把下面的代码放在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'];

答案 13 :(得分:0)

我无法告诉你 Joomla 1.5以上版本是如何做到的但是 Joomla 1.5 这里是你如何做到的:(我相信其他版本的程序非常类似的)

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之前,否则它将无效

答案 14 :(得分:0)

无需使用任何库的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]);

(上面的代码已简化,没有任何错误处理。)