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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

CakePHP

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

Q&A

1回答

1751閲覧

WordPress → CakePHP3の変更に伴うログイン機能実装について

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

CakePHP

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

0グッド

0クリップ

投稿2017/08/10 01:50

###やろうとしていることの概要と問題

WordPressのユーザデータを活用して、CakePHP3を組んでいます。

やりたいことは以下のCakePHP3版です(以下記事はCakePHP2版)。
http://blog.howtelevision.co.jp/entry/2014/08/14/233716

ユーザのパスワードを変更したくないので、暗号化ロジックそのままでログインできるようにしたいです。
が、うまく動作していません。

メアド・パスを入力してログインをすると、パスワード不一致のFlashメッセージが返ってきます。
ご経験のある方の知識を拝借できると嬉しいです。

▼以下マニュアルを参考にしながら実装しました▼
https://book.cakephp.org/3.0/ja/controllers/components/authentication.html

###現状のソースコード

現状、以下のように実装しています(関連箇所のみ記述)。

PHP

1■■■ Controller/AppController.php ■■■ 2 3use App\Hoge\LegacyPasswordHasher; 4 5class AppController extends Controller { 6 public function initialize() { 78910 $this->loadComponent('Auth', [ 11 'authenticate' => [ 12 'Form' => [ 13 'passwordHasher' => [ 14 'className' => 'Fallback' 15 ], 16 'hashers' => ['Default', 'Legacy'], 17 'fields' => [ 18 'username' => 'email', 19 'password' => 'password' 20 ], 21 'scope' => [ 22 'flg' => 0 23 ] 24 ] 25 ], 26 'authError' => 'ログインする必要があります。' 27 ] ); 28 } 29}

PHP

1■■■ Model/Entity/User.php ■■■ 2 3use App\Hoge\LegacyPasswordHasher; 4 5class User extends Entity { 6 protected function _setPassword($password) { 7 $hasher = new LegacyPasswordHasher(); 8 return $hasher->hash($password); 9 } 10} 11

PHP

1■■■ Hoge/LegacyPasswordHasher.php ■■■ 2 3use Cake\Auth\AbstractPasswordHasher; 4use App\Hoge\PasswordHash; 5 6class LegacyPasswordHasher extends AbstractPasswordHasher { 7 public function hash($password) { 8 $hasher = new PasswordHash(8, true); 9 return $hasher->HashPassword($password); 10 } 11 public function check($password, $hashedPassword) { 12 $hasher = new PasswordHash(8, true); 13 return $hasher->CheckPassword($password, $hashedPassword); 14 } 15}

PHP

1■■■ Hoge/PasswordHash.php ■■■ 2(WordPressのwp-includes/class-phpass.phpをコピーしただけです) 3 4namespace App\Hoge; 5class PasswordHash { 6789 function HashPassword($password) 10 { 11 if ( strlen( $password ) > 4096 ) { 12 return '*'; 13 } 14 15 $random = ''; 16 17 if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) { 18 $random = $this->get_random_bytes(16); 19 $hash = 20 crypt($password, $this->gensalt_blowfish($random)); 21 if (strlen($hash) == 60) 22 return $hash; 23 } 24 25 if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) { 26 if (strlen($random) < 3) 27 $random = $this->get_random_bytes(3); 28 $hash = 29 crypt($password, $this->gensalt_extended($random)); 30 if (strlen($hash) == 20) 31 return $hash; 32 } 33 34 if (strlen($random) < 6) 35 $random = $this->get_random_bytes(6); 36 $hash = 37 $this->crypt_private($password, 38 $this->gensalt_private($random)); 39 if (strlen($hash) == 34) 40 return $hash; 41 42 # Returning '*' on error is safe here, but would _not_ be safe 43 # in a crypt(3)-like function used _both_ for generating new 44 # hashes and for validating passwords against existing hashes. 45 return '*'; 46 } 47 48 function CheckPassword($password, $stored_hash) 49 { 50 if ( strlen( $password ) > 4096 ) { 51 return false; 52 } 53 54 $hash = $this->crypt_private($password, $stored_hash); 55 if ($hash[0] == '*') 56 $hash = crypt($password, $stored_hash); 57 58 return $hash === $stored_hash; 59 } 60}

PHP

1■■■ Controller/UsersController.php ■■■ 2 3use App\Hoge\LegacyPasswordHasher; 4use App\Form\LoginForm; 5 6class UsersController extends AppController { 7 public function login() { 8 $formLogin = new LoginForm(); 9 if ($this->request->is('post')) { 10 $users = $this->Auth->identify(); 11 if ($formLogin->execute($this->request->getData()) && $users) { 12 $this->Auth->setUser($users); 13 $this->Flash->success('ログインしました!'); 14 } else { 15 // こっちを通ってしまいます 16 $this->Flash->error('メールアドレスかパスワードに誤りがあります。'); 17 } 18 } 19} 20

PHP

1■■■ Form/LoginForm.php ■■■ 2class LoginForm extends Form { 3 protected function _buildSchema(Schema $schema) { 4 return $schema->addField ( 'name', 'string' ) 5 ->addField ( 'email', [ 6 'type' => 'string' 7 ] )->addField ( 'password', [ 8 'type' => 'string' 9 ] ); 10 } 11 12 protected function _buildValidator(Validator $validator) { 13 return $validator->notEmpty ( 'email', 'メールアドレスは必須入力項目です。' ) 14 ->notEmpty ( 'password', 'パスワードは必須入力項目です。' ); 15 } 16 17 protected function _execute(array $data) { 18 return true; 19 } 20}

###以下は正しく動きました

以下は正しく動作しているので、上記ソースのどこかに問題があるかなと考えています。

PHP

1UsersController.phpにて 2 3$pass = $this->request->getData('password'); 4$hasher = new LegacyPasswordHasher(); 5if ($hasher->check($pass, 'DBから取ってきたユーザパス')){ 6 // こっちを通ります 7 echo '一致してるぜ!'; 8} else { 9 echo '不一致だ!'; 10}

Authコンポーネントを使う際は、SALTをWPと同じにしなければいけないとかあるんでしょうか。
皆様のお力を貸していただけましたら幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

$formLogin->execute($this->request->getData()) && $users
の結果をvardumpしてfalseだったらどっちがfalseなのかを確認してデバッグしていくといいとおもいますよー

投稿2019/03/11 21:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問