CakePHPでベーシック認証を使うなら、Securityコンポーネントが超便利
CakePHPでベーシック認証を使うなら、Securityコンポーネントが超便利
え?CakePHPって最初からベーシック認証のコンポーネントがあるの?
どうやらあるみたいですね。Caker歴2年ちょい。今日まで知りませんでしたのでメモ。
appフォルダ直下app_controoer.php
app_controoer.phpは無ければ作ってください。appフォルダの直下ですよ。
class AppController extends Controller { var $components = array('Security');//Securityコンポーネントの呼び出し //beforeFilterで最初にこの処理を実行する //今回だと、最初にベーシック認証を指定する function beforeFilter() { parent :: beforeFilter(); $this->Security->loginOptions = array('type'=>'basic'); $this->Security->loginUsers = array('ユーザー名'=>'パスワード'); $this->Security->requireLogin(array('Hoge'=>'index'));//Hoge_controller.phpのindex function にベーシック認証をかける //$this->Security->requireLogin('*'); アスタリスクで全てのcontrollerとfunctionにベーシック認証をかける } }
開発途中でまだ誰にも見せたくない場合は全体にベーシック認証をかけるのもいいし、
マスター管理画面を簡易的に持たせるなら、マスター管理のcontrollerにだけ、ベーシック認証をかけるのもいいと思います。
一部訂正
CakePHPで作られたアプリケーション内全てをベーシック認証をかけるなら、以下で問題ないですが、
class AppController extends Controller { var $components = array('Security');//Securityコンポーネントの呼び出し //beforeFilterで最初にこの処理を実行する //今回だと、最初にベーシック認証を指定する function beforeFilter() { parent :: beforeFilter(); $this->Security->loginOptions = array('type'=>'basic'); $this->Security->loginUsers = array('ユーザー名'=>'パスワード'); $this->Security->requireLogin('*'); アスタリスクで全てのcontrollerとfunctionにベーシック認証をかける } }
マスター管理など、CakePHPのアプリケーションのうち、特定のコントローラー内だけこのベーシック認証かけるなら、app直下のapp_controller.phpに記述するのではなく、ベーシック認証をかけたいコントローラーだけに直接書きます。
例:マスター管理admins_controller.phpにだけベーシック認証をかける
つい忘れがちなのですが、class AdminsController extends AppControllerとなっているように、通常のコントローラーはAppControllerのextends(拡張)であるので、AppControllerに書けることは、通常のコントローラーにも書くことが出来るのです。
class AdminsController extends AppController { var $components = array('Security'); var $uses = array(); function beforeFilter() { $this->Security->loginOptions = array( 'type'=>'basic' ); $this->Security->loginUsers = array( 'ユーザー名'=>'パスワード' ); $this->Security->requireLogin(); } }
ある単体のコントローラーに対してベーシック認証を入れるならこちらが正解でしょう。
Security コンポーネントを使うと、formにワンタイムトークンがhiddenで入る
こちらのページを見るまで気がつかなかったのですが、確かに自動で入っているようです。
<div style="display:none;"> <input type="hidden" name="key" value="d2743d9299948ad1c47d3675377a41ed8c7ae33c" id="Token836315228" /> </div>
私はこのトークンが入ったからと言って 特に不具合は発生しなかったのですが、もしこのトークンによる不具合が発生した場合、
先ほどの function beforeFilter()の中にこちらを書き加えてトークンの生成を止めさせることも出来るそうです。
$this->Security->validatePost = false;