AuthComponentを利用する – CakePHP3でサイト開発 Part.2


DSC02071

前回のおさらいと今回の概要
このシリーズは、CakePHP3 系で web サイトを開発する一連の流れの解説になります。前回は composer を利用して CakePHP3 ベースのアプリケーションを作成し、最低限必要なデータベースの設定を記述しました。また、 environment plugin を導入して後で苦労しないように開発環境 / 本番環境の設定を自動で振り分けるように準備し、gitの管理から大切な情報を除外しました。

連載第2回である本記事は、CakePHP3 の標準機能にある AuthComponent を用いて認証ロジックをアプリケーションに加え、会員制サイトや管理画面のようにログインが必要となるサイトの構築方法を記述します。

AuthComponent の利用

認証ロジックはサイト全体で利用したいので、AppController に AuthComponent の利用を記述します。特定のコントローラーのみに認証ロジックを追加したい場合はそのコントローラーに記述してください。CakePHP3 公式マニュアル AuthComponentを参考に以下、パラメータを設定します。なお、authenticate には Form と Basic があり、今回は Basic 認証を利用しないので Form のみ記述しました。

AuthComponent の各パラメータ
  • loginAction: ログイン画面のコントローラーとアクション
  • loginRedirect: ログイン成功時にリタイレクトさせるコントローラーとアクション
  • authenticate: 各認証時に利用するモデルとフィールドセット
  • logoutRedirect: ログアウト後にリダイレクトさせるコントローラーとアクション
    デフォルトは loginAction を参照するので今回はそのまま

authenticate => Form => userModel にはテーブル名を指定するので複数形になります。CakePHP2 系ではモデル名は単数系なので注意が必要です。

ログイン処理の実装

ログイン周りは MembersController で管理するように記述しました。このままだと全てのコントローラー & アクションで認証が必要となるので、認証を解除したいページ(TOP ページや お問い合わせページ等)は解除処理を行う必要があります。なお CakePHP3 系の場合、ログインアクションは AuthComponent が自動的に認証解除してくれるので、それ以外に解除したいページを記述します。今回は about ページを認証解除しました。

CakePHP3 公式マニュアル 解除の記述方法

解除処理は beforeFilter() or initialize() に実装するとのことなので今回は initialize() に記述しました。

解除ロジックを記載したので、次はログイン処理を実装します。公式マニュアルにログイン処理が記載されているので、それを流用して記述します。公式マニュアルには、エンティティを作成してそれを Templete に渡す処理、patchEntity する処理が書いてありませんので追記しました。

CakePHP3 公式マニュアル ログイン処理

ログインフォームの作成

単純にフォームを記述します。今回は email と password で認証するように設定したので、それを Templete に記述します。なお、create() の引数には先ほど set した $member を渡します。

label 名を変更したかったので、$this->Form->input の第二引数に配列で渡しました。$this->Form->button() はデフォルトで submit ボタンになるので、今回はそのまま利用しました。その他のボタンの設定は以下に参考リンクを挙げます。

CakePHP3 公式マニュアル ボタンの設定

これでログイン処理は完了です。認証が必要なページ、不要なページをそれぞれログイン時、ログアウト時でアクセスしてみて挙動を確認してください。私は開発環境で問題なかったものの、本番環境でセッション周りのエラーが発生しました。それを解決した方法を次項に記します。

Session の管理

複数台のサーバ構成の場合、session はデータベースで管理するのが一般的ですが、今回は勢いよく開発しているのでローカルファイル管理のままでした。php の設定を確認すると、session ファイルが作成されるディレクトリの権限に nginx が含まれておりませんでした。所有者グループが apache であれば問題ないようなので、このディレクトリの権限を変更せずに nginx を apache グループに含めることで解決しました。ディレクトリの権限を変更すればいいのではと思うのですが、yum update で php が更新されると権限が元に戻ってしまうことがあったので、素直にデフォルトの設定を変更せずにグループに追加します。

反映させるためにいろいろコマンドを試したのですがどれもダメだったので、思い切ってサーバを再起動しました。再起動で反映されたので、一旦これにて対応完了としました。

終わりに
何か不明点があれば、サイト TOP のお問い合わせよりご質問ください。また、より CakePHP3 について詳しく知りたい方は、現在公式マニュアルの翻訳を行っていますので一緒にやりませんか?

CakePHP3 の公式マニュアルを翻訳する方法

Enjoy!!