2014年1月24日金曜日

CakePHP2.x BASIC認証を使ってみた

色々あってCakePHPでBASIC認証を使うことに。パスワードを平文のままサーバに送って処理を
行うためセキュリティはあまりよろしくないとのことなので、ダイジェスト認証ももしかしたらやるかも
しれない。やらないかもしれない。

参考サイト

認証用のユーザーを登録するテーブルを作る


多分usernameとpasswordカラムがあればなんとかなる。

/*---------------------------------------------------------------------------*/
CREATE TABLE IF NOT EXISTS admin_user (
   username VARCHAR(64),
   password VARCHAR(64)
);
/*---------------------------------------------------------------------------*/

でも大抵管理ページのユーザー管理用に使うと思うので、参考サイトのようにそれなりにデータは
持っておいたほうがいいかも。

モデルを作成する


作成したテーブルを操作するモデルを作ろう。
今回は作成したテーブルからしてCakePHPのデフォルトから外れているのでモデルも外れる。

/*---------------------------------------------------------------------------*/
class AdminUser extends AppModel {
public function beforeSave($options = array()) {
$password = &$this->data['User']['password'];
password = AuthComponent::password($password);
return true;
}
}
/*---------------------------------------------------------------------------*/

Authコンポーネントをコントローラに設定する前に、
このモデルを使用して管理ユーザーを作っておくことをオススメする。
パスワード照合の際はハッシュ化された文字列で行うので、テーブル側にもハッシュ化済みの
文字列が入っていないと認証に失敗するからだ。

Authコンポーネントを設定する


AppControllerにAuthコンポーネントを設定する。

/*---------------------------------------------------------------------------*/
class AppController extends Controller {
public $components = array(
"Session",
"Auth" => array(
"loginAction" => array(
"controller" => "AdminUser",
"action" => "login",
"admin" => true,
),
"loginRedirect" => array(
"controller" => "applies",
"actopm" => "index",
"admin" => true,
),
"authenticate" => array(
"Basic" => array("userModel" => "AdminUser"),
),
),
);

public function beforeFileter()
{
$this->Auth->logoutRedirect = $this->webroot;
}
}
/*---------------------------------------------------------------------------*/

loginActionのコントローラに次で作成するコントローラを指定。
認証用のモデルに作成しておいたモデルを指定。

ログイン用コントローラを作成する


ログイン処理用のコントローラ。

/*---------------------------------------------------------------------------*/
class AdminUserController extends AppController
{
public $uses = array("AdminUser");

public function login()
{
if($this->Auth->login()) {
return $this->redirect($this->Auth->redirect());
}
else {
$this->Session->setFlash(
__('Username or password is incorrect'),
'default',
array(),
'auth'
);
}
}

public function logout()
{
$this->Auth->logout();
}
}
/*---------------------------------------------------------------------------*/

参考サイトをほぼもろパクリさ! 違いと言えばコントローラとモデル名?


これでちゃんとユーザーを作っていればBASIC認証ができるようになったはず。

0 件のコメント:

コメントを投稿