ログインが必要な管理画面や会員制サイトを CakePHP で構築する場合、認証ロジックの実装が必要になります。その際、CakePHP 標準の AuthComponent を利用することで簡単に認証ロジックが実装できます。
AuthComponent の利用
認証ロジックをサイト全体で利用したい場合、AppController に AuthComponent の利用を記述します。特定のコントローラーのみに認証ロジックを追加したい場合はそのコントローラーに記述してください。CakePHP3 公式マニュアル AuthComponent を参考に、以下パラメータを設定します。なお、authenticate には Form と Basic があり、今回は Basic 認証を利用しないので Form のみ記述しました。
AuthComponent の各パラメータと記述例
public function initialize()
{
parent::initialize();
$this->loadComponent('Auth', [
// ログイン画面の URL
'loginAction' => [
'controller' => 'Members',
'action' => 'login',
],
// ログイン成功時にリタイレクトさせる URL
'loginRedirect' => [
'controller' => 'Members',
'action' => 'home'
],
//
'authenticate' => [
'Form' => [
'userModel' => 'Members',
'fields' => ['username' => 'email', 'password' => 'password']
]
],
// ログアウト後にリダイレクトさせる URL、デフォルトは loginAction を参照する
'logoutRedirect' => []
]);
}
authenticate => Form => userModel にはテーブル名を指定するので複数形になります。CakePHP2 系ではモデル名は単数系なので注意が必要です。
ログイン処理の実装
上記を AppController に実装することで認証を設定できましたが、このままだと全てのコントローラー & アクションで認証が必要となるので、認証を解除したいページ(TOP ページや お問い合わせページ等)は解除処理を行う必要があります。なお CakePHP3 系の場合、ログインに使用したアクション(loginAction に書いたもの)は AuthComponent が自動的に認証解除してくれるので、それ以外に解除したいページを下記のように記述します。今回は about ページを認証解除しました。
解除処理は beforeFilter() or initialize() に実装するとのことなので今回は initialize() に記述しました。
public function initialize()
{
parent::initialize();
$this->Auth->allow(['about']);
}
認証が不要なアクションの設定を記載したので、次はログイン処理を実装します。公式マニュアルにログイン処理が記載されているので、それを流用して記述します。公式マニュアルには、エンティティを作成してそれを Templete に渡す処理、patchEntity する処理が書いてありませんので追記しました。
public function login()
{
$member = $this->Members->newEntity();
if ($this->request->is('post')) {
$member = $this->Members->patchEntity($member, $this->request->data);
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
} else {
$this->Flash->error('メールアドレスかパスワードが間違っています');
}
}
$this->set(compact($member));
}
ログインフォームの作成
単純にフォームを記述します。今回は email と password で認証するように設定したので、それを Templete に記述します。なお、create() の引数には先ほど set した $member を渡します。
<?= Form->create($member) ?>
<fieldset>
<legend>ログイン</legend>
<?= $this->Form->input('email', ['label' => 'メールアドレス']) ?>
<?= $this->Form->input('password', ['label' => 'パスワード']) ?>
<?= $this->Form->button('ログイン') ?>
</fieldset>
<?= Form->end() ?>
label 名を変更したかったので、$this->Form->input の第二引数に配列で渡しました。$this->Form->button() はデフォルトで submit ボタンになるので、今回はそのまま利用しました。その他のボタンの設定は以下に参考リンクを挙げます。
これでログイン処理は完了です。認証が必要なページ、不要なページをそれぞれログイン時、ログアウト時でアクセスしてみて挙動を確認してください。
終わりに
何か不明点があれば、サイト TOP のお問い合わせよりご質問ください。また、より CakePHP3 について詳しく知りたい方は、現在公式マニュアルの翻訳を行っていますので一緒にやりませんか?
Enjoy!!