CakePHP3を触ってみました 〜複数のカラムでログインできるようにしたいんですけど〜

サッカーフィールド

おまとめ三行

同じことをCakePHP3でやってみたいと思います
フォームからログインするとこだけ修正します
実はよく分かっとらんです

以前、CakePHP2で複数のカラムでログインする方法を書いたことがありました。

複数のカラムでログインできるようにしたいんですけど(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を触ってみましたの記事はこちら
まとめという名の箸休め

まだコメントはいただけてないみたい……
 もしかしたら何か関連しているかも?