この記事を三行にまとめると
同じことをCakePHP3でやってみたいと思いますフォームからログインするとこだけ修正します
実はよく分かっとらんです
以前、CakePHP2で複数のカラムでログインする方法を書いたことがありました。
複数のカラムでログインできるようにしたいんですけど(CakePHPのAuthで)
複数のカラムってのは、例えばメールアドレスとユーザーIDのどちらを入力してもログインできるみたいなことです。TwitterやFacebookのログイン画面もそんな感じですよね。
TwitterやFacebookがどういう処理をしてるかは分かりませんが、僕の場合はとりあえず認証が通るまで繰り返しデータベースにアクセスするというやり方を採用しました。
上記の記事ではそれをCakePHP2系で実装しましたが、今回は同じことをCakePHP3でやってみたいと思います。まあ、ほとんどCakePHP2と同じですけどね。
今回はフォームからログインするとこだけ修正します。
コアライブラリの中にある「FormAuthenticate.php」っていうファイルをAppフォルダの方にコピーします。
ファイルの中に「authenticate」というメソッドがあるんですが、その中を見るとこんな風になってる。
これだと「username」と「password」の一回だけしか認証チェックしないので、複数カラムに対応できるように書き換えてみます。
「subFields」という設定項目を作りました。認証に使いたいカラムをここに入れれば、ログインが成功するまで認証チェックを繰り返します。
subFieldsの設定はコントローラーで行います。
例えばUsersController.phpで、emailとuser_idという二つのカラムでログイン処理を行う場合。
まずemailフィールドで認証を行い、失敗したら次はuser_idフィールドで認証を行います。user_idの認証も失敗した時点でログインエラーになります。
前回の記事でも言いましたけど、未だにカラムって言うべきなのかフィールドって言うべきなのかが分かっておりません。というか、最近PHPを覚えたての人に「こういうとき何て言うのが正式なんですか?」とか「その言い方ならどのエンジニアに対しても通じるんですか?」みたいな質問を時々受けるんですけど、いざ聞かれると答えに困るね。
例えば変数に値を入れることも、「代入」って言わないと通じないのか、「入れる」で大丈夫なのか。あるいは「セットする」「渡す」「突っ込む」「ぶっこむ」などでも良いのか。最近、改めてその辺がよく分からなくなってきております。
今日の記事に関しても「コアライブラリ」って言い方が正しいのか、実はよく分かっとらんです。
その他のCakePHP3を触ってみましたの記事はこちら
まとめという名の箸休め
複数のカラムでログインできるようにしたいんですけど(CakePHPのAuthで)
複数のカラムってのは、例えばメールアドレスとユーザーIDのどちらを入力してもログインできるみたいなことです。TwitterやFacebookのログイン画面もそんな感じですよね。
TwitterやFacebookがどういう処理をしてるかは分かりませんが、僕の場合はとりあえず認証が通るまで繰り返しデータベースにアクセスするというやり方を採用しました。
上記の記事ではそれをCakePHP2系で実装しましたが、今回は同じことをCakePHP3でやってみたいと思います。まあ、ほとんどCakePHP2と同じですけどね。
今回はフォームからログインするとこだけ修正します。
コアライブラリの中にある「FormAuthenticate.php」っていうファイルをAppフォルダの方にコピーします。
/vendor/cakephp/cakephp/src/Auth/FormAuthenticate.php
→ /src/Auth/FormAuthenticate.php
ファイルの中に「authenticate」というメソッドがあるんですが、その中を見るとこんな風になってる。
//FormAuthenticate.php
public function authenticate(Request $request, Response $response) {
$fields = $this->_config['fields'];
if (!$this->_checkFields($request, $fields)) {
return false;
}
return $this->_findUser(
$request->data[$fields['username']],
$request->data[$fields['password']]
);
}
これだと「username」と「password」の一回だけしか認証チェックしないので、複数カラムに対応できるように書き換えてみます。
public function authenticate(Request $request, Response $response) {
$fields = $this->_config['fields'];
if (!$this->_checkFields($request, $fields)) {
return false;
}
$fieldArray[] = $fields;
//複数のフィールドでログイン判定する場合
if(!empty($this->_config['subFields'])) {
$subFields = $this->_config['subFields'];
foreach($subFields as $sub) {
$fieldArray[] = [
'username' => $sub,
'password' => $fields['password'],
];
}
}
//ユーザー情報が取れるまで認証を繰り返す
foreach($fieldArray as $array) {
$this->_config['fields'] = $array;
$user = $this->_findUser(
$request->data[$fields['username']],
$request->data[$fields['password']]
);
if(empty($user)) {
continue;
}
return $user;
}
}
「subFields」という設定項目を作りました。認証に使いたいカラムをここに入れれば、ログインが成功するまで認証チェックを繰り返します。
subFieldsの設定はコントローラーで行います。
例えばUsersController.phpで、emailとuser_idという二つのカラムでログイン処理を行う場合。
//UsersContller.php
class UsersController extends AppController {
public initialize() {
parent::initialize();
$this->loadConponent('Auth', [
'authenticate' => [
'Form' => [
'fields' => ['username' => 'email', 'password' => 'password'],
'subFields' => ['user_id']
]
]
]
}
}
}
まずemailフィールドで認証を行い、失敗したら次はuser_idフィールドで認証を行います。user_idの認証も失敗した時点でログインエラーになります。
前回の記事でも言いましたけど、未だにカラムって言うべきなのかフィールドって言うべきなのかが分かっておりません。というか、最近PHPを覚えたての人に「こういうとき何て言うのが正式なんですか?」とか「その言い方ならどのエンジニアに対しても通じるんですか?」みたいな質問を時々受けるんですけど、いざ聞かれると答えに困るね。
例えば変数に値を入れることも、「代入」って言わないと通じないのか、「入れる」で大丈夫なのか。あるいは「セットする」「渡す」「突っ込む」「ぶっこむ」などでも良いのか。最近、改めてその辺がよく分からなくなってきております。
今日の記事に関しても「コアライブラリ」って言い方が正しいのか、実はよく分かっとらんです。
その他のCakePHP3を触ってみましたの記事はこちら
まとめという名の箸休め