2012-11-18 10 views
14

ユーザーモデルでデータを更新すると、認証データは更新されません。cakephp 2.0認証データを更新するには?

ユーザーモデルを更新するときに、$ this-> Auth-> user()が返すデータを "更新"するにはどうすればよいですか?

と私は

ます$ this-> Auth->ログイン($データ)を使用する必要はありません。フレームワークのデザインを壊すことなく、

$this->Session->write('Auth.User', $data); 

のCakePHP 2.xの前に、あなたがモデルでこれを行うことはできません。

セッションなどに更新されたデータを書き込み、私のユーザーテーブル

答えて

24

次の行を試しました。その作品はよく、私は次の行に

$this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id'))); 
+1

あなたは認証コンポーネントを回避しようとしないでください。そこにあるセッションキーが変更された場合、あなたはすぐに解決します。 – func0der

+0

'$ this-> Auth-> login($ newUserData);' func0derの答えを参照してください。 –

+0

そのような何かもう一度、もう一度ユーザーを認証する必要があります。既にユーザーがログインしています。これは推奨された方法です。@deceze [〜deceze] – AnNaMaLaI

7

を更新した後。

CakePHP 2.xでは、モデルからセッションコンポーネントをロードして更新できます。

+1

。フィードバックをお願いします。 –

+0

私はそれをしなかったが、それは同じ答えです、私は@ Annamalai.Somasundaramに与えている:http://stackoverflow.com/questions/13440820/cakephp-2-0-how-to-update-auth- data/13443607#comment63042801_13559136 – func0der

5

evert0ns答えが正しい。しかし、AuthComponent :: login()を使うべきです。なぜなら、データはAuthComponent内に保存され、毎回セッションからフェッチされないからです。

私は数日前に問題が発生しました。

// AppController.php 
/** 
* Renews current user data, e.g. in case of an email address change while being logged in. 
* 
* @param array $newUserData 
* @return void 
*/ 
    protected function renewUserSession($newUserData){ 
      if(!isset($newUserData) || empty($newUserData)){ 
        return; 
      } 

      // We need to fetch the current user data so custom indexes are copied 
      $currentUserData = $this->Auth->user(); 
      if(!isset($currentUserData) || empty($currentUserData)){ 
        return; 
      } 

      // Merge old with new data 
      $newUserData = array_merge($currentUserData, $newUserData); 

      // Login with new data 
      $this->Auth->login($newUserData); 
    } 

出典:my paste

あなたのAppControllerでこれを入れてください。このメソッドは、現在のユーザーデータと新しいユーザーデータをマージして、既存のカスタムインデックスを保持することに特化しています。私はこれが必要でしたが、あなたはそれを残すことができます。 更新されたユーザーデータをメソッドのパラメーターとして指定します。モデル検索フォームにはありません。 例:

$data = array(
    'User' => array(
     'username' => 'bla', 
     'passwort' => 'fu', 
     'email' => '[email protected]' 
    ) 
); 

// Wrong 
$this->renewUserSession($data); 

// Right 
$this->renewUserSession($data['User']); 
+0

'array_merge()'がハイライトになります。 – Fr0zenFyr

+0

@ Fr0zenFyr私はここから私にあなたが欲しいものを手に入れません。 ^^ – func0der

+0

実際のセッションと新しい値を組み合わせるために使われる 'array_merge()'は、何も上書きされないようにあなたの解決策のヒーローです。乾杯! – Fr0zenFyr

0

を書き込んだユーザーのデータを変更した後、私を 形成私はUserモデルでafterSave機能を使用してこの問題を解決しました。ユーザーモデルをどの領域からでも更新するとうまくいきます。私のコードは以下の通りだった:

class User extends AppModel { 
    ... ... ... 
    public function afterSave($created, $options = array()){ 
     parent::afterSave($created,$options); 

     //updating authentication session 
     App::uses('CakeSession', 'Model/Datasource'); 
     CakeSession::write('Auth',$this->findById(AuthComponent::user('id'))); 

     return true; 
    } 
    ... ... ... 
} 
+1

ユーザーセッションがブラウザセッションから変更されたらどうなりますか?シェルスクリプトやcronjobのように? –

+1

@ Annamalai.Somasundaram答えにコメントを見る。セッションを直接変更しないでください。 – func0der

0

私はfunc0derの答えは良いですが、それを改善することができると思う:

protected function renewLogin() { 
    if(!empty($this->Auth->user())) { 
     $this->loadModel('User'); 
     $this->User->contain(false); 
     $user = $this->User->read(null, $this->Auth->user('id'))['User']; 
     unset($user['password']); 
     $this->Auth->login($user); 
    } 
} 

あなたのAppController.phpにこれを追加し、変更した後に任意のコントローラからそれを使用することができますログインしたユーザー

私はそれがずっときれいだと信じていますが、それはデータベースへのアクセスを意味していますが、十分に頻繁に実行されることはないと思います。

「ケーキ」のやり方を常に試みてください。また、セッション変数の編集などのショートカットは避けてください。それは長期的にあなたのために物事を容易にします。

あなたの意見をコメントして追加してください:)

0

私はこれを行うための簡単な方法があると思う:私がダウンして、これを投票し、ユーザーからのコメントを取得したいと思い

$user = $this->Auth->user(); 
$user['attribute'] = $newValue; 
$this->Auth->setUser($user); 
+0

これは2.xではありません! – mark