CakePHP身份验证用户信息

CakePHP身份验证用户信息,php,session,cakephp,variables,authentication,Php,Session,Cakephp,Variables,Authentication,在我看来,我正试图显示当前登录用户的信息,并已计算出我可以通过使用 echo "Welcome back " .$this->Session->read('Auth.User.username'). " 这将显示用户名,我可以使用相同的方法显示该数据库行中的其他字段,但是其他一些字段可以随时更新,但在用户页面上不会更新,直到他们注销并再次登录 这是正确的方法吗?或者这是一种更好的方法,在AppController中的beforeFilter()中添加一些代码以继续更新每个页面加载上

在我看来,我正试图显示当前登录用户的信息,并已计算出我可以通过使用

echo "Welcome back " .$this->Session->read('Auth.User.username'). "
这将显示用户名,我可以使用相同的方法显示该数据库行中的其他字段,但是其他一些字段可以随时更新,但在用户页面上不会更新,直到他们注销并再次登录


这是正确的方法吗?或者这是一种更好的方法,在AppController中的beforeFilter()中添加一些代码以继续更新每个页面加载上的变量吗?

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

这是未经测试的,但似乎它应该可以工作-然后您的会话将始终是最新的任何更改

编辑:

根据您的评论,如果数据是从您无权访问的第三方源提取的,并且您需要确保在每次页面加载时都对其进行更新,那么是的,AppController的beforeFilter()就可以了


但是,如果您只在某些页面或某些元素上需要它,那么您可以调用update,或者通过元素的requestAction来调用。

如果数据库是从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随时获取数据。

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

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 . '!';

我看到的问题(尚未测试)是,数据没有通过此应用程序更改,数据库是从另一个应用程序更新的,我假设此解决方案仅在cakephp表单save…@medoix-这在您的问题中值得一提。您还应该使用h()这看起来很完美,但是我遇到了以下错误-在非对象上调用成员函数findById()。我更新了答案,将用户模型包括在appController中。@TimJoyce,为什么您更喜欢获取实时数据,而不是会话,您能解释一下吗?@mgPePe如果您的用户对其用户记录进行了更改,则在销毁并重新创建会话之前,这些更改不会反映在会话中。如果用户将其名字从Frank更改为Al,会话仍会说Frank,直到会话刷新为止。@TimJoyce--但是,我刚刚注意到--如果您登录,然后更改DB中的值,并调用
$this->Auth->user()
它将是旧信息。这意味着它仍然不会影响数据库,因此使用它也没有真正的优势。这也可以做到这一点,但我得到一个致命的错误:调用中的非对象上的成员函数field()。您必须使用CakePHP文档中详述的
$uses
变量在AppController中包含您想要使用的模型