避免重定向和持久化会话

时间:2011-12-10 19:42:02

标签: cakephp

我正在尝试在蛋糕php中完成这个网站,这是以前在常规的PHP,但作为cakephp世界的新手..我发现了一些困难,如这些。

1)。当我点击登录时,它会将我转移到另一个页面,虽然我在app控制器中没有指定重定向,除非有注册。登录位于顶部,可在所有页面中查看,但如果我点击登录,则会将我重定向到登录页面(我不想要)。

2。)我登录后,它会引入会话,其用户名称为welcome'username',但如果我转到另一个页面,似乎它会忘记会话并返回登录表单的输入页面顶部。

这是我的代码

app_controller

<?php
class AppController extends Controller {    

    var $helpers = array('Html', 'Form', 'Javascript', 'Session'); 
    var $components = array('Auth', 'Session');

    function beforeFilter() {
       $this->Auth->allow('add','get_categories','get_home', 'get_others', 'pages');
       $this->Auth->autoRedirect = false;

      } 
}
?>

UsersController

<?php
class UsersController extends AppController {

    var $uses = array("User");
    var $components = array('Auth', 'Session');


    function index()
    {
        $this->set('users', $this->User->find('all'));
         $this->layout = 'master_layout';
    }

      function add() { 

          if (!empty($this->data)) {
             //pass is hashed already
             //->data['User']['password'] = $this->Auth->password($this->data['User']['password']);
             if ($this->User->save($this->data)) {
                $this->Session->setFlash('Your were registered!.');
                               $this->redirect(array('action' => 'get_home'));
             }
          }

         $this->layout = 'master_layout';
      }

    //IF THE DATABASE IS SET UP CORRECTLY CAKE AUTHENTICATES AUTOMATICALLY NO
    //LOGIC IS NEEDED FOR LOGIN http://book.cakephp.org/view/1250/Authentication
    function login() {

        $this->layout = 'master_layout';

              if ($this->data) {

                    if ($this->Auth->login($this->data)) {

                    // Retrieve user data
         $results = $this->User->find(array('User.username' => $this->data['User']['username']), array('User.active'), null, false);

         $this->redirect(array('controller' => 'users', 'action' => 'login'));

                            }
                    }

        $this->data['User']['password'] = '';

    }

    function logout() {

    $this->redirect($this->Auth->logout());

    }

}
?>

元素/ loginform.ctp

<?php
 if ($this->Session->read('Auth.User.username')):?>
<?php
  echo "Welcome".' ' ;
echo $this->Session->read('Auth.User.username');
echo " ";
echo $html->link('logout', array('action'=>'logout'));
 ?>
<?php else : ?>
<div class="types form">
      <?php echo $form->create('User', array('controller' => 'Users','action' => 'login')); ?>
      <?php echo $form->input('username', array('label' => 'username'));    ?>
      <?php echo $form->input('password',array('type'=>'password', 'label' => 'password')) ?>
      <?php echo $form->submit('Submit'); ?>
       </div>
 <?php endif; ?> 

更新

我将以下内容添加到app_controller

<?php
class AppController extends Controller {    

    var $helpers = array('Html', 'Form', 'Javascript', 'Session'); 
    var $components = array('Auth', 'Session');

    function beforeFilter() {
       //new addition
       $this->set('userData', $this->Session->read());
       $this->Auth->allow('add','get_categories','get_home', 'get_others', 'pages', '*');
       $this->Auth->autoRedirect = false;

      } 
}
?>

当我登录时,我获得此阵营

Array ( [Config] => Array 
            ( [userAgent] => 8f12200c2d48fa7955465842befe1c9e 
              [time] => 1323562284 [timeout] => 10 ) 
              [Auth] => Array ( 
                  [User] => Array ( 
                       [id] => 63 
                       [user_role] => 2 [
                       [user_fname] => test 
                       [user_lname] => test 
                       [user_email] => test@test.com 
                       [user_phone] => 677-988-7777 
                       [user_cellphone] => 555-456-9999 
                       [user_address1] => 1st Avenue 
                       [user_address2] => 
                       [user_city] => Citiland FL 
                       [user_zip] => 55555 
                       [username] => admin2 ) ) )

但是当我导航到新页面时

Array ( [Config] => Array ( 
    [userAgent] => 8f12200c2d48fa7955465842befe1c9e 
    [time] => 1323562591 [timeout] => 10 ) ) 

向元素/登录表添加PRINT_R以查看所有页面中的可变内容

<?php
 print_r($userData);
 if ($this->Session->read('Auth.User.username')):?>
<?php
  echo "Welcome".' ' ;
echo $this->Session->read('Auth.User.username');
echo " ";
echo $html->link('logout', array('action'=>'logout'));
 ?>
<?php else : ?>
<div class="types form">
      <?php echo $form->create('User', array('controller' => 'Users','action' => 'login')); ?>
      <?php echo $form->input('username', array('label' => 'username'));    ?>
      <?php echo $form->input('password',array('type'=>'password', 'label' => 'password')) ?>
      <?php echo $form->submit('Submit'); ?>
       </div>
 <?php endif; ?> 

1 个答案:

答案 0 :(得分:0)

1)这是因为在您的UsersController中,您在用户登录后进行了重定向。 您的登录功能应改为:

 function login() {

        $this->layout = 'master_layout';

              if ($this->data) {

                    if ($this->Auth->login($this->data)) {

                    // Retrieve user data
         $results = $this->User->find(array('User.username' => $this->data['User']['username']), array('User.active'), null, false);

/*This is the offending line, I've commented it out, but you could have it redirect somewhere else (it might be a good idea to redirect to the index action, for example, or just delete it:*/

         //$this->redirect(array('controller' => 'users', 'action' => 'login'));


                            }
                    }

        $this->data['User']['password'] = '';

    }

至于2),我认为可能是因为你之后没有设置数据,所以当它存在于服务器上的tmp目录中时(使用Session组件)它实际上并没有传递给视图。所以基本上我认为这是因为你不能在视图中调用Session方法。即使我对此不完全正确,我建议做的也应该工作:不要在视图中调用会话方法,而是在控制器中调用它们,将它们设置在变量中以便视图使用{{1然后在视图中测试该变量。

如果您需要为大量的观看和操作执行此操作,您可以考虑将这样的内容添加到您的控制器甚至您的应用控制器:

$this->set();

或者,如果您只需要执行一些操作,则可以使用以下命令在这些操作中设置用户数据:

function beforeFilter() {
// Get session data for appllication use
$this->appuserstuff = $this->Session->read();
} 

function beforeRender() {
// Make app variables available to view
$this->set('userData', $this->appuserstuff);
}

现在我建议您在其中一个视图中执行$this->set('userData', $this->Session->read()); ,以便在设置数据时可以看到数据在数组中的结构,以便您可以使用或测试条件。最后,您可以在视图中替换对Session的直接调用,而不是检查数据数组:

请注意,我不确定您的特定阵列是如何构建的,因此请按照上面的建议进行调试并插入您自己的密钥以使其正常工作:

<?php debug($userData); ?>