PDA

Просмотр полной версии : Механизм и концепция авторизации пользователей на сайте ("в ручную")


Ивано
12.10.2012, 13:49
В google нашел коды для ручной авторизации пользователя:

$check = FALSE;
$loginData = array(
'username' => "user",
'uident_text' => "pass",
'status' => 'login',
);

$GLOBALS['TSFE']->fe_user->checkPid = ''; //do not use a particular pid
$info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$info['db_user']['checkPidList'] = 1;
$info['db_user']['check_pid_clause'] = 'AND pid IN(362)';
$user = $GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'], $loginData['username']);



$login_success = $GLOBALS['TSFE']->fe_user->compareUident($user,$loginData);

#Если пользователь найден
if($login_success){

$GLOBALS['TSFE']->fe_user->createUserSession($user);
$GLOBALS["TSFE"]->fe_user->loginSessionStarted = TRUE;
$GLOBALS ["TSFE"] ->fe_user->start();

}

В результате его работы он находим у меня пользователя с заданными логином и паролем и заносит данные в mysql-таблицу fe_sessions
Но почему при перезагрузке страницы $GLOBALS["TSFE"]->loginUser = 0;

Как работать с концепцией авторизации пользователь на основе API typo3.
И правильно ли понимаю что $GLOBALS["TSFE"]->loginUser в единицу нужно устанавливать самостоятельно,
через постоянную проверку где-то вверху кода программы, а также группу пользователя также необходимо проверять каждый раз при перезагрузке страницы?

Также пробовал на Wininstaller typo3 пакет Inducation.
Авторизовался в системе - авторизация прошла успешно - но $GLOBALS["TSFE"]->loginUser упорно равен 0!

Ивано
12.10.2012, 18:20
Так понимаю что после сохранения сессии в БД выше приведенных кодом, необходимо проверять статус залогиннинности пользователя следующим кодом на каждой странице и там где требуется в контенте:

$user = tslib_eidtools::initFeUser();
$GLOBALS['TSFE']->loginUser = $user ? 1 : 0;
$GLOBALS['TSFE']->fe_user = $user;

:confused:

dmartynenko
12.10.2012, 20:05
Так понимаю что после сохранения сессии в БД выше приведенных кодом, необходимо проверять статус залогиннинности пользователя следующим кодом на каждой странице и там где требуется в контенте

Нет, вызывать tslib_eidtools::initFeUser() не нужно.

Эта функция только для eID скриптов (там кстати нет $GLOBALS['TSFE'], поэтому присвоение чего-то $GLOBALS['TSFE']-> бессмысленно и приедет к warning).

В FE плагинах можно просто проверить $GLOBALS['TSFE']->loginUser, он будет уже инициализирован на момент вызова вашего плагина.

dmartynenko
12.10.2012, 20:08
Что касается ручного логина в коде - а "обычный" у вас работает?
Если и он не работает, может быть проблема с сохранением кук в броузере, или с привязкой созданных кук к правильному домену.

Ивано
12.10.2012, 20:56
Обычный работает.
Данный код у меня успешно работает только в google chrome.
Opera и IE - не сохраняют как понимаю сессию.
Суть кода - выводится форма авторизации пользователя если не залогинен и наоборот - если залогинин выводится формы выхода.

<?php

require_once(PATH_tslib.'class.tslib_pibase.php');

