2009-07-24 27 views
13

Estoy tratando de ejecutar una aplicación fuera de Joomla (no como un complemento) y me gustaría acceder a la información del usuario conectado (ID de usuario). Me pregunto cómo debería hacerlo. ¿Hay algún archivo que pueda incluir? Intenté usar $ _SESSION pero se muestra vacío.Acceso a datos de sesión fuera de Joomla

¿Existe una solución simple a mi problema? Gracias por tu tiempo.

Respuesta

19

En realidad eso no es tan fácil como parece. Joomla usa su propio manejo de sesión con generación única de ID de sesión y alguna encriptación, por lo que la única forma de acceder a los datos de la sesión de Joomla es usar las funciones de Joomla apropiadas (como otros han sugerido). Recientemente tuve un proyecto en el que necesitábamos transferir un usuario autenticado de Joomla a una aplicación separada. Hicimos esto agregando un adaptador Joomla que ejemplifica las clases de usuarios de Joomla, lee los datos del usuario, coloca todo en una cookie encriptada y redirige a nuestra aplicación. Allí leemos la cookie encriptada, instanciamos nuestro propio objeto de usuario y descartamos la cookie. Como esto no es 100% seguro, estamos cambiando el sistema para escribir los datos del usuario en una tabla de base de datos y leerlos desde nuestra aplicación; evitamos la forma no segura a través de una cookie de esa manera, porque aunque la cookie está encriptada (y contiene información sensible del usuario que es suficiente para autenticar a un usuario) se transferirá por cable y se podrá inhalar.

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

El anterior es el script básico requerido para acceder a los recursos de Joomla.

+0

Me gustaría implementar este tipo de funcionalidad en CakePHP. El sitio basado en pasteles está alojado en un subdominio. ¿Crees que tu consejo se aplicaría a mi problema? – the0ther

+0

No conozco CakePHP y sus mecanismos de autenticación, pero creo que este enfoque podría funcionar en general, siempre que pueda transferir un identificador (una cookie en mi caso) de la aplicación 1 a la aplicación 2. Dado un subdominio, debería no hay problema en tener una cookie que se pueda leer tanto desde el subdominio como desde el dominio principal. –

+0

Perdón por la pregunta de novato, pero supongo que lo incluimos en un script PHP, en el directorio base de Joomla. – Jaryl

4

La solución es configurar la sesión para todo su dominio y/o sitio. Se aplica si intenta acceder a los datos de la sesión fuera del alcance de Joomla. Por ejemplo, si su sitio joomla está ubicado en http://example.com/joomla/ y su otro sitio en http://othersite.example.com/, la cookie que contiene la identificación de la sesión no se transmite desde joomla al otro sitio. Para modificar este comportamiento, use session_set_ cookie_ params antes de cada session_start() (no conozco muy bien joomla, pero debería tener que agregar solo unas líneas de código). Usarlo de esta manera:

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

86400 es el tiempo de vida de la sesión, ajuste a lo que usted prefiere (86400 es un día). '/' es la ruta de la cookie. Significa que si su sitio joomla está ubicado en http://example.com/joomla/, la cookie de sesión se seguirá enviando si el usuario tiene acceso a http://example.com/.

'.example.com' es el dominio. Tenga en cuenta el punto al principio, es muy importante. Dice que la cookie de sesión se enviará en cualquier subdominio de example.com. Si no lo escribe, la cookie se enviará solo para direcciones que comiencen con http://example.com/.

Esto debería resolver su problema, a menos que intente acceder a los datos de sesión de otro dominio. Si es el caso, deje un comentario aquí, voy a ver si puedo encontrar algo.

0

Es muy posible que, al igual que Wordpress, Joomla no utilice datos de "sesión", sino que extraiga datos directamente de la base de datos. En ese caso, necesitarías usar las funciones nativas de Joomla.

Pero eso es solo por mi experiencia con Wordpress.

Actualizado

supongo que estaba equivocada.
supposidly esta es la clase API para acceder a las variables de sesión Joomla:

// Devuelve una referencia al objeto global JSession, solamente crearlo si que no existe ya $ session = & JFactory: : getSession();

// Obtenga un valor de una sesión var $ value = $ session-> get ('var_name', null);

// Poner un valor en una sesión var $ session-> set ('var_name', $ value);

1

para obtener el ID de usuario que desee utilizar las funciones Joomlas:

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

le permitirá obtener el ID de usuario. sin embargo, necesitarás hacer esto dentro de la página de Joomla, así que no sé cómo te va a gustar.

+0

Esto es lo que hice. No pude averiguar cuál era el entorno mínimo que necesitaba configurar para tener acceso a las funciones de Joomla, así que solo mordí la viñeta y aprendí a escribir componentes. Son un poco raros, pero no tan malos una vez que te acostumbras. Entonces, al menos, puedes conseguir lo que quieras a través de la API de Joomla. – nedned

0

Puede ser útil ver cómo se logra esto en puentes de aplicación como jFusion. Sugiero al menos un complemento de sistema para Joomla, que utilizará las funciones de joomla para obtener todo lo que necesita de la instalación de joomla y enviar a su aplicación en ApplicationInitialize. ¡El problema más importante será su modelado de flujo de datos!

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

Para obtener Joomla usuario uso Identificación:

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

y para obtener usuario de la sesión uso Identificación:

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

La solución mostró por 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'); 

funciona bien, he pasado muchas noches intentando acceder al Joomla! recursos fuera de la carpeta joomla.

$session  = &JFactory::getSession(); 

En el código de seguimiento, funciona bien cuando el método getApplication se ha invocado.

Gracias por la solución.

1

aplicar esto en mod_login.php

Después: $user =& JFactory::getUser();

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

0

Supongo que por appl se refiere a otro sitio web. Su mejor opción es tener un iframe en esa aplicación instanciando el archivo de inicio de Joomla, obtener la identificación del usuario en ese iframe, almacenarla en algún lugar de la base de datos junto con su identificación de sesión actual, y luego recuperarla por la otra aplicación. Sin embargo, tomará un tiempo.

0

Pongo el código siguiente en Joomla index.php y funciona bien para mí.

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

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

Ahora puede utilizar variable de sesión fuera de Joomla como continuación

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

2

En primer lugar usted tiene que proporcionar la definición de las constantes de algunos joomla (identificadores) de la siguiente manera :

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

donde: JPATH_BASE representa el directorio raíz de su sitio. Debe ser correcto.

Después de que, usted tiene que utilizar archivos clave de la siguiente manera:

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

Después de que, usted tiene que crear un objeto de aplicación e inicializar también:

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

[esto es opcional] Si desea importar algunas otras bibliotecas, puede hacerlo de la siguiente manera:

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

Así que el núcleo co de su archivo es el siguiente:

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'); 
0

No puedo decir cómo Joomla con versiones anteriores 1.5 hace eso pero en Joomla 1.5 aquí es cómo se hace eso: (estoy seguro de otro procedimiento versiones es muy similar)

Joomla genera ID de sesión única para el front-end del sitio web y el back-end. Para acceder a los datos de la sesión, todo lo que necesita es conocer la identificación de la sesión.

En el archivo de configuración de Joomla no es un parámetro llamado "secreto"

Para back-end así es como se genera identificador de sesión:

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

y para la parte delantera:

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

Después de esto una consulta simple

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

le dará acceso a los datos de la sesión. Todo lo que necesita es descifrarlo con session_decode y los datos de la sesión estarán en $ _SESSION variable.

No se olvide de poner session_start antes session_decode de lo contrario no funcionará

Cuestiones relacionadas