開発案件でアクション毎に SSL でのアクセスを必須にしたかったので調べていたところ下記の情報がありました。

SSL経由でのアクセスを必須にする[CakePHP] YARETOKO「ヤレトコ」メインブログ

早速 cake/cake/libs/controller/components/security.php のソースを確認して検証してみました。

SSL でアクセスするアクションの指定

特定のアクションのみを指定したい場合
<?php
class UsersController extends AppController {

	var $components = array('Security');

	function beforeFilter() {
		$this->Security->requirePost('delete');
	}
}
?>
管理画面のみを指定したい場合
<?php
class UsersController extends AppController {

	var $components = array('Security');

	function beforeFilter() {
		if(isset($this->params[Configure::read('Routing.admin')])){
			$this->Security->requireSecure();
		}
	}
}
?>
全てのアクションを指定したい場合
<?php
class UsersController extends AppController {

	var $components = array('Security');

	function beforeFilter() {
		$this->Security->requirePost();
	}
}
?>

エラー時の処理

SSL 以外でアクセスされた場合の処理を指定します。

<?php
class UsersController extends AppController {

	var $components = array('Security');

	function beforeFilter() {
		$this->Security->requirePost('delete');
		$this->Security->blackHoleCallback = '_blackHole';
	}

	function _blackHole($error) {
		if ($error=="secure") {
			// SSL でリダイレクトさせるなどの処理
			exit;
		}
	}
}
?>

SecurityComponent::blackHoleCallBack メンバ変数にエラー時のコールバックさせたいメソッドを指定します。
_blackHole メソッドで $error==”secure” としているのは SecurityComponent には SSL のチェック以外に、トークンチェック、ログインチェックなどもあり、全て同じコールバック関数にエラー処理がされるので条件分岐させます。

また、コールバック内で exit しないと通常実行されるアクションがその後実行されるので、実行させたくない場合は exit を入れる必要があります。

参考
Cookbook :: 1.2 Collection :: マニュアル :: 組み込みのコンポーネント :: Security Component :: Usage

コールバック関数の処理のところで書いたように Security コンポーネントのソースを見ていると結構使えそうなものがあるので時間を見つけて検証していこうと思います。

関連する投稿