PDA

Zobacz pełną wersję : problem z getSession()



krzysztoff7
14-12-2012, 15:13
Witam.

Zmodyfikowałem odrobinkę szablon mojej stronki opartej na joomla tak, by podczas logowania wykonywany był (dzieki ajax) zewnętrzny skrypt php. W znacznym uproszczeniu skrypt ten wygląda tak:


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');
$mainframe->initialise();
$session =& JFactory::getSession();

$login = $_POST['login'];
$session->set('status', 1);
$session->set('login', $login);

Stworzyłem sobie jakiś przycisk przenoszący użytkownika do zrobionego przeze mnie panelu. W rzeczywistości jest to artykuł, który dzięki wtyczce sourcerer posiada kod php zamieszczony poniżej:



{source}
<?php
require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
$session =& JFactory::getSession();

$status = $session->get('status');
$login = $session->get('login');

echo "<p>login: " . $login . " status: " . $status . "</p>";
?>
{/source}


Po pierwszej próbie logowania wszystko jest ok. Panel wyświetla poprawną nazwę użytkownika. Po restarcie przeglądarki i ponownej próbie zalogowania, otrzymuję login który wpisałem poprzednio a nie ten aktualny. Dopiero po 15-minutach (taki czas trwania sesji mam ustawiony w joomla), mogę zalogować się na inny login. Co gorsze, kolega próbując logować się z całkowicie innego komputera również otrzymuje "MOJE" dane z sesji którą zainicjowałem ja.

Jeśli nie dojdę o co chodzi, prawdopodobnie będe próbował walczyć w sposób opisany tutaj:
http://forum.joomla.pl/showthread.php?65921-session_start()-i-problem-poza-komponentami

Może jednak ktoś z was zetknął się z czymś podobnym ?

P.S. session_handler mam ustawione na database.

pawelSafiStudio
14-12-2012, 17:33
Hmm... Ku czemu ma służyć ten skrypt? Przecież Joomla! ma wbudowany mechanizm logowania. Nie lepiej to wykorzystać, a następnie zamiast korzystać z JSession po prostu odwoływać się do &JFactory::getUser() ?

krzysztoff7
14-12-2012, 18:21
Ten skrypt nie korzysta z lokalnej bazy danych. Generalnie pomińmy sensowność tego co robię, swoją drogą, że wszystko już mam gotowe podczas gdy przy testach natknąłem sie na ten problem i naprawdę nie widzi mi sie przebudowywanie tego wszystkiego.

pawelSafiStudio
14-12-2012, 18:32
A ta wtyczka jest wywoływana z poziomu artykułu Joomla! czy jest to zewnętrzny plik?

krzysztoff7
14-12-2012, 18:33
tak jak juz pisałem:

P.S. session_handler mam ustawione na database.

pawelSafiStudio
14-12-2012, 18:36
Tak doczytałem wyżej, ale przed edycją już odpisałeś :) Zmienione pytanie jest wyżej.

krzysztoff7
14-12-2012, 18:39
wtyczka wywoływana z poziomu artykułu. Jak coś dostępna jest tutaj:
http://extensions.joomla.org/extensions/core-enhancements/coding-a-scripts-integration/custom-code-in-content/5051

żądany kod php/js/html umieszcza się miedzy tagami {source}...{/source}

pawelSafiStudio
14-12-2012, 18:43
Nigdy nie korzystałem z tego pluginu ale będę strzelał. Czy próbowałeś wykonać skrypt bez ponownej inicjacji aplikacji Joomla! ? Jeśli jest to wykonywane z poziomu artykułu to wymagane biblioteki powinny być już wczytane a aplikacja uruchomiona. Czyli kod zaczynamy od razu od $session = &JFactory::getSession().

krzysztoff7
14-12-2012, 18:54
Niestety pozbycie sie zbędnych linijek i rozpoczęcie kodu od:
$session = &JFactory::getSession(). Nic nie daje. W sumie próbowałem juz tak też.

pawelSafiStudio
14-12-2012, 19:10
Sprawdź w bazie danych jak zapisują się dane sesji. Spróbuj zalogować się z dwóch różnych przeglądarek.

krzysztoff7
14-12-2012, 21:48
https://dl.dropbox.com/u/1575961/Untitled.png
pierwsze 2 pozycje są spowodowane logowaniem przez mój skrypt. Ostatnia jest stworzona po zalogowaniu do panelu administracyjnego joomla (więc na 100% jest dobra). Nie wiem dlaczego kolumna data jest pusta. Widać też, że client_id = 0 w obu przypadkach pewnie dlatego ze guest = 1. Zastanawia mnie też dlaczego pierwsze logowanie przebiega prawidłowo i zwracane są jakieś dane ustawione wcześniej za pomocą:

$session->set('status', 1);
$session->set('login', $login);
skoro "data" jest puste (no chyba ze sie myle i to pole nie służy do tego)

pawelSafiStudio
17-12-2012, 08:29
Na Twoim miejscu jednak skorzystałbym z $_SESSION. W Twoim przypadku dwa razy ładujesz core Joomla!, co może powodować błędy. Usiadłem sobie w weekend i zrobiłem zapis danych do sesji z poziomu artykułu ale przy pomocy autorskiego pluginu i wszystko działa ok. Nie wiem jak z sourcerer bo nie uznaję takich dodatków. Jeśli masz debuggera to prześledź jak są przekazywane dane na każdym kroku działania Twojej aplikacji. Może wówczas wychwycisz jakiś błąd.

krzysztoff7
19-12-2012, 00:21
skorzystałem własnie z $_SESSION i sprawa wygląda następująco:
1) zmodyfikowałem nieco szablon strony by wyświetlał mi na samej górze identyfikator sesji (echo session_id();)
2) to samo zrobiłem dla formularza logowania (jakiś bajerancki jest więc wolałem się upewnić)
3) do pliku .php wywoływanego dzięki ajax w formularzu logowania również dałem echo session_id();
4) do artykułu za pomocą wtyczki sourcerer wstawiłem echo session_id();

moje spostrzeżenia:
session_id w 1 oraz 2 przypadku jest takie samo. Niestety w punkcie 3 oraz 4 zdaje sie tworzona jest całkowicie nowa sesja bo identyfikator jest zupełnie inny
przekazałem poprzez input type="hidden" w formularzu logowania identyfikator sesji do punktu 3 (czyli do pliku php który sprawdzi poprawnosć logowania) Dzięki temu już tylko w punkcie 4 mam jakiś inny identyfikator sesji i nadal mnie to blokuje. Być może w tym momencie już jakoś sobie poradzę dalej. Pytanie tylko czy coś wam to mówi ? Bo może jest jakiś "oczywisty" sposób na rozwiązanie tego problemu

ber32
23-01-2013, 20:33
Witam. Podpowiem coś do tematu może pomogę.
1. Radziłbym nie wysyłać $_POST w ten sposób może to doprowadzić do problemów.
2. Source jest puste nie przekazujesz tam loginu tak mi się wydaje i chyba tak jest.
3. Spróbuj w source wywołać samą sesję a potem przypisać do niej usera np. tak:


{source}
<?php
$sessi = JFactory::getSession();
$sesja_key = $sessi->getId();
?>
{/source}

powinno zadziałać.
4. Jak by czasem nie zadziałało choć wątpię to spróbuj przywołać sesję z bazy danych i pobierz to co potrzeba.

ber32
23-01-2013, 21:07
a i jeszcze jeden szczegół


jimport( 'joomla.session.session' );


i link http://docs.joomla.org/API15:JSession