質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

Q&A

解決済

3回答

2092閲覧

cakePHP3 ログイン認証ができないです。。。identifyが常にfalseを返します

kipipipi

総合スコア60

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

0グッド

1クリップ

投稿2019/10/04 02:11

編集2019/10/07 10:01

こんにちは。またもやcakePHPにハマっています。。。
現在管理者用の仕組みを作ろうとしており
リンク内容
とドキュメント
リンク内容
を読みながら進めています。

また似たエラーの方々が多いようなので調べてみたのですが、同じ条件ではない(データベースの長さが足りないや、ハッシュ化ができていない)のようなものでばかりです。


望んでいる動作は、ログインができるようにしたい。
というシンプルなものです。初心者すぎて原因が追求できず困り果てています・・・。

以下汚いコードですが,
見た感じおかしい所にお気付きになりましたらお教えいただけると幸いです。
よろしくお願いします。


※上から
cakephpから見たSQL
sqlを直接見たとき
AppController.php
Admin.php
AdminsController.php


イメージ説明
イメージ説明

AppController.php

php

1 2<?php 3 4namespace App\Controller\Admin; 5 6use Cake\Controller\Controller; 7use Cake\Event\Event; 8 9class AppController extends Controller 10{ 11 12 13 public function initialize() 14 { 15 parent::initialize(); 16 17 $this->loadComponent('RequestHandler', [ 18 ]); 19 $this->loadComponent('Flash'); 20 21 $this->loadComponent('Auth',[ 22 'authenticate'=> 23 ['Form' =>['userModel' => 'Admin', 24 'fields' => ['username'=>'admin_name','password'=>'admin_pass'], 25 'finder'=>'auth'] 26 ], 27 'loginAction'=>['controller'=>'Admins','action'=>'login'], 28 'loginRedirect'=>['controller'=>'Admins','action'=>'home'], 29 'logoutRedirect'=>['controller'=>'Admins','action'=>'home'], 30 'storage'=>['className'=>'Session','key'=>'Auth.Admin'] 31 ] 32 ); 33 } 34} 35

Admin.php

php

1 2<?php 3namespace App\Model\Entity; 4 5use Cake\ORM\Entity; 6use Cake\Auth\DefaultPasswordHasher; 7 8class Admin extends Entity 9{ 10 protected $_accessible = [ 11 'admin_name' => true, 12 'admin_pass' => true, 13 'role' => true, 14 'delete_flg' => true, 15 'created' => true, 16 'modified' => true 17 ]; 18 19 public function findAuth(\Cake\ORM\Query $query,array $options){ 20 $query 21 ->select(['admin_name','admin_pass','role']) 22 ->where(['Admin.delete_flg'=>0]); 23 24 return $query; 25 } 26 27 protected function _setAdminPass($value){ 28 if(strlen($value)){ 29 return (new DefaultPasswordHasher)->hash($value); 30 } 31 } 32}

AdminsController.php

php

1 2 3 4 public function beforeFilter(\Cake\Event\Event $event) 5 { 6 parent::beforeFilter($event); 7 $this->Auth->allow('index'); 8 } 9 10 public function login(){ 11 12 if($this->request->is('post')){ 13 $admin = $this->Auth->identify(); 14 debugger::dump($admin); 15 if($admin){ 16 $this->Auth->setUser($admin); 17 return $this->redirect($this->Auth->redirectUrl()); 18 } 19 $this->Flash->error('ユーザー名またはパスワードが不一致です。ログインし直してください。'); 20 } 21 } 22 23 public function home(){ 24 25 }

変化(10/7)
ハッシュ化が上手くいっていないのかな?と思ったので、'toyota'をハッシュ化させて比較させてみたところ、一致するようです。(やり方はネットから拝借)
identifyがfalseしか返さない理由がますますわからなくなりました。。。

php

1 $hasher = new DefaultPasswordHasher(); 2 if($hasher->check('toyota','$2y$10$eKJY.uLSJDTuqnKplX0Cfe0uULaBBZVkJoQ2MrhUJLga6WRJOlnwu')){ 3 var_dump('一致'); 4 }else{ 5 var_dump('不一致'); 6 } 7 die;

環境
mac
mysql
cakephp3.8
php7.3.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2019/10/04 02:29

何を質問されているのかが分からないですがとりあえず、リダイレクトの前にdumpしているらしい箇所がありますが、そこの部分の意味を理解していますか?
kipipipi

2019/10/04 02:36

申し訳ありません、質問自体が抜けておりました。修正しますのでお待ちください。 質問についてのご回答ですが、$admin = $this->Auth->identify(); が何を返しているのだろうか?と思いデバックを差し込んでみました。 よろしくお願いします!
nojimage

2019/10/04 10:19

現在の状態について確認です。 ログインフォームは表示される。ログインアクション(AdminsController::login)は実行される。認証処理($this->Auth->identify)でユーザーが返ってこない。画面にPHPのエラーメッセージは表示されていない。 という状態で間違いないでしょうか。
kipipipi

