ようこそゲストさん

CPA-LABテクニカル

2008/02/08(金) AuthComponentの使い方

基本的な使い方:CakePHP1.2 AuthComponentで会員登録サイトを作る [1]

Authコンポーネントとは

会員制サイトや管理人用として、認証を利用したいときに使用する

特徴

パスワードはハッシュにて不可逆暗号化される。CakePHPの暗号化ハッシュデフォルトは、SAH1
デフォルトでは、usernameとpasswordだけの認証だが、独自のルールを設定できる。
(例)アクティブユーザーか否かのフィールド is_active=1 のユーザーであれば、認証する、みたいな。
(例)ユーザーの権限によって、そのアクセスするページ(アクション)は、mangerクラスでないと見られない。→ フィールド class = maneger の人だけ認証する、みたいな。

必要なもの

usersテーブルに、「id」「username]「password」フィールドを設定する。
(いずれも名前は変更可能。上記の独自ルールを設定したい人は、そのためのフィールドを設定する。)
model不要
認証が必要なコントローラーのクラスで、authコンポーネントを読み込む
var $components=array('Auth');

最初のスーパー管理者用パスワードはどうやって設定する?


AuthComponentのパスワード暗号化。登録注意点。CakePHP1.2bを参照。


主なデフォルト設定

いずれも変更可能。

メンバ変数何者?デフォルト値
$allowedActions(array)要認証コントローラーの中でも、認証が必要ないアクションのリストarray()
$loginActionログインアクション名:login
$userMOdelモデル名User
$fieldsフィールド名(array)username,password
$autoRedirectログイン後元のページに戻る(リダイレクト)true(yes)
loginRedirect元のページがない場合のリダイレクトページnull


3つ以上の組み合わせも、追加的条件を組み合わせて出来るが、ハッシュで暗号化されるのは、passwordのみ。

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/061/tb/
  • 【CakePHP】AuthComponentについてのまとめ 【ざっくり基本編】 ねねとまつの小部屋
    CakePHPの1.2.0.6311-betaでの話です。CakePHPの1.2になってから、沢山の便利な機能の追加がありました。そのうちのひとつのAuthComponentについて、まだ、日本語の資料が少ないので、まと...
  • 【CakePHP】AuthComponentについてのまとめ その2【ちょっとしたコツ編】 ねねとまつの小部屋
    【CakePHP】AuthComponentについてのまとめ 【ざっくり基本編】 の続きです。CakePHPの1.2.0.6311-betaでの話。暗号化のタイミングとvalidation前回のソースをみるとControllerの処理に暗号化の処理が...

2008/02/08(金) formヘルパーをテーブルなしモデルで使用するとエラーの回避方法CakePHP1.2b

はてブ情報 はてブに登録 はてブ数 cakephpspok
テーブルを使用しない、useTable=false;の時に、viewにてformヘルパーを使用すると以下のようなエラーがでる。(デバッグモード1以上)
(FormHelper::create) Unable to use model field data. If you are using a model without a database table, try implementing schema() [CORE\cake\libs\view\helpers\form.php, line 124]
(Model::getColumnType) Unable to locate model field data. If you are using a model without a database table, try implementing schema() [CORE\cake\libs\model\model.php, line 959]
なかなか日本語情報がなく、googleディスカッションで、なんとか手がかりをみつけた。
ようは、tableを使っていなくても、テーブルのスキーマ情報を登録しておけ、とのこと。
ただ、登録すべきスキーマ情報をどのようにすべきかの確たる情報がない。
で、以下のように最低限のスキーマ登録をやってみたら、エラーはでなくなった。

var $useTable=false;
var $_schema = array('id' => array('type' => 'integer'));



なお、googleディスカッションでは、開発責任者の方自らが、質問に答えていました。
nate

I'm guessing based on the error that you're trying to use a model
which is not attached to a table to create the form. In one of your
controllers, take a model that *is* attached to a table and try
something like the following:

pr($this->Model->schema());
die();


That should give you an idea on how to implement schema().
try implementing schema?
ようは、他のテーブルを使っているコントローラーでスキーマ情報をプリントアウトして、それを参考に、当該テーブルなしモデルでもスキーマを登録せよ、ということらしい。

Cake1.2bのお話。

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/057/tb/

Paginatorの使い方。CakePHP1.2

Paginatorは設定項目が多くてたいへんなので覚書として書いておいた。ページングがとても簡単に扱えるのはたいへん助かる。
なお、こちらも詳しい(CakePHP:ページングを試す)のだけれど、せっかくソースも読んでみたので覚書。
バージョン:CakePHP1.2beta
こちらも参考:PagenatorでPaginateしてみた。

Paginatorとは

データベースからたくさんのデータを引っ張ってきた時、一度に画面に出すと大変なので、自動的にページ分割をしてくれる機能。
prev<< 1 | 2 | 3 | 4 | 5 >>next
というやつ。

あくまでもデータベースから直接引き出せる情報についてのみ

例えばいったんデータベスから大量に引き出して加工してしまった配列そのものをページングしようとしてもできない。なぜならば、Paginatorは
  1. データベースからの出力用を分割し(SQLのlimitステートメント)
  2. CakePHPで自動認識できるページリンクURLを作成する
という検索と表示の2つの機能からできているから。

だから、
1の機能のために、データベース検索条件をfindAllでなく、Paginatorに渡す(検索)
2の機能のために。表示用PaginatorにURL用のデータを渡す(表示)
という2つの作業が必要になる。これが結構似ているものだから、最初はとまどった。この区別をつけておかないとあとで混乱する。
基本的に、1の検索機能は、controller.phpのfunction paginatorの役割であり、2の表示部分は、paginatorヘルパーのfunction群の役割である。

