※コメントにて複数指摘を頂いている記事です。
ひとまず取り下げることはしていませんが、あくまで参考程度に留め置いてくださいませ。
前提
- FuelPHPの内の特定メソッドをcronで動かす
- 同じFuelPHP内にユーザーがアクセス可能なメソッドがある
- cron用のメソッドをユーザーとかクローラに踏まれたくない
大人しくFWごと分ければいいんですけどcronで動かすコントローラが一個だったので横着、もとい、サーバー容量の節約ということで上記課題をクリアします(´@ω@`)
Basic認証を使ってみる
public function before(){
parent::before();
switch (true) {
case !isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']):
case $_SERVER['PHP_AUTH_USER'] !== 'admin':
case $_SERVER['PHP_AUTH_PW'] !== 'test':
throw new HttpNotFoundException;
}
}
エラー部分についてBasic認証でよく見る書き方は以下
header('WWW-Authenticate: Basic realm="Enter username and password."');
header('Content-Type: text/plain; charset=utf-8');
die('このページを見るにはログインが必要です');
なんですが、
今回は間違えて訪れたユーザーにダイアログとか表示したくなかったので上の書き方にしました。
(上:FuelPHP、下:PHPなので少々構文違いますが、脳内で補完してください)
ところが
URLにIDとパスを組み込む形 http://admin:test@example.com が使えない!という事態に陥りました。
$_SERVERの中にIDもパスも入ってないんですな。そういえばFuelのアクセス先って全部index.php?そのせい?と思ったんですが、あんまり調べずに手を変えました。
動けばよかろうなのだ(`@ω@´)
アクセス元を判定してみる
cronは同サーバー内に設定する(これもFW都合でwget --spider使うんですけど)ので、自分と同じIPからのアクセスなら通常処理、そうでなければ404という形に書き換え。
public function before(){
parent::before();
if($_SERVER['REMOTE_ADDR']!=$_SERVER['HTTP_HOST']){
throw new HttpNotFoundException;
}
}
サーバー内からwget打ったらこれで動いたんでオッケーオッケー。