CakePhp потерял переменную сеанса при перенаправлении - PullRequest
3 голосов
/ 03 февраля 2012

У меня проблемы с переменной сеанса, пользователи входят в приложение, а затем оно устанавливает переменную сеанса, но при перенаправлении на следующий контроллер его там нет.

В данный момент я не используюкомпонент auth, я думаю, что это не правильно, но я не знаю, как применить его к моей логике.Это потому, что я не регистрирую пользователей с именем пользователя и паролем, они проходят аутентификацию с другого веб-сайта, который дает мне билет и ключ, чтобы узнать, кто они.

Вот мой код UsersController, с которого запускается приложение.:

class UsuariosController extends AppController {
public $components = array('Session');

function beforeFilter() {

}

function login() {
    $isLogged = false;
    if(!empty($_POST['Ffirma']) ) {
        $this->loginByTicket();
    }
    else if(!empty($this->data)) { //When users log by email it works perfectly
        $this->loginByEmail();
    }
}

private function loginByEmail() {
    //Se busca el usuario en la base de datos
    $u = new Usuario();
    $dbuser = $u->findByEmail($this->data['Usuario']['email']);

    //if doesn't exist user in db
    if(empty($dbuser) ) {
        $this->Session->setFlash('El usuario no existe en el sistema, consulte con el administrador.');
        $this->redirect(array('controller' => 'usuarios', 'action' => 'login'));
        exit();
    }
    $this->userIsCorrectlyLogged($dbuser);
}

function loginByTicket() {
    $Fip = $_POST['Fip'];
    $Frol = $_POST['Frol'];
    $FidPersona = $_POST['Fidpersona'];
    $Fticket = $_POST['Fticket'];
    $Ffirma = $_POST['Ffirma'];
    //Check sing
    $f = $this->gen_firma($Frol, $FidPersona,  $Fticket);
    if( strcmp($f, $Ffirma) != 0 ) {
        $this->Session->setFlash('Firma no válida.');
        return;
    }
    //Check if ticket is valid
    //1º Check if it exists on the db
    $t = split('-',$Fticket);
    $ticket = new Ticket();
    $dbticket = $ticket->findById($t[0]);
    if( strcmp($dbticket['Ticket']['valor'], $t[1]) != 0) {
        $this->Session->setFlash('Ticket no válido.');
        return;
    }

    //2º if Ip ok
    if($Fip != $dbticket['Ticket']['ip']) {
        $this->Session->setFlash('IP no válida.'.' '.$dbticket['Ticket']['ip'].' '.$Fip);
        return;
    }

    $u = new Usuario();
    $dbuser = $u->findById($dbticket['Ticket']['idPersona']);
    $this->userIsCorrectlyLogged($dbuser);
}

private function userIsCorrectlyLogged($dbuser) {
    $user = array('Usuario' => array(
        'last_login' => date("Y-m-d H:i:s"),
        'rol_app' => 1,
        'nombre' => $dbuser['Usuario']['nombre'],
        'email' => $dbuser['Usuario']['email'],
        'apellidos' => $dbuser['Usuario']['apellidos'],
        'id' => $dbuser['Usuario']['id']
    ) );
    //Some stuff to determine rol privileges
    $this->Session->destroy(); 
    $this->Session->write('Usuario', $user);
    $this->redirect(array('controller' => 'mains', 'action' => 'index'),null, true);
    exit();
}

Как вы можете видеть, я делаю некоторые элементы управления, прежде чем знаю, что пользователь правильно вошел в систему, и у пользователя, который правильно вошел в систему, я просто сохраняю сеанс.

В моем AppController я проверяю,пользователь вошел в систему, но переменная сеанса уже прошла:

class AppController extends Controller {
    public $components = array('Session');
    function beforeFilter() {
        //Configure::write('Security.level', 'medium'); //I've tried this that i saw somewhere
        pr($this->Session->read()) // Session is empty
        if($this->checkAdminSession()) {
            $user = $this->Session->read('Usuario');
            $email = $user['Usuario']['email'];
            $usuario = new Usuario();
            $dbuser = $usuario->findByEmail($email);
            $respons = $usuario->getAccionesResponsable($dbuser['Usuario']['id']);  
            $this->set("hayacciones", true);
            if( empty($respons) ) $this->set("hayacciones", false);
        }
        else {
           $this->Session->setFlash('Necesitas identificarte para acceder al sistema.');

           $this->redirect('/usuarios/login/');
           exit();
        }
}
    function checkAdminSession() {
        return $this->Session->check('Usuario');        
    }
}

Я в отчаянии, я прочитал много документации, но не знаю, как решить эту проблему, не могли бы выдайте мне какую-нибудь подсказку?

Большое спасибо, и извините за мой английский!.

Примечание: Я обнаружил, что, если уровень безопасности низкий, он работает:

Configure::write('Security.level', 'low');

Но мне не нравится это решение ...

Ответы [ 5 ]

4 голосов
/ 08 февраля 2012

Вы переопределяете метод beforeFilter ().Таким образом, вместо использования:

<?php
class UsuariosController extends AppController {