class tx_gregre2_pi1 extends tslib_pibase {
var $prefixId = 'tx_gregre2_pi1'; // Same as class name
var $scriptRelPath = 'pi1/class.tx_gregre2_pi1.php'; // Path to this script relative to the extension dir.
var $extKey = 'gregre2'; // The extension key.
var $pi_checkCHash = true;


function main($content, $conf) { global $_SERVER, $_POST;
$this->conf = $conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();


//Если переданны POST_данные
if ($_POST['autoriz'] == true)
{


$check = FALSE;
$loginData = array(
'username' => $_POST['loging'],//"userz",
'uident_text' => $_POST['password'], //"pass",
'status' => 'login',
);

$GLOBALS['TSFE']->fe_user->checkPid = FALSE; //do not use a particular pid
$info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$info['db_user']['checkPidList'] = 1;
$info['db_user']['check_pid_clause'] = 'AND pid IN(457)';
$user = $GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'], $loginData['username']);


#$BE_USER->writelog(255,2,0,1,'User %s logged out from TYPO3 Backend',Array($BE_USER->user['username'])); // Logout written to log
#$BE_USER->logoff();
#header('Location: '.t3lib_div::locationHeaderUrl(t3lib_div::_GP('red irect')?t3lib_div::_GP('redirect'):'index.php'));

$login_success = $GLOBALS['TSFE']->fe_user->compareUident($user,$loginData);
if($login_success){

#$GLOBALS['TSFE']->fe_user->createUserSession($user);
#$GLOBALS['TSFE']->fe_user->start();
#$GLOBALS['TSFE']->loginUser = 1;

$GLOBALS["TSFE"]->fe_user->createUserSession($user);
$GLOBALS["TSFE"]->fe_user->loginSessionStarted = TRUE;
# $GLOBALS["TSFE"]->fe_user->user = $GLOBALS["TSFE"]->fe_user->fetchUserSession();
$GLOBALS ["TSFE"] ->fe_user->start();
#$GLOBALS ["TSFE"] ->loginUser = 1;

#return 1;


$user = tslib_eidtools::initFeUser();
$GLOBALS['TSFE']->loginUser = $user ? 1 : 0;
$GLOBALS['TSFE']->fe_user = $user;


}

#print_r($_POST);
}


//Если переданны POST_данные - на выход и разрыв сессии
if ($_POST['logingout'] == true)
$GLOBALS['TSFE']->fe_user->logoff();


if ( $GLOBALS['TSFE']->loginUser == 1 )
{
$content = "Вы авторизированны <form method='post'><input type='submit' name='logingout' value='Выйти из системы'></form>
<h4>Информация о пользователе</h4><pre>";
}
else
{
$content='Вы не авторизированны!<hr><form method="post">
<input name="loging" type="text"><br />
<input name="password" type="text"><br />
<input type="submit" name="autoriz" value="Авторизироваться"></form>';
}



return $this->pi_wrapInBaseClass($content);
}
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/gregre2/pi1/class.tx_gregre2_pi1.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/gregre2/pi1/class.tx_gregre2_pi1.php']);
}

?>

Во всех браузерах сессии создаются в таблице fe_sessions.
Так понимаю это проблема в cookie - как можно их подправить?

Ивано
12.10.2012, 21:05
Хотя нет - причина в том, что данные не пишутся в таблицу fe_session!

Ивано
12.10.2012, 21:12
Поменял на вот этот код и все заработало - сессии создаются...

$GLOBALS["TSFE"]->fe_user->user = $GLOBALS["TSFE"]->fe_user->fetchUserSession();
$GLOBALS['TSFE']->loginUser = 1;
$GLOBALS['TSFE']->fe_user->start();
$GLOBALS["TSFE"]->fe_user->createUserSession($user);
$GLOBALS["TSFE"]->fe_user->loginSessionStarted = TRUE;

Единственное что осталось - это если закрыть браузер сессия разрывается.
Необходима кнопка запомнить.

Ивано
12.10.2012, 22:00
В стандартной форме почему-то не работает:
"Display Remember Login Option"
(Показать параметр о запоминании авторизации)

Dmitry Dulepov
15.10.2012, 16:16
Скажите, что именно вы хотите сделать. Возможно, мы скажем вам – как :)

Ивано
17.10.2012, 22:33
В общем научился работать с сессиями для анонимных пользователей и авторизированных пользователей (прочитал здесь - http://www.koller-webprogramming.ch/tipps-tricks/typo3-extension-entwicklung/arbeiten-mit-sessions/). С удивлением узнал, что если на любой странице передать через post user, pass и pid-хранилища записей пользователей - то произойдет аудентификация пользователя без всяких расширений и прочего.

С сессиями работаю так:

$typesess = ($GLOBALS['TSFE']->loginUser == 1 ? 'user' : 'ses');
$sessionData = $GLOBALS['TSFE']->fe_user->getKey($typesess, 'tx_test_pi1');


$sessionData['test'] = "Hellow Word";

//Перезаписваем сессию (обновляем "Данные в ДАТА")
$GLOBALS['TSFE']->fe_user->setKey($typesess, 'tx_test_pi1', $sessionData);
$GLOBALS['TSFE']->fe_user->sesData_change = 1;
$GLOBALS['TSFE']->fe_user->storeSessionData();


Единственное что не могу понять, так как сделать так, что бы после входа в систему на основе кода который привожу в начале данной темы - запомнить этот вход на всегда... Т.е. что бы браузер закрыл и открыл и не приходилось входить по новой (аналог кнопки "Запомнить пароль").

dmartynenko
18.10.2012, 12:00
Посмотрите системное расширение felogin, с удивлением узнаете что для формы логина не надо делать свой экст :)

И если в дополнение к user/pass передать permalogin=1, то логин будет сохраненным (как долго его ярдо запомнит, задается кажется в localconf.php). Причем все это можно передевать как GET, так и POST - все равно ядро пользователя авторизует.

Ивано
18.10.2012, 12:40
Подобное решение мне очень даже подходит и готов даже и не использовать выше описанный код (он даже и не нужен)...
Но есть одно НО.

