181 lines
7.9 KiB
PHP
181 lines
7.9 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Фильтр для проверки авторизации
|
||
*
|
||
* action: login(password, login)
|
||
* action: logout()
|
||
*/
|
||
// В класс авторизации передавать обьект для управления пользователем
|
||
// Вынести в отдельный файл
|
||
class Filter_Login extends Filter_Filter
|
||
{
|
||
const SESSION_BROWSER_SIGN_SECRET = '@w3dsju45Msk#';
|
||
const SESSION_BROWSER_SIGN_KEYNAME = 'session.app.browser.sign';
|
||
public $mode = 'ajax';
|
||
|
||
//AJAX-Реквесты для которых не требуется авторизация, потребовалось для сбора статистики
|
||
public $whiteRequestList = [['module' => "requiredcontent", "action" => "getcount"],
|
||
['module' => "requiredcontent", "action" => "teststructure"],
|
||
['module' => "requiredcontent", "action" => "specialdump"],
|
||
['module' => "requiredcontent", "action" => "MDOUMonitoring"]
|
||
];
|
||
/**
|
||
* Проверка авторизации
|
||
* @return Boolean Авторизовани пользователь или нет
|
||
*/
|
||
public function isLoggin(HttpRequest $request)
|
||
{
|
||
// Авторизация
|
||
session_start();
|
||
$db = $this->getConnection();
|
||
Filter_UserAccess::setUp($db); // Соединение
|
||
switch ($request->getAction()) {
|
||
// Авторизация по постоянному паролю
|
||
case 'login':
|
||
$login = $request->get('login');
|
||
$password = $request->get('password');
|
||
|
||
$result = Filter_UserAccess::getUserByLogin($login); // Поиск по логину
|
||
if ($result) {
|
||
$userPassword = $result->getString('password');
|
||
if (Filter_UserAccess::$access == 'site_root' && defined('PARENT_PATH')) {
|
||
$s = new Settings(PARENT_PATH . '/settings.json');
|
||
$s->read();
|
||
$dsn = $s->readKey(array('system', 'dsn'));
|
||
|
||
$db = Database::getConnection($dsn);
|
||
$user = $db->fetchOneArray("SELECT * FROM users WHERE login = :login", ['login' => $login]);
|
||
$userPassword = $user['password'];
|
||
}
|
||
// Извлечнеие пользователя из родительской CMS, для проверки пароля
|
||
if (md5($password) == $userPassword) { // password
|
||
$this->enter($db, $result);
|
||
return true;
|
||
}
|
||
}
|
||
$request->set('error', true);
|
||
break;
|
||
case 'logout': // Выход
|
||
session_destroy();
|
||
break;
|
||
// Вход по временному паролю
|
||
case 'enter':
|
||
$login = $request->get('login');
|
||
$password = $request->get('sid');
|
||
$result = Filter_UserAccess::getUserByLogin($login); // Поиск по логину
|
||
if ($result) {
|
||
$temp = md5($result->getString('password') . $result->getString('login') . $result->getString('sid'));
|
||
if ($password == $temp) {
|
||
$this->enter($db, $result);
|
||
return true;
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
$hash = $this->getBrowserSign();
|
||
// Если $hash не совпадает $_SESSION['hash'] то удаляем сессию
|
||
if (isset($_SESSION ['access']) && isset($_SESSION[self::SESSION_BROWSER_SIGN_KEYNAME])) {
|
||
if ($hash == $_SESSION[self::SESSION_BROWSER_SIGN_KEYNAME]) {
|
||
$this->user = $user = Filter_UserAccess::getUserById($_SESSION['access']); // Поиск по идентификатору
|
||
if ($user && isset($_SESSION['random']) && ($user->get('sid') == $_SESSION['random'])) {
|
||
return true;
|
||
}
|
||
return true;
|
||
} else {
|
||
session_destroy();
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
private function getBrowserSign()
|
||
{
|
||
$rawSign = self::SESSION_BROWSER_SIGN_SECRET;
|
||
//$signParts = array('HTTP_USER_AGENT', 'HTTP_ACCEPT_ENCODING');
|
||
$signParts = array();
|
||
|
||
foreach ($signParts as $signPart) {
|
||
$rawSign .= '::' . (isset($_SERVER[$signPart]) ? $_SERVER[$signPart] : 'none');
|
||
}
|
||
return md5($rawSign);
|
||
}
|
||
|
||
private function enter($db, $result)
|
||
{
|
||
$this->user = $result;
|
||
$random = rand(0, 1024 * 1024);
|
||
$db->executeQuery("UPDATE users SET sid = '$random' WHERE id_user = " . $result->getInt('id_user'));
|
||
|
||
$_SESSION["group"] = $result->getInt('access');
|
||
$_SESSION["access"] = $result->getInt('id_user'); // id_user
|
||
$_SESSION["random"] = $random; // id_user
|
||
$_SESSION[self::SESSION_BROWSER_SIGN_KEYNAME] = $this->getBrowserSign();
|
||
$_SESSION["time"] = time();
|
||
}
|
||
|
||
public function execute(HttpRequest $request)
|
||
{
|
||
$logged = $this->isLoggin($request);
|
||
if ($request->get('action') == 'user_access') {
|
||
if ($logged) {
|
||
$result = array();
|
||
$result['fullname'] = $this->user->getString('patronymic') . " " . $this->user->getString('firstname');
|
||
$result['email'] = $this->user->getString('email');
|
||
$result['site'] = 187;
|
||
$result['hash'] = sha1(self::SESSION_BROWSER_SIGN_SECRET . $this->user->getString('email'));
|
||
return json_encode($result);
|
||
} else {
|
||
return json_encode("NOT AUTHORIZED");
|
||
}
|
||
}
|
||
|
||
if ($request->get('action') == 'relogin') {
|
||
if ($logged) {
|
||
return json_encode(array('result' => 'ok', 'message' => "Авторизация успешна"));
|
||
} else {
|
||
return json_encode(array('result' => 'fail', 'message' => "Неправильное имя пользователя или пароль"));
|
||
}
|
||
}
|
||
|
||
if (!$logged) {
|
||
// Параметры при неправильной авторизации
|
||
// Действия по умолчанию !! Возможно переход на форму регистрации
|
||
if ($request->get('mode') == 'ajax') {
|
||
if (!$this->requestIsWhite($request, $this->whiteRequestList)) {
|
||
return json_encode(array('result' => 'fail', 'message' =>"NOT_AUTHORIZED"));
|
||
}
|
||
} else {
|
||
$request->set('module', 'login');
|
||
$request->set('mode', $this->mode);
|
||
}
|
||
} else if (isset($_SERVER['HTTP_REFERER'])) {
|
||
$arr = array();
|
||
parse_str(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY), $arr);
|
||
if (isset($arr['back_page']) && $request->get('mode') != 'ajax') {
|
||
$request->redirect($arr['back_page']);
|
||
}
|
||
}
|
||
|
||
$text = $this->processor->execute($request);
|
||
return $text;
|
||
}
|
||
|
||
/* ---------------------
|
||
* Проверка на попадание реквеста в белый список
|
||
*/
|
||
|
||
public function requestIsWhite(Collection $request, $whiteRequestList){
|
||
$module = $request->get('module');
|
||
$action = $request->get('action');
|
||
foreach ($whiteRequestList as $whiteRequest) {
|
||
if ($module == $whiteRequest['module'] && $action == $whiteRequest['action']) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
}
|
||
|