Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна

English version en

Была необходимость передать параметры сессии joomla размещенной в корневом домене mydomain.com на поддомен subdomain.mydomain.com.
Так как можно создать кукезы распространяющие свое действие на домен и поддомены - реализация получилась следующая:

Задача решилась в 3 этапа. Первый - получить SESSION ID и сохранить его в кукезы, второй - написать скрипт получающий и поддерживающий этот кукез в поддомене и третий - добавить вызов скрипта и обработать полученные данные сессии. Ниже все по порядку.

 

Код index.php вашего шаблона.

<?php 
$my_session_id = & JFactory::getSession()->getId();
setcookie("mycookies", $my_session_id, time() + 1800, "/", ".mydomain.com");
?>

Комментарий: Получаем SESSION ID от Joomla. В кукез "mycookies" пишем значение сессии (я использую изначальное время жизни 30 мин. Но исходя из дальнейшего кода, его можно установить минимальным (Даже 1 мин. хватит для перехода по ссылке в поддомен.), так как в дальнейшем сессии будет обновлять сторонний скрипт в поддомене). Важно поставить точку в левой части ".mydomain.com" - это определит распространение кукеза на все поддомены.
Код можно разместить в любой части вашего файла шаблона index.php 

 

Создание файла проверки авторизации.

Необходимо создать файл с именем "my_auth.php", разместить его лучше в корневой папке поддомена. Это позволит проще подключать его к нашим сторонним скриптам находящимся в поддомене.

<?php
$hostname = 'hosting.mysql.hoster.com';
$username = 'sql_username;
$password = 'sql_password';
$database = 'databaseName';

if(!isset($_COOKIE["mycookies"])) {
      $session_id = "none";
} else {
      $session_id = $_COOKIE["mycookies"];
}

if (!mysql_connect($hostname, $username, $password)) {return 'Error number: [] description: [Database - connection error]';}
if (!mysql_select_db($database)){return 'Error number: ['.mysql_errno().'] description: ['.mysql_error().']';}

$my_request = mysql_query("SELECT * FROM prefix_session WHERE session_id=\"$session_id\"");
$f = mysql_fetch_array($my_request);

if($f[username]){
      $RESULT = $f[username];
      setcookie("mycookies", $f[session_id], time() + 3600, "/", ".mydomain.com");
}else{
      $RESULT = "none";
}
?>

Комментарий: заменить все выделенные зеленым значения - на свои. Необходимо обеспечить скрипту возможность подключения к базе данных Joomla, для получения надлежащей информации по идентификатору сессии.
Значение "prefix" - это префикс ваших таблиц Joomla в базе данных. Это значение указывалось при установке Joomla.

 

Проверка авторизации в стороннем скрипте расположенном в поддомене.

В файле размещенном в том же домене или поддомене, где нам нужно проверить авторизацию, необходимо разместить следующий код:

<?php
include 'my_auth.php';
if($RESULT=='none'){
      echo 'User not authorized';
}else{
      echo 'Username: '.$RESULT;
}
?>

Комментарий: в любом месте кода достаточно будет выполнить "include 'my_auth.php';" (не забываем указать и путь, если файл не в той же папке) и проверить значение переменной $RESULT. Если переменная вернет "none" - значит пользователь не авторизован. Если вернет иное значение, то оно будет являться логином авторизованного пользователя.

Обращаясь к файлу "my_auth.php" скрипт автоматически продлевает срок жизни кукеза на установленное там время. Однажды получив кукез от Joomla скрипт может обновлять кукез сам не давая ему угаснуть и тем самым сессия пользователя в стороннем скрипте поддомена завершится лишь тогда, когда она завершится в joomla и запись о ней будет удалена из базы данных.

Данный пример был опробован в Joomla 3, но в любой иной версии достаточно получить SESSION ID (первая строка кода) и все будет работать по прежнему.

IP Information
Anonymous proxy