2009-07-24 32 views
13

Tôi đang cố gắng chạy một ứng dụng bên ngoài Joomla (không phải là plugin) và tôi muốn truy cập thông tin người dùng đã đăng nhập (userid). Tôi tự hỏi làm thế nào tôi nên đi về làm điều đó? Có một tập tin mà tôi có thể đưa vào không? Tôi đã thử sử dụng $ _SESSION nhưng nó hiển thị trống.Truy cập dữ liệu phiên bên ngoài Joomla

Có giải pháp đơn giản nào cho vấn đề của tôi không? Cảm ơn bạn đã dành thời gian.

Trả lời

19

Thực ra điều đó không dễ như âm thanh. Joomla sử dụng xử lý phiên riêng của mình với việc tạo phiên id-id duy nhất và một số mã hóa tại chỗ, vì vậy cách duy nhất để lấy dữ liệu phiên Joomla là sử dụng các hàm Joomla thích hợp (như những người khác đã đề xuất). Gần đây tôi đã có một dự án mà chúng tôi cần chuyển một người dùng đã được xác thực thành một ứng dụng riêng biệt. Chúng tôi đã làm điều này bằng cách thêm một bộ điều hợp Joomla mà instantiates các lớp người dùng Joomla, đọc dữ liệu người dùng, đặt tất cả mọi thứ vào một cookie được mã hóa và chuyển hướng trở lại ứng dụng của chúng tôi. Trong đó chúng ta đọc cookie được mã hóa, khởi tạo đối tượng người dùng của riêng chúng ta và loại bỏ cookie. Vì điều này không an toàn 100%, chúng tôi đang thay đổi hệ thống để ghi dữ liệu người dùng trong một bảng cơ sở dữ liệu và đọc nó từ ứng dụng của chúng tôi - chúng tôi tránh cách không an toàn thông qua cookie theo cách đó, bởi vì mặc dù cookie được mã hóa (và chứa thông tin người dùng nhạy cảm đủ để xác thực người dùng) nó sẽ được chuyển trên dây và có thể bị ngửi.

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

Ở trên là tập lệnh cơ bản cần thiết để truy cập tài nguyên Joomla.

+0

Tôi muốn kéo loại chức năng này vào CakePHP. Trang web dựa trên bánh được lưu trữ trên tên miền phụ. Bạn có nghĩ lời khuyên của bạn sẽ áp dụng cho vấn đề của tôi không? – the0ther

+0

Tôi không biết CakePHP và các cơ chế xác thực của nó nhưng tôi nghĩ phương pháp này có thể hoạt động nói chung - miễn là bạn có thể chuyển mã định danh (cookie trong trường hợp của tôi) từ ứng dụng 1 sang ứng dụng 2. không có vấn đề gì khi có một cookie có thể được đọc từ tên miền phụ cũng như từ tên miền chính. –

+0

Xin lỗi cho câu hỏi noob, nhưng tôi giả sử chúng tôi đặt điều này trong một kịch bản PHP, trong thư mục cơ sở Joomla? – Jaryl

4

Giải pháp là đặt phiên cho toàn bộ tên miền và/hoặc trang web của bạn. Nó áp dụng nếu bạn đang cố gắng truy cập dữ liệu phiên bên ngoài phạm vi joomla. Ví dụ: nếu trang web joomla của bạn nằm trên http://example.com/joomla/ và trang web khác của bạn trên http://othersite.example.com/ thì cookie giữ id phiên không được truyền từ joomla đến trang web khác. Để sửa đổi hành vi này, hãy sử dụng session_ set_ cookie_ params trước mỗi session_start() (Tôi không biết joomla rất tốt, nhưng bạn chỉ nên thêm một vài dòng mã). Sử dụng theo cách này:

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

86400 là thời gian tồn tại của phiên, đặt nó theo ý bạn thích (86400 là một ngày). '/' là đường dẫn của cookie. Điều đó có nghĩa là nếu trang joomla của bạn nằm trên http://example.com/joomla/, cookie phiên sẽ vẫn được gửi nếu người dùng truy cập http://example.com/.

'.example.com' là tên miền. Lưu ý dấu chấm ở đầu, nó rất quan trọng. Nó nói rằng cookie phiên sẽ được gửi trên bất kỳ tên miền phụ nào của example.com. Nếu bạn không đặt, cookie sẽ chỉ được gửi cho các địa chỉ bắt đầu bằng http://example.com/.

Điều này sẽ giải quyết được vấn đề của bạn, trừ khi bạn đang cố truy cập dữ liệu phiên từ một tên miền khác. Nếu là vậy, để lại bình luận ở đây, tôi sẽ thấy nếu tôi tìm thấy thứ gì đó.

0

Rất có thể giống như Wordpress, Joomla không sử dụng bất kỳ dữ liệu 'phiên' nào, mà là kéo dữ liệu trực tiếp từ cơ sở dữ liệu. Trong trường hợp đó, bạn sẽ cần sử dụng các hàm gốc của Joomla.

