Проблем със сесия

C++ JAVA
User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Проблем със сесия

Post by teroristd » Wed Mar 14, 2018 3:44 pm

Ето какъв е проблема. Да кажем потребител отива на някаква страница, която изисква да бъде логнат за да може да извърши някакво действие. На страницата(вю-то) сетвам сесия.

[php]
session_start();
$_SESSION['userCurrentUrl'] = $this->_currentUrl;
[/php]

Потребителят отива да се логва и аз проверявам дали е сетната сесия с url-a и ако не е го пращам на началната страница иначе го връщам на страницата от която идва.

[php]
if (!isset($_SESSION['userCurrentUrl']))
{
header("Location:" . $this->_link);
}
else
{
header("Location:" . $this->_link . '/' . $_SESSION['userCurrentUrl']);
}
[/php]

На страницата в която сетвам имам сесията, но в логина сесията е null. Някакви идеи какво да правя?

heytar
Нов
Нов
Posts: 80
Joined: Mon Jun 29, 2015 7:28 am

Re: Проблем със сесия

Post by heytar » Wed Mar 14, 2018 3:55 pm

[php]session_start();[/php]
това имаш ли го във 2-та файла?

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Wed Mar 14, 2018 5:20 pm

По default нямам в логин контролера. Така работеше на локалхоста, но пробвах да слагам в конструктора на логин контролера също и във вю-то на
логин и няма резултат.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Mar 14, 2018 10:02 pm

Нещо липсва информация. Сигурен ли си, че реално сетваш сесията? Малко повече код няма да навреди да се погледне. Също ... дебъг.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Thu Mar 15, 2018 9:02 am

Ето какво е положението.
Слагам session_start(); и var_dump($_SESSION['userCurrentUrl']); в конструктора на логин контролер-а и имам сесия преди да субмитна. След това вече сесията става null и проверката не минава. Пускам контролера и модела за повече информация.

Login controller


[php]
<?php

namespace controllers;

use application\Normalize;
use application\routers\DefaultRouter;
use application\View;
use models\IsLoggedModel;
use models\LoginModel;

class Login
{
private $_view;
private $_loginModel;
private $_defaultRouter;
private $_normalize;
private $_data;
private $_link;
private $_isLoggedModel;

public function __construct(View $view, LoginModel $loginModel, DefaultRouter $defaultRouter, Normalize $normalize, IsLoggedModel $isLoggedModel)
{
$this->_view = $view;

$this->_loginModel = $loginModel;

$this->_defaultRouter = $defaultRouter;

$this->_normalize = $normalize;

$this->_data = $this->_loginModel->html();

$this->_link = $this->_defaultRouter->link();

$this->_isLoggedModel = $isLoggedModel;

session_start();
var_dump($_SESSION['userCurrentUrl']);
}

public function run()
{
try
{
$this->_isLoggedModel->isLogged();
}
catch (\Throwable $exc)
{
if ($exc->getMessage() == 'logged')
{
header("Location:" . $this->_link);
}
}

$submit = $this->_normalize->post('submit', 'trim');

$email = $this->_normalize->post('email', 'trim');

$pass = $this->_normalize->post('pass', 'trim');

try
{
$this->_loginModel->run($email, $pass);
}
catch (\Throwable $exc)
{
$this->_view->_emailValue = $email;

if (isset($submit))
{
if ($exc->getMessage() == 'ok')
{
if (!isset($_SESSION['userCurrentUrl']))
{
header("Location:" . $this->_link);
}
else
{
header("Location:" . $this->_link . '/' . $_SESSION['userCurrentUrl']);
}
}
elseif ($exc->getMessage() == 'token')
{
$this->_view->_message = $this->_data['message_13'];

$this->layout();
}
elseif ($exc->getMessage() == 'empty')
{
$this->_view->_message = $this->_data['message_2'];

$this->layout();
}
elseif ($exc->getMessage() == 'email')
{
$this->_view->_emailValue = null;

$this->_view->_message = $this->_data['message_15'];

$this->layout();
}
elseif ($exc->getMessage() == 'pass')
{
$this->_view->_message = $this->_data['message_15'];

$this->layout();
}
elseif ($exc->getMessage() == 'active')
{
$this->_view->_message = $this->_data['message_16'];

$this->layout();
}
}
else
{
$this->_view->_emailValue = null;

$this->_view->_message = $this->_data['message_0'];

$this->layout();
}
}
}

public function layout()
{
// Display
$this->_view->display('header');
$this->_view->display('Login');
$this->_view->display('footer');
}
}
[/php]

