質問編集履歴

1 追記

1nakaji

1nakaji score 183

2015/10/13 16:48  投稿

CakePHP2.4.2でBlowfishを使ったログイン
CakePHP2.4.2でBlowfishを使ったログインの処理ではまっております。
以前に一度実装したのですが、今回はなぜかうまく実装ができていません。
usersテーブルへの登録自体はうまくいっているのですが、
どうもログイン時にパスワードが一致しないようです。
```sql
CREATE TABLE users (
   id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(50),
   password VARCHAR(255),
   created DATETIME DEFAULT NULL,
   modified DATETIME DEFAULT NULL
);
```
```php
<?php
//app/Controller/UsersController.php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
   public $name = "Users";
   public $components = array(
       'DebugKit.Toolbar',
       'Session',
       'Cookie',
       'Security',
       'Auth' => array(
           'authError' => 'ログインしてください。',
           'authenticate' => array(
               'Form' => array(
                  'passwordHasher' => 'Blowfish'
               )
           ),
           'authorize' => array('Controller'),
           'logoutRedirect' => array('controller' => 'Users', 'action' => 'login'),
           'loginAction' => array('controller' => 'Users', 'action' => 'login'),
       )
   );
   public function beforeFilter() {
       parent::beforeFilter();
       $this->Auth->allow('registerUser','login','logout');
       $this->Security->requireAuth('registerUser','login');
   }
   public function login(){
       if ($this->request->is('post')) {
           if($this->Auth->login()){
               return $this->flash('認証に成功しました。', '/users/index');
           }else{
               return $this->flash('認証に失敗しました。', '/users/index');
           }
       }
   }
   public function registerUser(){
       if ($this->request->is('post')) {
               $this->User->create();
               if ($this->User->save($this->request->data)) {
                       $this->Session->setFlash(__('The user has been saved.'));
                       exit;
                       #return $this->redirect(array('action' => 'index'));
               } else {
                       $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
               }
       }
  }
}
```
```php
<?php
App::uses('AppModel', 'Model');
App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth');
// app/Model/User.php
class User extends AppModel {
   public $validate = array(
     'username' => array(
         'notEmpty' => array(
             'rule' => array('email'),
             'message' => 'メールアドレスかパスワードに誤りがあります。'
         ),
         'isUnique' => Array(
             'rule' => 'isUnique',
             'message' => 'すでに登録のあるメールアドレスです。'
         )
     ),
     'password' => array(
           'notEmpty' => array(
               'rule' => array('custom', '/A[A-Za-z0-9_()*+,-./:;<=>?]{8,150}z/'),
               'message' => 'パスワードの形式が不正です。'
           )
       )
   );
   public function beforeSave($options = array()) {
       if (isset($this->data[$this->alias]['password'])) {
           $passwordHasher = new BlowfishPasswordHasher();
           $this->data[$this->alias]['password'] = $passwordHasher->hash(
               $this->data[$this->alias]['password']
           );
       }
       return true;
   }
}
```
app/Controller/AppController.phpなどには手を入れていません。
ちなみにBlowfishを使わずに、
登録・ログインをした場合には正常にログイン処理が行えません。
登録・ログインをした場合には正常にログイン処理が行えます。
```php
   public function beforeSave($options = array()) {
       $this->data['User']['password'] = AuthComponent::password(
         $this->data['User']['password']
       );
       return true;
   }
}
```
beforeSaveメソッドを上記に変更、
UsersController.phpのcomponents内の
以下をコメントアウトすると正常に動作。
```php
   'passwordHasher' => 'Blowfish'
```
おそらくは単純なミスかと思いますが、
はまってしまって抜け出せずにいます。
他に必要な処理などがあるか、
何かお気付きの点があれば教えていただけますと幸いです。
  • CakePHP

    2900 questions

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

  • Authentication

    167 questions

    Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

  • ログイン

    379 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る