    function beforeFilter() {

    }

вы должны сделать это:

<?php
class UsuariosController extends AppController {

    function beforeFilter() {
        parent::beforeFilter();
    }
4 голосов
/ 02 ноября 2012

Я терял информацию о сеансе и после входа в систему, и после поиска некоторое время я нашел много разных способов исправить мою проблему.Я только сожалею, что не до конца понимаю, что является причиной проблемы, но я предполагаю, что это связано с конфигурацией сеанса php.для меня Configure :: write ('Security.level', 'low');

Изменение конфигурации сохранения сеанса на php решило проблему и для меня: Configure :: write ('Session', array ('defaults '=>' cake ',)); И, наконец, добавление тайм-аута тоже сработало (которое я в итоге использовал): Configure :: write (' Session ', array (' defaults '=>' php)',' cookieTimeout '=> 10000));

Все это найдено в /app/Config/core.php

Я публикую это, надеясь, что кто-то сможет понять, чтопроисходит внизу.Я чувствую, что понимание сути проблемы поможет лучше ответить на ваш вопрос.

1 голос
/ 18 января 2013

У меня такая же проблема. Я перепробовал все предложения. Мой Cache Engine - Apc.

  $this->__saveData($t);
  debug($this->Session->read());// >>>>>> GOOD
  $this->redirect(array('controller'=>'users','action'=>'main'));
    }
}
 }
  function logout() {
    $this->Session->destroy();
            $this->Session->delete('User');
    $this->redirect(array('controller'=>'logins','action'=>'login'));
}
function forgot() {
$this->layout = 'login';

} 
    private function __saveData($t)
    {   
         $this->Session->write('User',$t['User']['name']);
         $this->Session->write('User_name',$t['User']['firstname']);
         $this->Session->write('User_id',$t['User']['id']);
         $this->Session->write("User_Group",$t['Group']['name']);
         $g = $this->Myauth->getPerm('User_Group'); // This is the array of permission w.r.t to the menu (key)
         $this->Session->write("Permissions",$g);

         debug($this->Session->read());
    }
 function main()
{
    // Check permissions
$this->Myauth->check('users','login');
$username   = $this->Session->read('User');
debug($this->Session->read( ));die(); <<<<< NOTHING

}

Самое смешное, что вчера это сработало.

Мой php.ini имеет простое расширение = apc.so. Мой core.php

    Configure::write('Session.defaults', 'php');

Ничего не изменится, если я изменю уровень безопасности. Я буду признателен за любое направление.

EDIT Первое решение: в моем php.ini у меня было плохое значение для session.referer_check (это было = 0, в то время как это должно быть ''). Но теперь, на одном сервере, один сайт в порядке. Еще один выдает ошибку Ошибка: вызов неопределенной функции apc_cache_info ()

Два сайта разделены и не имеют общего торта.

[ РЕШЕНИЕ НАЙДЕНО ]

Для Cake> 2.2 и Chrome 24 я нашел это решение (перепробовал все остальные найденные в сети). В вашем core.php:

     Configure::write('Security.cookie', 'cakephpfdebackend');
     Configure::write('Session.cookieTimeout', 0);
     Configure::write('Session.checkAgent', false);
     Configure::write('Session.cookie_secure',false);
     Configure::write('Session.referer_check' ,false);
     Configure::write('Session.defaults', 'php'); 

На самом деле требуется только Session.cookieTimeout. Другие настройки необязательны для решения проблемы.

0 голосов
/ 27 ноября 2015

Возможная причина этой проблемы заключается в том, что часы сервера не синхронизируются с часами клиента и, следовательно, тайм-ауты cookie.

0 голосов
/ 03 февраля 2012

У меня была проблема с сессией на некоторых страницах.Можете ли вы проверить, находится ли какой-либо пробел внизу страницы после конечного тега php.Когда я столкнулся с этой проблемой, я обнаружил, что сессия отсутствует из-за символа пробела в контроллере после конечного тега php.Пожалуйста, проверьте это и дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...