Nhưng đó chỉ là trải nghiệm của tôi với Wordpress.

Cập nhật

Tôi đoán tôi đã sai.
Supposidly này là lớp api để truy cập các biến Joomla phiên:

// Trả về một tham chiếu đến đối tượng JSession toàn cầu, chỉ tạo ra nó nếu nó không tồn tại $ session = & JFactory: : getSession();

// Nhận giá trị từ một phiên var $ value = $ session-> get ('var_name', null);

// Đặt giá trị trong phiên var $ session-> set ('var_name', $ value);

1

để có được id người dùng mà bạn cần phải sử dụng chức năng Joomlas:

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

sẽ cho phép bạn có được ID người dùng. Tuy nhiên bạn sẽ cần phải làm điều này bên trong trang joomla vì vậy tôi không biết làm thế nào usefult mũ sẽ được cho bạn.

+0

Đây là những gì tôi đã làm. Tôi không thể tìm ra môi trường tối thiểu cần thiết để có thể truy cập vào các chức năng của Joomla, vì vậy tôi chỉ cần chút đạn và học cách viết các thành phần. Chúng hơi kỳ lạ, nhưng không quá tệ khi bạn bị treo nó. Sau đó, ít nhất, bạn có thể nhận được khá nhiều bất cứ điều gì bạn muốn thông qua Joomla API. – nedned

0

Nó có thể hữu ích để xem làm thế nào đạt được như vậy trong cầu ứng dụng như jFusion. Tôi đề nghị ít nhất một plugin hệ thống cho Joomla, mà sẽ sử dụng chức năng joomla để có được tất cả mọi thứ bạn cần từ việc cài đặt joomla và shipto ứng dụng của bạn onApplicationInitialize. Vấn đề quan trọng nhất sẽ là mô hình hóa luồng dữ liệu ur!

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

Để có được Joomla sử dụng id sử dụng:

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

và để có được sử dụng phiên id sử dụng:

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

Giải pháp cho thấy bởi 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'); 

hoạt động tốt, tôi đã dành nhiều đêm dài cố gắng truy cập vào Joomla! tài nguyên bên ngoài thư mục joomla.

$session  = &JFactory::getSession(); 

Trong mã tiếp theo, hoạt động tốt khi phương pháp getApplication đã được gọi.

Cảm ơn bạn đã giải pháp.

1

áp dụng điều này trong mod_login.php

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

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

0

Tôi cho rằng bằng ứng dụng ication bạn có nghĩa là một trang web khác. Đặt cược tốt nhất của bạn là có một khung nội tuyến trong ứng dụng đó khởi tạo tệp khởi động Joomla, lấy id người dùng trong iframe đó, lưu trữ nó ở đâu đó trong cơ sở dữ liệu cùng với id phiên hiện tại của bạn và sau đó lấy nó bằng ứng dụng khác. Sẽ mất một thời gian mặc dù.

0

Tôi đặt bên dưới mã trong Joomla index.php và nó hoạt động tốt cho tôi.

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

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

Bây giờ bạn có thể sử dụng biến session bên ngoài Joomla như sau

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

2

Trước hết bạn phải cung cấp định nghĩa hằng số của joomla (định danh) như sau :

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

trong đó: JPATH_BASE đại diện cho thư mục gốc của trang web của bạn. Nó phải chính xác.

Sau hơn, bạn phải sử dụng tập tin quan trọng như sau:

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

Sau hơn, bạn phải tạo một đối tượng ứng dụng và khởi tạo nó cũng:

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

[này là không bắt buộc] Nếu bạn muốn nhập một số thư viện khác, thì bạn có thể thực hiện việc này như sau:

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

Vì vậy, công cụ cốt lõi de cho tập tin của bạn như sau:

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

Tôi không thể cho bạn biết cách Joomla với các phiên bản trên 1.5 nào đó nhưng trong Joomla 1.5 đây là làm thế nào bạn làm điều đó: Tôi chắc chắn cho thủ tục các phiên bản khác (rất giống nhau)

Joomla tạo id phiên duy nhất cho front-end của trang web và back-end. Để truy cập dữ liệu phiên, tất cả những gì bạn cần là biết id phiên.

Trong file cấu hình joomla có một tham số gọi là "bí mật"

Đối với back-end đây là cách bạn tạo ra phiên id:

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

và cho kết thúc trước:

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

Sau một truy vấn đơn giản

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

sẽ cấp cho bạn quyền truy cập vào dữ liệu phiên. Tất cả những gì bạn cần là giải mã nó với session_decode và dữ liệu phiên sẽ ở trong biến số $ _SESSION.

Đừng quên đặt session_start trước session_decode nếu không nó sẽ không hoạt động

Các vấn đề liên quan