表示リンク形式

http://example.com/cake/~/page:3/sort:value/derection:asc/limit:10
という形で、page,sort,derection,limitが計算される。

1. 検索機能へのパラメータ渡しと実行方法

自分(this)のpaginateメンバ変数に、パラメータを多重配列でセットする。


簡単に言えば
findAllに渡す代わりに、paginatorに渡す
というだけ。findAllよりもたくさんのパラメータを渡すことができるが、既存のfindAllをpaginatorに置き換えるだけで、十分に動く。


書式
$this->paginate=array(
    'conditions' => array(検索条件),
    'fields' => array(取得するカラム),
    'page' => int(数値,最初に表示するページ。デフォルトは1,'last'(小文字)も可*1),
    'limit' => int(数値:showでも可。デフォルトは20),
    'sort' => string(ソートkey:order*2 でもよい。重なった場合はsortが優先される。),
    'direction' => string(asc or desc:デフォルトはasc)
    'recursive' => findAllに与える。
 );
どのパラメータも必須ではない。設定されない場合はデフォルト値または全文検索となる。
tips
カレントのモデル以外の検索条件の設定であれば、上記のパラメータを
$this->paginate=array('モデル名',array(上記の多重配列))
としてやれば設定できる。(uses設定は必要)


上記のように$this->paginateに設定したら、
$this->paginator();
とPaginatorを呼び出すと、その返り値が、表示用の配列*3となる。したがって、
$this->set('example',$this->paginator());
として、viewに情報を渡してあげるのがよいでしょう。

追加的なパラメータの渡し方

なお、$this->paginator();には、さらにパラメータを設定できる。
$this->paginator(
    object(自分以外のモデルを指定できる*4*5省略可)。*6
    scope(検索条件を配列で与える)*7,
    whitelist*8
 );
以下のようなして方法が可能である。
$this->paginator( array('id' => '5') ) ※検索条件のみを配列で与える。
$this->paginator(  array('id' => '5'),whitelist ) ※検索条件とwhitelist
$this->paginator( 'モデル名', array('id' => '5') ) ※モデル名も加えることができる
$this->paginator( 'モデル名', array('id' => '5'),whitelist ) 
$this->paginateでoptionを設定し、さらにメンバ関数呼び出しの時に$this->paginator(array(検索条件))とした場合は、最後の条件で上書きされる。

ソート時の留意点

$this->paginate=array(検索条件)と
$this->paginator(array(検索条件))の違いは

パラメータのデフォルトとして認識されるかどうかである。$this->paginate=array(検索条件)で登録するとデフォルトとなる。

このことは特にソート条件に大きな影響を及ぼす。後から、柔軟にソート条件を変えたい場合は、デフォルト登録せず、関数の引数にしたほうが無難だろう。*9

どのような結果が返ってくるか。


最終的には、
findAll($conditions, $fields, $order, $limit, $page, $recursive);

の結果を返してくれる。
Hack!
ちなみに、そのモデルでfunction paginateを定義しておくと、そちらで処理される(引数は同じ)。そのモデルだけで使うパラメータ、もしくは絶対に使ってはいけないパラメータをここでハックする、ということができるようになっているのでしょう。

remember
表示用のPaginatorヘルパーは、$this->paginateを実行すれば自動的に呼び込まれるので、明示的に呼んでおく必要はない。(もちろん、呼んでおいて構わない)。

実行後に参照可能なパラメータ


この処理後、以下のパラメータをセットしてくれている。
$this->paramas['paging'][モデル名]=array(
  'page'		=> あなたが指定したページ,
  'current'	=> 現在のページ,
  'count'		=> 全レコード数,
  'prevPage'	=> 前ページがあればtrue,なければfalse,
  'nextPage'	=> 次のページがあればtrue、なければfalse,
  'pageCount'	=> 全ページ数,
  'defaults'	=> あなたが最初に$htis->paginateで設定したoption,
  'options' => 今回実行されたoption
)
このパラメータを参照すれば、どのような結果になったかの概略を知ることが出来る。

表示

上記でようやく、データが揃った。そのページの表示は通常と同じ。
あとは pre << 1 | 2 | 3 | >>nextみたいな表示は、viewでpaginatorヘルパーを使用する。
その例は、こちら。PagenatorでPaginateしてみた。

*1 : 最終ページよりも大きい数値を指定した場合は、last指定と同じとなる。

*2 : orderの場合はorder=array('key'=>'direction')で指定しなければならない。

*3 : findAllと同じ形式

*4 : モデル名でもよいし、オブジェクトそのままでもよい。省略時は自分のモデル。

*5 : モデル名.アソシエーション名とすることもできるようだ(効果よくわかりません)

*6 : モデル名.フィールド名としての指定も可

*7 : 例:array('value'=>'5')

*8 : whitelistは、URLから渡されたパラメータのうち、有効にするキーを設定する。これを設定しない場合は、「sort(order),limit(show),page」以外のキーは無効となる。セキュリティを考えれば、わかる人以外は、ここを設定してはいけない。引数として渡す場合は、この設定をしなくても処理してくれる。あくまでもURLからの入力に対してものである。

*9 : ただし、ページ指定とlimitは強制的に、1と20にデフォルト設定されている。


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/053/tb/
  • CakePHP使い方 CPA-LABテクニカル spok
    Paginatorの使い方(データ抽出編)Paginatorの使い方2(表示編)
  • Paginator参考リンク集 CakePHPを本気で勉強
    CakePHP1,2にはページングの機能があると聞き使ってみることに。始めて利用してみましたが、便利すぎますね。自分でComponentにページングの関数を書いていましたが馬鹿馬鹿しくなってしまいますよ。 以下はPaginatorを使用する上で参考になっ...