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

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

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

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

Q&A

4回答

19370閲覧

cakephpのAuthでログインができない!!

affluenceyou

総合スコア44

CakePHP

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

0グッド

1クリップ

投稿2015/01/11 06:32

CakephpのAuthを使ってログインが出来ません!
前は同じコードでできたような気がするのですが、今回はできません。
なぜでしょうか?

login.ctp

lang

1<?php 2 echo $this->Form->create('User'); 3 echo $this->Form->input('User.username'); 4 echo $this->Form->input('User.password'); 5 echo $this->Form->end('ログインする'); 6 ?>

UsersController.php

lang

1class UsersController extends AppController { 2 public $helpers = array("Html",'Form'); 3 public $uses = array('User'); 4 public $components = array('Auth'); 5 public function index(){ 6 7 } 8 9 public function login() { 10 // debug($this->User->find('all')); 11 if($this->request->is('post')) { 12 debug($this->request->data); 13 debug($this->Auth->login()); 14 if($this->Auth->login()) { 15 debug('success'); 16 return $this->redirect(array('controller'=>'posts','action'=>'index')); 17 } else { 18 debug('faild'); 19 $this->Session->setFlash('ログインに失敗しました'); 20 } 21 } 22 } 23 24 public function logout() { 25 $this->Auth->logout(); 26 $this->redirect('login'); 27 } 28 29 public function beforeFilter() { 30 parent::beforeFilter(); 31 $this->Auth->allow('login','add'); 32 } 33 34 public function add() { 35 if ($this->request->is('post')) { 36 $this->User->create(); 37 if ($this->User->save($this->request->data)) { 38 $this->Session->setFlash(__('The user has been saved')); 39 $this->Auth->login(); 40 $this->redirect(array('controller'=>'posts','action' => 'index')); 41 } else { 42 $this->Session->setFlash(__('The user could not be saved. Please, try again.')); 43 } 44 } 45 } 46}

User.php

lang

1<?php 2 3class User extends AppModel { 4 public $name = 'User'; 5 // public $belongsTo = array(''); 6 public $hasMany = array('Post'); 7 var $validate = array( 8 'username' => array( 9 'notempty' => array( 10 'rule' => array('notempty'), // 未入力チェック 11 ), 12 'isUnique' => array( 13 'rule' => 'isUnique', // 重複チェック 14 ), 15 ), 16 'password' => array( 17 'custom' => array( 18 'rule' => array('custom', '/^[a-zA-Z0-9]{6,}$/i'), // 半角英数6文字以上 19 ), 20 ), 21 ); 22 23 public function beforeSave($options = array()) { 24 $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); 25 // $this->data['User']['password'] = sha1($this->data['User']['password']); 26 return true; 27 28 } 29}

AppController.php

lang

1class AppController extends Controller { 2 public $components = array( 3 'Session', 4 'Auth' 5 ); 6} 7

ちなみにUsersControllerのaddでユーザーを新規追加した場合、そのままログインできます。なのでadd()の$this->Auth->login()はうまくいくのですが、login()の$this->Auth->login()がうまくいかないということです。

パスワードの暗号化もデータベースで確認できています。
おそらく、ログインフォームで入力したパスワードとデータベースのパスワードが一致していないと思うのですが、どうでしょうか??

助けてもらえると嬉しいです・・・!

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

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

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

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

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

guest

回答4

0

add()がうまくいっているので処理上の間違いではないと思います。

ご存じかもしれませんが、参考までにAuthコンポーネントでは、以下のように認証を行っています。
・登録時にパスワードを暗号化してDBへ保存
(affluenceyouさんのソースではbeforeSaveで行ってますね。)
・認証時に、入力されたパスワードを暗号化して、DBに保存された暗号化されたパスワードと比較

問題の切り分けのために、ログインできないパスワードをAuthComponent::password()で暗号化して、それがDBに保存されたパスワードと同じか比較できますでしょうか?

これが異なっていた場合、ログインできないわけですが、原因として思いつくのは、以下通りです。

・hottaさんが書いているように、暗号化にはConfig/core.php の Security.saltを使用しています。パスワードを登録したときとこれを変更していませんか?
→この場合、前と同じ設定にして試してみてください。

・単にパスワードを間違って覚えている?
→この場合、再度登録し直してもらうしかありません。もし、平分のパスワードがわかるようでしたら、AuthComponent::passwordで暗号化してDBに直接登録しても良いかもしれません。

・Cakeの2.3以前と2.4以降では、登録時のパスワードの暗号化の方法が異なっています。
すみません、ここは内部の処理まで見てないのですが、暗号化された結果がバージョンで異なってる可能性があるかな程度です。
さらに、同じコードで動かないと言っているので可能性は薄いですが。

Cake2.3以前

$pw = AuthComponent::password($pw);

Cake2.4以降

$passwordHasher = new SimplePasswordHasher(); $pw = $passwordHasher->hash($pw);

→この場合も、パスワードを再登録してください。

以上、質問から時間が立っており解決済みかもしれませんが参考になれば。

投稿2015/03/01 03:12

編集2015/03/01 03:18
kazu56

総合スコア51

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

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

0

動いていったサイト+データをコピーして別のサイトを作ろうとして、
同じことになりました。他の方が書いているように、原因はハッシュ化
されたパスワードが異なるケースがあるからでした。

インストール手順には Config/core.php の Security.salt
と Security.cipherSeed は変えなさい、とありますが、CakePHP の
ハッシュ機能がこれらの値を元にしているようです。なので、私の場合は
これらの値をコピー元サイトと合わせたら認証が通りました。

投稿2015/02/21 11:18

hotta

総合スコア1613

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

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

0

DBに入力できる文字数とかは確認しましたか?
前に僕もやったことがあるのですが、入力可能文字数を少なくしすぎて、ハッシュされたパスワードが認識されないということがありました。
入力パスワードとDBパスワードが一致しないということで、まっさきにそれを思いついたのですが、VARCHAR型で255文字くらいに設定すれば認識できるとかはないでしょうか?

投稿2015/01/12 11:56

Aneks

総合スコア114

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

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

affluenceyou

2015/01/12 23:22

あ、ちゃんとvarchar(255)に設定しています!
guest

0

こちらに関して私もはまった記憶があります。
もしかすると入力したパスワードがhashで暗号化された後登録した内容と一致していないケースがあるのではないでしょうか?

Controller/Component/Auth/BaseAuthenticate.php

の126行目付近で

protected function _password($password) {
return Security::hash($password, null, true);
}

のような暗号化処理を行っています。
以前ログインサイトを作成した時に、ユーザテーブルに登録されたパスワードと暗号化されたパスワードが異なってコアライブラリ郡を個別プロジェクトに追加して内容を編集した記憶が有ります。

私が過去に今作成したプログラムを確認してみましたがはやりデータベースに登録する前に下記のような内容で暗号化してDBに登録しています。

public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['userpass'])) {
$this->data[$this->alias]['userpass'] = AuthComponent::password($this->data[$this->alias]['userpass']);
}
return true;
}

このように登録時とログイン時のパスワードが完全一致するようにしておかないと駄目ですね・・・。
またパスワードの変更を行う場合もこの方法は、入力元のパスワードを復元する事が出来ない為別の暗号化方法を考えて復元出来るように工夫する必要が有ります。

こちらはログイン関連のコアプログラムをかなり変更しないと行けないのでデバックが出来る人のみに限定ですが・・・。
またコアプログラムを他のプロジェクトと併用している場合、ライブラリ群を制作しているプロジェクト配下にコピーしてから変更する事をお勧めします。

そうしないと他のプロジェクトにも影響してしまうので・・・・・・。

投稿2015/01/29 11:46

takayukiinaba

総合スコア1158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問