2011-01-17 13 views
0

私は '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. ユーザー

O ID3

O [email protected]

O group_id3

それは、ビューのページにリダイレクトする必要があります...しかし、それはない...

の$ this - を読んでいないようです> Session-> read( 'Auth.Student.id')、私はあなたがAuth.Userでのみこれを使うことができると思います。誰でも、SessionHelperを使って生徒のパラメータを読む方法を知っていますか?クエリを使用する必要がありますか?

ヒント

ありがとうございます。

Alf。

答えて

1

を参照してください。生徒が「form_activated」属性としていないか、フォームを満たしている場合、私はチェックしています。私はこれが良いアプローチであるかどうかわかりませんが、それは私が想像する唯一のものです。

第1に、セッションは永続データストアではありません。それはログアウト時に破壊されます。ログイン後のセッションデータへの変更は、何らかの理由で永続化して復元しない限り、次のログイン時には利用できません。

の$ this - を読んでいないようだ>セッション - >(「Auth.Student.id」)を読んで、私はあなただけAuth.Userでこれを使用することができることを推測し、誰もそれが可能性が方法を知っていますSessionHelperで学生のパラメータを読んでください。

あなたが何かを誤解することができることを(提供されたコード与えられる)を示しているアプリケーションのログインアクションの間にAuth.UserAuth.Studentの両方にアクセスしようとしています。

ログイン時、AuthComponentはデータベース(通常usersテーブルのレコード)のユーザーをセッション(通常Auth.User)にコピーします。

(脇:あなたはあなたのアプリケーションで$this->Auth->userModel = 'Student'を設定することで、わずかに、このデフォルトの動作を変更することができます。これは、Authコンポーネントは、Studentモデルからレコードを読み取るになるだろう - studentsテーブルをデフォルトで - ログイン時に、セッションにAuth.Studentの下に置きます。 )

そのため、上記のあなたのlogin()アクションの間、Authコンポーネントを使用すると、両方のStudentモデルを使用して)していなかった場合にのみAuth.User(またはAuth.Studentを設定する必要があります!

クエリを使用する必要はありますか?

そうではないように、セッションを「照会」できますが、これが解決策である可能性があります。

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']); 
      } 
     } 
    } 
} 

現在のMySQLと話の追加オーバーヘッドなしに頻繁にこの情報を取得するために$this->Session->read('Address.latitude')のようなものを行うことができます。

+0

本当にありがとうございます。これはcakePHPとPHPの私の最初のプロジェクトです。そして今、私はセッションがこのフレームワークでどのように動作するかを理解しています。 – alfizqu

+0

私はMySQLを使用しています、私はクエリを使用し、それは働いた。しかし、私はあなたが何を意味しているのか分かりませんし、セッションに情報を保存しています。セッションに関する学生の情報を入力することはできますか? – alfizqu

+0

嬉しいです。はい、私の更新された答えを見てください。 – deizel

0

を行うことで、ユーザIDを取得します。

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

http://book.cakephp.org/view/1264/user

+1

@alfizqu '$ this-> Auth-> user()'は '$ this-> Session-> read( 'Auth.User')'のラッパーです。読みやすくするには(コントローラーでのみ)、機能は同じです。 :) – deizel

+0

ありがとう!私はそれを考慮に入れます! :) – alfizqu

+0

こんにちは!私は$ this-> Auth-> user( 'group_id')を使用してユーザーの役割を取得し、「オブジェクト以外のユーザーの関数user()」というエラーメッセージが表示されました。それは$ this-> Session-> read( 'Auth.User.group_id')と同じですか?なぜなら、それが私のために働いていないからです! – alfizqu

関連する問題