Login model

[php]

<?php

namespace models;

use application\App;
use application\Config;
use application\Database;
use application\Normalize;

class LoginModel
{
private $_config;
private $_database;
private $_app;
private $_normalize;

public function __construct(Config $config, Database $database, App $app, Normalize $normalize)
{
$this->_config = $config;

$this->_database = $database;

$this->_app = $app;

$this->_normalize = $normalize;
}

public static function generate()
{
return $_SESSION['tokenLogin'] = bin2hex(openssl_random_pseudo_bytes(16));
}

public function run($email, $pass)
{
session_start();

$token = $this->_normalize->post('token', 'trim');

if ($token != isset($_SESSION['tokenLogin']))
{
throw new \Exception('token', 405);
}

$this->_database->prepare('USE market')->execute();

if (empty($email) || empty($pass))
{
throw new \Exception('empty', 405);
}

$sql = $this->_database->prepare('SELECT email FROM users WHERE email=?', array($email))->execute()->fetchAllAssoc();

if ($sql == null)
{
throw new \Exception('email', 405);
}

$sqlPass = $this->_database->prepare('SELECT pass FROM users WHERE email=?', array($email))->execute()->fetchAllAssoc();

foreach ($sqlPass as $value)
{
foreach ($value as $hash)
{
$verify = password_verify($pass, $hash);

if ($verify == true)
{
$sqlActive = $this->_database->prepare('SELECT active FROM users WHERE email=?', array($email))->execute()->fetchAllAssoc();

foreach ($sqlActive as $val)
{
foreach ($val as $active)
{
if ($active == 'no')
{
throw new \Exception('active', 405);
}
}
}

$this->_database->prepare('USE session')->execute();

$id = $this->_app->getSession()->getSessionId();

$this->_database->prepare('UPDATE sess SET email = ? WHERE sess_id = ?', array($email, $id))->execute();

$this->_app->getSession()->setSessionData('logged');

$this->_app->getSession()->saveSessionData();

throw new \Exception('ok', 200);
}
else
{
throw new \Exception('pass', 405);
}
}
}
}

public function html()
{
$arr = $this->_config->getConfigFile('htmlArr');

return $arr;
}
}[/php][/php]

Fakeheal
Гуру
Гуру
Posts: 2703
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Post by Fakeheal » Thu Mar 15, 2018 9:17 am

Как load-ваш класовете (инклудваш файловете)?

Може би е вече късно, защото искаш да ползваш системката, която си си написал, но този начин на хвърляне на ексепшъни дори и за неща, които не са грешка е много грешен. Ползвай булеви изрази за връщане и разбий дългите (големи методи) на по-малки, които да вършат само един task с return type bool.
Last edited by Fakeheal on Thu Mar 15, 2018 9:23 am, edited 2 times in total.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Thu Mar 15, 2018 9:20 am

С dependency injection container.

Благодаря за съвета, за напред ще го имам на предвид, но за този сайт вече няма за кога да го пренаписвам.
Last edited by teroristd on Thu Mar 15, 2018 9:34 am, edited 1 time in total.

Fakeheal
Гуру
Гуру
Posts: 2703
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Post by Fakeheal » Thu Mar 15, 2018 9:24 am

teroristd wrote:С dependency injection container.
LoginModel->run() къде се вика?

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Thu Mar 15, 2018 9:27 am

Fakeheal wrote:
teroristd wrote:С dependency injection container.
LoginModel->run() къде се вика?
В контролера.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Thu Mar 15, 2018 10:41 am

Значи тази сесия която идва от модела $_SESSION['tokenLogin'] си съществува. Дали е възможно да презаписва другата защото тя изчезва след като извикам модела?

Post Reply