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を触ってみましたの記事はこちら
まとめという名の箸休め
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください