cakephperの日記(CakePHP, Laravel, PHP)


継続的WebセキュリティテストサービスVAddyを始めました!

2010-09-10

本番運用時は不要なDebug_kitなどを読み込まないようにするテクニック

本番時(debug=0)、Debug_kitは読み込まれてしまっても画面に表示しないようになっていますが、それでもコンポーネントの起動処理が発生するため無駄な処理が走ってしまいます。とはいえ、毎回本番デプロイする時に、Debug_kitの読み込み箇所を消すなんてこともできません。

CakeFestのワークショップソースコードを見てたら、タイトルのようなことをやってる箇所を発見。(ちなみにワークショップは参加してません)

http://github.com/cakephp/CakeFest-2010-Workshop/blob/master/app_controller.php

<?php
class AppController extends Controller {
  public $components = array('Session', 'Auth', 'RequestHandler');

  public function __construct() {
    if (Configure::read('debug')) {
        $this->components[] = 'DebugKit.Toolbar';
    }
  parent::__construct();
}

AppControllerのコンストラクタでdebug値を判定して、componentsプロパティに追加しています。

シンプルで良いですね。

2010-02-18

AuthComponentでUsers Table以外を使う時

小ネタ。 Cake1.2.6

HogeConpornentがHogeモデルを使ってる場合、認証画面をそのままHoge::login()って作るとうまく行かない。デフォルトで、Userモデルを見てしまうから。アクセスしても/users/loginに飛ばされるし。

beforeFileterなどで、下記の設定が必要

$this->Auth->userModel = $this->modelClass;

モデル名を直接指定したければ、modelClassを固定の文字列にすればOK


ということで、よく設定する内容はこんな感じ。

//認証エラーメッセージ
$this->Auth->loginError = 'ログインエラー。IDもしくはパスワードが違います。';

//アクセス権がない場合のエラーメッセージ 非表示
$this->Auth->authError = ' ';

//認証するフィールド名
$this->Auth->fields = array(
      'username' => 'loginid',
      'password' => 'password'
);

//アクセス制限しないアクション
$this->Auth->allow('');

//ログイン後の遷移先を固定
$this->Auth->loginRedirect = array('controller' => 'adminpanels', 'action' => 'top');

//Authで利用するモデルをUser以外に指定
$this->Auth->userModel = $this->modelClass;


さらに、ログイン後の遷移を完全固定するため、リファラー情報をloginアクション内で消してます。

function login() {
    //ログイン後に強制的に$this->Auth->loginRedirectの画面にリダイレクトさせるため、リファラ情報を消す
    $this->Session->delete('Auth.redirect');
}

2009-04-03

Authコンポーネントで、ログイン後の遷移先を固定する

cakephp 1.2.2を利用してます。

AuthComponentを使っている場合、ログイン後の遷移先を指定する場合、

UsersコントローラのbeforeFilterなどで

$this->Auth->loginRedirect = array('controller' => 'hoge',  'action' => 'view');

と指定しますが、セッション情報の中に、Authのリファラ情報が記録されている場合は、このリファラ情報が優先されてしまうため、ログイン後の遷移先を固定したい場合には不向きです。

(CakeBookにはこのことが書いてありませんが、authコンポーネントソースコードのコメントに下記内容が書いてありましたorz)

If this session value is not set, the user will be redirected to the page specified in $loginRedirect.

セッション情報の中にAuthのリファラ情報が記録されるのは、authコンポーネントを読み込んでるコントローラの画面にアクセスした時で、例えば認証成功後にしか見えないページAにアクセスしてログイン画面に戻された場合、ページAのurlがAuthのリファラ情報としてセッションの中に書き込まれます。


今回、ログイン時にセッション情報の中のリファラ情報を強制的に消す処理を加えることによって、ログイン後の遷移先を固定することにしました。

users_controller.phpにて


function beforeFilter(){
  $this->Auth->loginRedirect = array('controller' => 'hoge',  'action' => 'view');
}

function login(){
  $this->Session->delete('Auth.redirect');
}

他に何か方法があるよって言う方は教えてください〜