1. TOPTOP
  2. Webサービス
  3. CakePHP

CakePHPの参考書を何回も何回もながめいたら問題と答えが同時に見えてきた。 $this->Auth->allow(‘add’);について

|

先日、CakePHPで分からないことが発生!問題の切り分けができずに困ってます…。(新しいタブで開く)という記事を書きました。

問題の切り分けすらできない状態だったんですが、しばらく放ったらかしにして時間を置いて、参考書をじーっと眺めていたら、問題が見えてきました!しかもさらに時間をかけて読み込んでみたら、答えが分かってきた!。

問題の箇所

参考書の箇所で言うと、P114です。コードで言えば、こんな感じ。その下に画面を付けておきましょう。よくあるログイン画面を写経して作りました。

Sample2/View/Users/login.ctp(ログイン画面)

<h1>サンプル2</h1>

<h2>ログイン</h2>

<?php echo $this->Form->create('User'); ?>

<?php echo $this->Form->input('username'); ?>

<?php echo $this->Form->input('password'); ?>

<?php echo $this->Form->end(' ログイン '); ?>

画面にするとこんな感じ。ここから先、緑色の「ログイン」ボタンを押すだけでは、先に進むことはできません。

login_cake

ログイン画面を作ったのは良いんですが、よく考えてみたら、「一番最初にログインするのってどうするの?」という問題にぶち当たります。

ログイン画面でログインできるのって、そもそもユーザ名やパスワードが何か登録されているからなんですよね。

前回のブログ(新しいタブで開く)では、「画面遷移ができない(泣)」という漠然とした問題だったんですが、「一番最初のログインはどうする?」という具体的な問題に切り替えることができました。下記は関連する引用です。

これは今回通常時に実行してはいけないものですが、Authコンポーネントの追加設定で「認証なしで表示を許可するアクション」の設定です。もしデータベースに最初の管理者が登録されていないと、管理者サイトに永久にログインすることができませんので、この「//」を消去して…

問題の解決方法

1.コメントアウトを外して「認証なしで表示を許可するアクション」の設定

上記の引用にもとづいて関連するController(Sample2/Controller/Userscontroller)をコードで表すと、次のようになります。

/**
* beforeFilterコールバック
*/
public function beforeFilter(){

  //ログインなしでアクセス可能なページを列挙
  $this->Auth->allow('add');
}

元々は、// $this->Auth->allow(‘add’);となっていますが、‘//’(コメントアウト)を外してやります。

2.ビューテンプレートのedit.ctpを作る

ビューテンプレートのedit.ctpを作ってください。先ほどコメントアウト外したアクセス可能なページは’add’ですが、ファイル名はあくまで’edit’で構いません。UsersController.phpでユーザ追加のメソッドである、add()を次のように定義しているからです。

/**
* ユーザ追加
*/
public function add() {

   //addはeditと同じ処理。ただしidは無指定
   return $this->edit();
}

3./users/addにアクセス

1.2まできたらお膳立ては出来上がりました。ブラウザのアドレスを(サーバー名)/sample2/users/add にして、アクセスしてみてください。
すると、あ~ら不思議!ユーザ名もパスワードも未登録なのに、ログインした人しか見れないはずの管理者画面に到達することができました。

login_cake2

この状態でフォームに、最初のユーザ名パスワードを登録してください。

4.コメントアウトを元に戻す

当然のことながら、こんな「超法規的な措置」は最初の1回だけです。1.で行ったコメントアウトは元に戻しましょう。これ以降は最初に登録したユーザー名とパスワードでもってログインしてください。

〔前の記事〕

〔参考サイト〕