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

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

ただいまの
回答率

90.12%

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

受付中

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 12K+

affluenceyou

score 48

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

login.ctp
<?php
          echo $this->Form->create('User');
          echo $this->Form->input('User.username');
          echo $this->Form->input('User.password');
          echo $this->Form->end('ログインする');
        ?>

UsersController.php
class UsersController extends AppController {
    public $helpers = array("Html",'Form');
    public $uses = array('User');
    public $components = array('Auth');
    public function index(){

    }

    public function login() {
        // debug($this->User->find('all'));
        if($this->request->is('post')) {
            debug($this->request->data);
            debug($this->Auth->login());
            if($this->Auth->login()) {
                debug('success');
                return $this->redirect(array('controller'=>'posts','action'=>'index'));
            } else {
                debug('faild');
                $this->Session->setFlash('ログインに失敗しました');
            }
        }
    }

    public function logout() {
        $this->Auth->logout();
        $this->redirect('login');
    }

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('login','add');
    }

    public function add() {
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                $this->Auth->login();
                $this->redirect(array('controller'=>'posts','action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }
}
User.php
<?php

class User extends AppModel {
    public $name = 'User';
    // public $belongsTo = array('');
    public $hasMany = array('Post');
    var $validate = array(
        'username' => array(
            'notempty' => array(
                'rule' => array('notempty'), // 未入力チェック
            ),
            'isUnique' => array(
                'rule' => 'isUnique', // 重複チェック
            ),
        ),
        'password' => array(
            'custom' => array(
                'rule' => array('custom', '/^[a-zA-Z0-9]{6,}$/i'), // 半角英数6文字以上
            ),
        ),
    );

    public function beforeSave($options = array()) {
    $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        // $this->data['User']['password'] = sha1($this->data['User']['password']);
    return true;
    
    }
}
AppController.php
class AppController extends Controller {
    public $components = array(
        'Session',
        'Auth'
    );
}

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

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

助けてもらえると嬉しいです・・・!
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/13 08:22

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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);

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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;
    }

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る