Регистр файлов
This commit is contained in:
parent
4fd0187ea6
commit
c8958cbee0
83 changed files with 25 additions and 53 deletions
34
src/Filter/ActionAccess.php
Normal file
34
src/Filter/ActionAccess.php
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Фильтр действий
|
||||
*/
|
||||
class ActionAccess
|
||||
{
|
||||
public $access = array();
|
||||
|
||||
function __construct($processor)
|
||||
{
|
||||
$this->processor = $processor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверка доступных действий для пользователя
|
||||
* !! Реализация класса проверки действий не должна быть внутри Контроллера!!!
|
||||
* Информация о доступе может быть в файле, базе данных и т.д.
|
||||
*/
|
||||
function checkAction($action)
|
||||
{
|
||||
// Импликация !! http://ru.wikipedia.org/wiki/Импликация
|
||||
return (!isset($this->access[$action]) || in_array(UserAccess::$access, $this->access[$action]));
|
||||
}
|
||||
|
||||
function execute(HTTPRequest $request)
|
||||
{
|
||||
$action = $request->getAction();
|
||||
if(! $this->checkAction($action)) {
|
||||
$request->set('action', 'index');
|
||||
}
|
||||
return $this->processor->execute($request);
|
||||
}
|
||||
}
|
||||
24
src/Filter/ActionLogger.php
Normal file
24
src/Filter/ActionLogger.php
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
class ActionLogger
|
||||
{
|
||||
public $before = array ();
|
||||
public $file;
|
||||
public $action;
|
||||
public $processor;
|
||||
|
||||
function __construct($processor)
|
||||
{
|
||||
$this->processor = $processor;
|
||||
$this->file = fopen(Shortcut::getUrl('access.log'), "a");
|
||||
}
|
||||
|
||||
function execute(HTTPRequest $request)
|
||||
{
|
||||
$action = $request->getAction();
|
||||
if(in_array($action, $this->before)) {
|
||||
fwrite($this->file, "time: " . date("r", time()) . " query: ". json::encode(array_merge($_POST, $_GET)) . " by: " . UserAccess::$name . "\n");
|
||||
}
|
||||
return $this->processor->execute($request);
|
||||
}
|
||||
}
|
||||
28
src/Filter/Filter.php
Normal file
28
src/Filter/Filter.php
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Попытка реализовать фильтр для запросов
|
||||
*/
|
||||
class Filter_Filter
|
||||
{
|
||||
public $processor;
|
||||
public function __construct($processor)
|
||||
{
|
||||
$this->processor = $processor;
|
||||
}
|
||||
|
||||
public function execute(HttpRequest $request)
|
||||
{
|
||||
return $this->processor->execute($request);
|
||||
}
|
||||
|
||||
public function getView($name)
|
||||
{
|
||||
return $this->processor->getView($name);
|
||||
}
|
||||
|
||||
public function getConnection()
|
||||
{
|
||||
return $this->processor->getConnection();
|
||||
}
|
||||
}
|
||||
105
src/Filter/Login.php
Normal file
105
src/Filter/Login.php
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
<?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';
|
||||
/**
|
||||
* Проверка авторизации
|
||||
* @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) {
|
||||
if (md5($password) == $result->getString('password')) { // 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 = 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_SECRET])) {
|
||||
if ($hash == $_SESSION[self::SESSION_BROWSER_SIGN_SECRET]) {
|
||||
UserAccess::getUserById($_SESSION ['access']); // Поиск по идентификатору
|
||||
return true;
|
||||
} else {
|
||||
session_destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private function getBrowserSign()
|
||||
{
|
||||
$rawSign = self::SESSION_BROWSER_SIGN_SECRET;
|
||||
$signParts = array('HTTP_USER_AGENT', 'HTTP_ACCEPT_ENCODING');
|
||||
|
||||
$rawSign = '';
|
||||
foreach ($signParts as $signPart) {
|
||||
$rawSign .= '::' . (isset($_SERVER[$signPart]) ? $_SERVER[$signPart] : 'none');
|
||||
}
|
||||
return md5($rawSign);
|
||||
}
|
||||
|
||||
private function enter($db, $result)
|
||||
{
|
||||
$db->executeQuery("UPDATE users SET sid = '' WHERE id_user = " . $result->getInt('id_user'));
|
||||
|
||||
$_SESSION ["group"] = $result->getInt('access');
|
||||
$_SESSION ["access"] = $result->getInt('id_user'); // id_user
|
||||
$_SESSION [self::SESSION_BROWSER_SIGN_SECRET] = $this->getBrowserSign();
|
||||
$_SESSION ["time"] = time();
|
||||
}
|
||||
|
||||
public function execute(HttpRequest $request)
|
||||
{
|
||||
if (!$this->isLoggin($request)) {
|
||||
// Параметры при неправильной авторизации
|
||||
// Действия по умолчанию !! Возможно переход на форму регистрации
|
||||
$request->set('module', 'login');
|
||||
$request->set('mode', $this->mode);
|
||||
}
|
||||
return $this->processor->execute($request);
|
||||
}
|
||||
}
|
||||
|
||||
69
src/Filter/UserAccess.php
Normal file
69
src/Filter/UserAccess.php
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
// Класс должен быть в библиотеке приложения
|
||||
class Filter_UserAccess
|
||||
{
|
||||
const LIFE_TIME = 1800; // = 30min * 60sec;
|
||||
|
||||
static $fullname;
|
||||
static $name;
|
||||
static $access;
|
||||
static $password;
|
||||
static $id;
|
||||
static $db;
|
||||
|
||||
protected function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
public static function setUp($db)
|
||||
{
|
||||
self::$db = $db;
|
||||
}
|
||||
|
||||
public static function getUserByQuery($stmt)
|
||||
{
|
||||
global $GROUPS;
|
||||
$result = $stmt->executeQuery();
|
||||
if ($result->next()) {
|
||||
self::$access = $GROUPS[$result->getString('access')];
|
||||
self::$name = $result->getString('login');
|
||||
self::$id = $result->getInt('id_user');
|
||||
self::$password = $result->getString('password');
|
||||
self::$fullname = implode(' ', array(
|
||||
$result->getString('surname'),
|
||||
$result->getString('firstname'),
|
||||
$result->getString('patronymic')));
|
||||
return $result;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function getUserByLogin($login)
|
||||
{
|
||||
$stmt = self::$db->prepareStatement("SELECT * FROM users WHERE login = ?");
|
||||
$stmt->setString(1, $login);
|
||||
$result = self::getUserByQuery($stmt);
|
||||
if ($result) {
|
||||
$time = time();
|
||||
$id = self::$id;
|
||||
self::$db->executeQuery("UPDATE users SET lasttime = $time WHERE id_user = $id"); // Время входа
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public static function getUserById($id)
|
||||
{
|
||||
$stmt = self::$db->prepareStatement("SELECT * FROM users WHERE id_user = ?");
|
||||
$stmt->setInt(1, $_SESSION ['access']);
|
||||
$result = self::getUserByQuery($stmt);
|
||||
if ($result) {
|
||||
$lasttime = $result->getInt('lasttime');
|
||||
$time = time();
|
||||
if ($time - $lasttime > self::LIFE_TIME) return null; // Вышло время сессии
|
||||
$id = self::$id;
|
||||
$stmt = self::$db->executeQuery("UPDATE users SET lasttime = $time WHERE id_user = $id"); // Время последнего обращения входа
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue