Session 重定向时cakephp丢失会话变量

Session 重定向时cakephp丢失会话变量,session,cakephp,redirect,Session,Cakephp,Redirect,我有一个会话变量的问题,用户登录到应用程序,然后它设置了一个会话变量,但当它重定向到下一个控制器时,它不在那里 目前我没有使用auth组件,我认为它不正确,但我不知道如何将它应用到我的逻辑中。这是因为我不使用用户名和密码登录用户,他们来自其他网站的身份验证,该网站给我一张票证和一把钥匙,让我知道他们是谁 以下是我启动应用程序的UsersController的代码: class UsuariosController extends AppController { public $component

我有一个会话变量的问题,用户登录到应用程序,然后它设置了一个会话变量,但当它重定向到下一个控制器时,它不在那里

目前我没有使用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');

但是我不喜欢这个解决方案…

我在一些页面上遇到了一些问题。您可以检查php结束标记后页面底部是否有空格。当我遇到这个问题时,我发现由于php结束标记后控制器中的空白字符,会话丢失。请检查并通知我。

您正在重写beforeFilter()方法。因此,不要使用这个:

<?php
class UsuariosController extends AppController {

    function beforeFilter() {

    }

在一次登录呼叫后,我也丢失了会话信息,在搜索了一段时间后,我找到了许多不同的方法来解决我的问题。我只是感到遗憾的是,我没有完全理解是什么导致了这个问题,但我认为这与php的会话配置有关

  • 正如您所提到的,将Security.level更改为low为我解决了这个问题 Configure::write('Security.level','low')
  • 将会话保存配置更改为php也解决了这个问题: 配置::写入('Session',数组( “默认值”=>“蛋糕”, ));
  • 最后,添加一个超时也起了作用(我最终使用了它): 配置::写入('Session',数组( “默认值”=>“php”, “cookieTimeout”=>10000 )); 所有这些都可以在/app/Config/core.php中找到


    我张贴这篇文章,希望有人能够理解下面发生的事情。我觉得了解问题的根源会更好地回答你的问题。

    我也有同样的问题。我尝试了所有的建议。我的缓存引擎是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中,session.referer\u check的值不正确(它是=0,而它应该是“”)。 但是现在,在同一台服务器上,一个站点就可以了。另一个引发了错误 错误:调用未定义的函数apc_cache_info()

    这两个站点是分开的,不共享任何cakelib

    [找到解决方案]

    对于Cake>2.2和Chrome 24,我找到了这个解决方案(我尝试了在web上找到的所有其他解决方案)。在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。其他设置是可选的以解决此问题。

    此问题的一个可能原因是服务器时钟未与客户端时钟同步,因此cookie超时。

    选中:php结束标记后没有任何空间:?>我已选中invlolved的模型和视图。您确定,会话已正确设置并可在某些页面中访问。还是所有页面都缺少会话?我可以看到checkAdminSession()主体吗。我认为这是会话检查的地方。目前我只有以下函数:checkAdminSession(){return$this->session->check('Usuario');}类似:
        Configure::write('Session.defaults', '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');