 
		
							この記事を三行にまとめると
同じことを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を触ってみましたの記事はこちら
まとめという名の箸休め


