使用会话进行重定向工作

时间:2011-01-17 14:42:50

标签: cakephp

我坚持使用'if'结构。这个想法是,当用户登录时,根据其角色,他将被重定向到不同的URL,而对于角色(学生),它会变得更复杂,因为如果他填写了表格,他将会被重定向到另一个地方。所以,总结的登录功能是:

function login() {
    if ($this->Session->read('Auth.User')) {
         if($this->Session->read('Auth.User.group_id') == '1')
             $this->redirect(array('controller'=>'specializations', 'action' => 'index'));
         else if ($this->Session->read('Auth.User.group_id') == '2')
             $this->redirect(array('controller'=>'specializations', 'action' => 'index'));
         else if ($this->Session->read('Auth.User.group_id') == '3')
             if ($this->Session->read('Auth.Student.form_activated') == '1')
                $this->redirect(array('controller'=>'students', 'action' => 'view',$this->Session->read('Auth.Student.id')));
             else
                $this->redirect(array('controller'=>'students', 'action' => 'add'));
        $this->Session->setFlash('You are logged in!');
        $this->redirect('/', null, false);
    }

我正在检查学生是否使用'form_activated'属性填写表单。我不知道这是一个好方法,但它是我想象的唯一一个。

现在,每当我以学生身份登录时,它都会重定向到“添加”页面,并猜测我在DebugKit中找到了什么......

  1. 验证

  2. 重定向/生/视图/ 1

  3. 用户
  4. o id3

    o emailalf@gmail.com

    o group_id3

    它应该重定向到视图页面......但它不会......

    似乎它不是在阅读$ this-> Session-> read('Auth.Student.id'),我猜你只能在Auth.User上使用它,任何人都知道怎么读它SessionHelper的学生参数?我必须使用查询吗?

    任何提示??

    提前致谢,

    阿尔夫。

2 个答案:

答案 0 :(得分:1)

  

我正在检查学生是否使用'form_activated'属性填写表单。我不知道这是一个好方法,但它是我想象的唯一一个。

首先,会话不是持久性数据存储。它在注销时被破坏。登录后对会话数据的任何更改在下次登录时都不可用,除非您以某种方式保留并恢复这些更改。

  

似乎它不是在阅读$ this-> Session-> read('Auth.Student.id'),我猜你只能在Auth.User上使用它,任何人都知道怎么读它SessionHelper的学生参数?

您正在尝试在应用程序的登录操作期间访问Auth.UserAuth.Student,这表明(根据提供的代码)您可能会误解某些内容。

登录时,AuthComponent将用户从数据库(通常是users表中的记录)复制到会话中(通常为Auth.User)。

(旁白:您可以通过在应用程序中设置$this->Auth->userModel = 'Student'来稍微更改此默认行为。这将使AuthComponent从Student模型读取记录 - 默认情况下为students表 - 在登录时将它们放在Auth.Student会话中。)

因此,在上面的login()操作中,AuthComponent只会设置Auth.User(如果您使用的是Auth.Student型号,则为Student,而不是两者都设置!< / p>

  

我必须使用查询吗?

嗯,不是说你可以“查询”会话,但这可能是解决方案。

MySQL可能是您用于应用程序的持久性数据存储。如果要在会话销毁/超时(即注销)中存活,您需要在MySQL中存储此信息(即,如果学生已填写表格)。

如果您只是将此信息存储在用户的记录中(默认情况下在users表中),那么AuthComponent显然会将信息复制到会话中。

否则,您需要确定信息是否只需要一次(在这种情况下,只是查询数据库)或在整个应用程序中多次(然后您将查询数据库并将信息存储在会话中缓存目的)。

基本上,除了AuthComponent将用户的数据库记录复制到会话(以及在注销时销毁会话)的能力之外,还需要编写额外的代码来存储/检索/保留/恢复所需的信息。


执行的每个查询都会命中数据库服务器。如果您经常需要一些信息(例如,您可能会在所有页面上显示学生班级的名称),那么不断检查数据库以获取相同的信息是没有意义的,因此使用用户的会话作为存储可以防止需要。

由于Model::find()返回数组而SessionComponent::write()接受数组,因此在数据库和会话之间移动数据(或再次移回)非常简单。

当您 更新会话时,用户在数据库中编辑自己的用户记录的示例。您在会话中依赖的用户数据(例如,此人的姓名)现在可能已过时(如果他们更改了姓名)。无需用户注销并重新登录(创建新会话),您可以执行以下操作:

class UsersController extends AppController {
    public function edit($id = null) {
        // ..
        if ($this->User->save($this->data)) {
            $user = $this->User->read(null, $this->User->id); // get latest record
            $this->Session->write('Auth.User', $user['User']); // overwrite session
            // ..
        }
    }
}

另一个示例可能是使用用户地址在大多数页面上提供地图或本地化结果的应用程序。您可以查找我们知道我们需要的地址,并将其存储在会话中(例如,当用户登录时)。

class UsersController extends AppController {
    public function login() {
        if ($this->Auth->login()) {
            $address = $this->User->Address->find('first', array(
                'conditions' => array(
                    'Address.user_id' => $this->Auth->user('id'),
                    'Address.default' => true,
                )
            ));
            if ($address) {
                $this->Session->write('Address', $address['Address']);
            }
        }
    }
}

我们现在可以像$this->Session->read('Address.latitude')那样频繁地检索这些信息,而无需增加与MySQL交谈的开销。

答案 1 :(得分:0)

通过执行以下操作获取用户ID:

$this->Auth->user('id');

请参阅http://book.cakephp.org/view/1264/user