Вот форму создаю:

<form>

<input name="user">
<input name="pass">
<input name="permalogin" type="hidden" value=1> - запомнить вход пользователя (даже после закрытия открытия браузера)
<input name="pid" type="hidden" value="id-хранилища записей пользователя">
<input type="hidden" name="logintype" value="login" />

И есть еще один параметр котрый , как понимаю, можно передать через hidden - это "redirect_url"
Как понимаю - он должен перенаправить на указанную страницу
в случае успешной авторизации (или возможно буду не прав) --- НО ОН У МЕНЯ ПОЧЕМУ-то не срабатывает - вход в систему есть, а ридеректа нет на заданную страницу...
<input name="redirect_url" type="hidden" value="/index.php?id=303">

Как им возможно воспользоваться или такого параметра нет?:confused:

</form>

dmartynenko
18.10.2012, 13:01
Вот как раз redirect_url и прочие вещи - это не из ядра. Ядро только производит логин/логаут и ничего более.

Это уже дополнительная функциональность которую предоставляет экст felogin (поищите redirect_url в felogin\pi1\class.tx_felogin_pi1.php).

Ивано
18.10.2012, 13:23
$check = FALSE;
$loginData = array(
'username' => "user",
'uident_text' => "pass",
'status' => 'login',
);

$GLOBALS['TSFE']->fe_user->checkPid = ''; //do not use a particular pid
$info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$info['db_user']['checkPidList'] = 1;
$info['db_user']['check_pid_clause'] = 'AND pid IN(362)';
$user = $GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'], $loginData['username']);



$login_success = $GLOBALS['TSFE']->fe_user->compareUident($user,$loginData);

#Если пользователь найден
if($login_success){

$GLOBALS['TSFE']->fe_user->createUserSession($user);
$GLOBALS["TSFE"]->fe_user->loginSessionStarted = TRUE;
$GLOBALS ["TSFE"] ->fe_user->start();

}


Так понимаю в данном коде никак не получиться сохранить сессию на вечно?...

dmartynenko
18.10.2012, 13:37
Ну что же вы не проявляете любознательность? :)

Поиск "permalogin" по коду ядра дает что:
1. Можно задать в localconf.php $GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] = 2 и включить permalogin глобально.
2. Можно задать его в своем коде перед ручным логином.
3. * Не рекомендую. Можно в конце концов задать permalogin в $_GET или $_POST
typo3\sysext\cms\tslib\class.tslib_feuserauth.php

if ($this->getMethodEnabled) {
$isPermanent = t3lib_div::_GP($this->formfield_permanent);
} else {
$isPermanent = t3lib_div::_POST($this->formfield_permanent);
}

Ивано
18.10.2012, 14:30
В общем permalogin ни 0 ни 1 ни 2 не работает совсем...
Ни так ни так...
Все равно закрываешь браузер и открываешь его по новому вводи пароль:(
Даже попробовал на WinInstaller (TYPO3 4.7.0 - ни работает ни галочка, ни глобальная установка в 2)

dmartynenko
18.10.2012, 14:50
Время жизни кук прописали?
$TYPO3_CONF_VARS['FE']['lifetime'] = '2419200';

Другой броузер пробовали?

Ивано
18.10.2012, 15:23
Вы правы... все работает на ура!
Картинка в приложении - что настроил...
Пожалуй буду пользоваться простым созданием формы и передачей данных.
А с редиректом на страницу приветствия что нибудь придумаюю...

Спасибо.

Ивано
23.10.2012, 12:42
Хуки для авторизации...
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserLookUp'];
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserL'];

dmartynenko
23.10.2012, 13:01
Да, есть хук на логин. Но он вызывается после успешного логина. Т.е. максимум что можно сделать - сохранить какую-то статистику или какие-то связанные с пользователем данные обновить.

Если вам интересно копнуть глубже, посмотрите на Auth Services.
Они основаны на классе tx_sv_authbase (системный экст sv). Один из примеров в репозитории http://typo3.org/extensions/repository/view/eu_ldap

Еще пример: http://jimsuperfly.de/blog/typo3-auth-service/

Ивано
25.10.2012, 22:33
В настройках посмотрел, и как понял, что можно куки авторизации сохранять для двух доменов, а не для одного... Как это можно реализовать?:(:confused:

Ивано
26.10.2012, 00:21
Хуки для авторизации...
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserLookUp'];
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserL'];

Что то посмотрел эти хуки - и не то они делают...
Из выше написанных расширений посмотрел, но не подошло.

Авторизацию пользователя и его выход делаю стандартными способами:
авторизация через форму user и pass, выход через logintype=logout

Какими хуками можно решитть две задачи:

Выполнить код после успешной авторизации пользователя
Выполнить код после разлогинивания...?