2019/10/07 03:55

週末バタバタしておりご連絡が遅れました。申し訳ありません。 ログインフォームは表示でき、アクションも動いているようです。identifyが常にfalseを返すので状態です。画面にはidetifyがfalseの場合に表示されるように設定した自ら記入したエラー文が出る状態です。金曜、週末も少し挑戦しましたが、わかりませんでした。。。
nojimage

2019/10/08 01:15

AuthComponentの設定で、 'finder'=>'auth' を外してみたらどうでしょうか。それで通るならfindAuthに問題があることになります。
kipipipi

2019/10/08 01:54

?!認証通りました!!!! お手数ですが、何が起こったのでしょうか??(汗)
kipipipi

2019/10/08 03:04 編集

失礼しました。。。$this->Auth->allowで全て解除したままでした。先ほど$this->Auth->allowを消して、 'finder'=>'auth'を除いてログインしてみると You are not authorized to access that location. というエラー文が出現しました。これは私ではなく、cakePHPのデフォルトに含まれているエラー文かと思います。 さらに、debugger:dumpでidentify()を調べてみるとfalseが返ってきているようで、であれば私が設定した "ユーザー名またはパスワードが不一致です。ログインし直してください。" が表示されると思ったんですが、cakePHPが用意したエラー文が優先されている状態です。
guest

回答3

0

2つの間違いがあります。

AuthComponentの useModel の設定

useModel に指定するのはモデル名(テーブルクラス名)です。なので Admin ではなく Admins となります。

finderメソッドはTableクラスに書く

Model\Entity\AdminfindAuth メソッドを書いていますが、このクラスはエンティティクラスです。
findメソッドはテーブルクラスである Model\Table\AdminsTable に書きましょう。

CakePHP 3のORMでは、データの集合にアクセスするためのレポジトリー(Tableクラス)とデータの実態を扱うエンティティクラスで構成されています。2つの違いに気をつけてください。

参考: データベースアクセス & ORM - 3.8

投稿2019/10/04 04:17

nojimage

総合スコア957

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nojimage

2019/10/04 04:50

参考にされたサイトの記述自体が間違ってたんですね…
kipipipi

2019/10/04 06:38

毎回ご回答本当にありがとうございます!! 情報がやや古いなーと思ってはいましたが、やはりそこから相違があったのですね。。。 ご意見に従い、Adminsへ変更し、AdminsTableにfindAuthを移動してみたのですが、ログインできませんでした。。。他にもどこかにミスが隠れていそうです(泣)
nojimage

2019/10/04 10:26

あ、たぶんわかりました。 findAuthの ['Admin.delete_flg'=>0] を ['Admins.delete_flg'=>0] に書き換えてみてください。
kipipipi

2019/10/07 03:57

ご回答ありがとうございます。こちら試したのですが、やはり一致しないと弾かれました。。。 cakePHP難しいですね。。。(汗)
guest

0

Models/Entity/Admin.php の中で

protected function _setAdminPass($value){ if(strlen($value)){ return (new DefaultPasswordHasher)->hash($value); } }

_setAdminPass 時に DefaultPasswordHasher:hash を呼び出していますから、DB に記載されているパスワードが「真のパスワードから計算したハッシュ値であること」を前提としています。
実際のデータがそうなっていないので、そりゃ計算したハッシュ値が合致しないから認証エラーになりますね。

※CakePHP の標準の認証動作は、

  1. 認証フォーム上でユーザーID とパスワードを受け取る
  2. AuthComponent の設定に従い、対象となる DB のテーブルを決定する(UserModel, Fieldsを使う)
  3. UserModel の パスワードフィールドに対する setter を使い、平文のパスワードから変換を行う
  4. ユーザーID、(変換後の)パスワードで、対象の UserModel で合致するレコードを探す

 合致したレコードがあれば認証成功、なければ失敗

という流れです

さて、ではどうすればいいかというと、二つ解決策があります。

  1. データベースに記録しているパスワードを、正しくハッシュ値にする
  2. _setAdminPass の結果を平文のまま(return $value) として、素通しする

まあ、2. はあくまで一時的な話に留めないとダメですが。

投稿2019/10/04 02:45

編集2019/10/04 02:51
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacsheaven

2019/10/04 02:53

補足:ユーザーID は「システム中で一意である」(同じユーザーIDのユーザーが複数いない)前提になっていますから、試しに現在存在している「sato」さんを、8番のデータ以外全部消して動かしたらどうなりますか?
kipipipi

2019/10/04 06:33

ご回答ありがとうございます!補足についてですが、一度SQLを作り直してみたのですが、ログインできませんでした。。。
guest

0

自己解決

ご回答遅れて申し訳ありません。
nojimageさんのアドバイスと、参考にしたURL先の内容を含めて、再度はじめから書き直すと上手くいきました!!
原因は不明のままですが、どこか書きミスがあったものと思われます。。。
みなさまありがとうございました!!

投稿2019/10/30 01:39

kipipipi

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問