CakePHP Auth用户信息

时间:2012-12-07 01:01:18

标签: php session cakephp variables authentication

在我看来,我试图显示当前登录的用户信息,并想通过使用

来做到这一点
echo "Welcome back " .$this->Session->read('Auth.User.username'). "

这显示用户名,我可以使用相同的方法显示该数据库行中的其他字段,但是其他一些字段可以随时更新,但在用户页面上不会更新,直到他们注销并再次登录。 / p>

这是正确的方法吗?或者这可以做得更好,并以某种方式将一些代码放在AppController中的beforeFilter()中,以继续更新每个页面加载的变量?

3 个答案:

答案 0 :(得分:1)

如果数据库是从CakePHP外部更新的,并且没有调用任何控制器操作,似乎唯一的解决办法是在每个加载的页面上进行查询以获取当前值。

为此,您应该在AppController上使用beforeFilter方法:

function beforeFilter(){
     $user = $this->User->field('name', array('User.id' => $this->Session->read('Auth.User.id')));
     $this->Session->write('Auth.User', $user);
}

否则,您可以使用JavaScript和AJAX来不时获取数据。

答案 1 :(得分:0)

如果您只是在用户模型上创建afterSave(),并在其中设置$this->Session->write('Auth.User') = $user;

,该怎么办?

这是未经测试的,但似乎应该可行 - 那么您的会话将始终是最新的任何更改。

修改

根据您的评论,如果数据是从您无权访问的第三方来源中提取的,并且您需要确保在每次加载页面时更新数据,那么是的,AppController的beforeFilter()是很好。

但是,如果您只在某些页面或某些元素上使用它,则可以调用更新,或者通过元素的requestAction调用。

答案 2 :(得分:0)

我更喜欢获取实时数据而不是会话数据

var $uses = array('User');

function beforeFilter(){
    $id = $this->Auth->user('id'); //Using the session's user id is fine because it doesn't change/update
    $user_data = $this->User->findById($id);
    $user_fname = $user_data['User']['fname'];
    $this->set('fname', $user_fname);
}

//In your view
echo 'Welcome Back '. $fname . '!';