##実現したいこと
一番重要なことはAuth認証を通すことです。
質問としてはどうしたらidentifyにUsersモデルの配列を返すことができるのかを
知りたいということです。
identifyをデバッグするとfalseが返ってきます。
会社の開発環境を使っていて会社のユーザー情報でログインすると通り、
userModelを変更してログインするとfalseが返ってきます。
Modelを手打ちしたのが悪いのか、AppControllerのAuth設定がおかしいのか
分からない状態です。
どなたかお力添えを頂きたいです。
##それぞれのMVC
前提
・会社の開発環境を使っているため一部、二度手間になっています。
(例 AppControllerを直で変えられないため、別でAppControllerを作成して継承している。)
Model
・AbeUsersTable.php ユーザー情報のTable。会社の開発環境のためbake機能を使わず手打ちで作成。
・AbeUser.php ユーザー情報のEntity。会社の開発環境のためbake機能を使わず手打ちで作成。
DB
・abe_users MySQLで作成。
Controller
・AbeAppController.php AppControllerと同じ役割ですがAuth認証のために別で作成。
・AbeUsersController.php ユーザーに関するController。loginとlogoutとaddメソッド。
##ソースコード
AbeUsersTable
1<?php 2 3namespace App\Model\Table; 4 5use App\Model\Entity\AbeUser; 6use Cake\ORM\Query; 7use Cake\ORM\RulesChecker; 8use Cake\ORM\Table; 9use Cake\Validation\Validator; 10 11class AbeUsersTable extends Table 12{ 13 public function initialize(array $config) 14 { 15 parent::initialize($config); 16 //$this->table('abe_users'); 17 $this->displayField('username'); 18 $this->primaryKey('id'); 19 $this->addBehavior('Timestamp'); 20 } 21 22 public function findAuth(\Cake\ORM\Query $query,array $options){ 23 $query->select(['username','password','delete_flag']) 24 ->where(['AbeUsers.delete_flag' => 0]); 25 return $query; 26 } 27 28 public function validationDefault(Validator $validator){ 29 30 //@property int unsiged $id 31 $validator 32 ->add('id','valid',['rule' =>'numeric']) 33 ->notEmpty('id'); 34 return $validator; 35 36 //@property string $username 37 $validator 38 //->scalar('username') 39 ->requirePresence('username') 40 ->maxLength('username',50,'最大文字数を超えています。'); 41 42 //@property string $password 43 $validator 44 //->scalar('password') 45 ->requirePresence('password') 46 ->maxLength('password',255); 47 48 これより下は割愛 49 } 50}
AbeUser
1<?php 2namespace App\Model\Entitty; 3 4use Authentication\PasswordHasher\DefaultPasswordHasher as PasswordHasherDefaultPasswordHasher; 5use Cake\ORM\Entity; 6use Cake\Auth\DefaultPasswordHasher; 7 8/** 9 * AbeUser Entity 10 * 11 * @property int unsiged $id 12 * @property string $username 13 * @property string $password 14 * @property string $prefecture_cd 15 * @property boolean $authority_kbn 16 * @property string $name 17 * @property string $kana 18 * @property Cake\I18n\Time $birthday 19 * @property string $zip 20 * @property string $address1 21 * @property string $address2 22 * @property string $tel 23 * @property string $mobile_phone 24 * @property string $mail1 25 * @property string $mail2 26 * @property string $remarks 27 * @property int $delete_flag 28 * @property \Cake\I18n\Time $created 29 * @property \Cake\I18n\Time $modified 30 * 31 * passwordのハッシュ化 32 * @param string $password パスワードの文字列 33 * @return string ハッシュ化されたパスワード 34 * */ 35 36 37class AbeUser extends Entity 38{ 39 protected $_accessible = [ 40 '*' => true, 41 'id' => false, 42 ]; 43 44 protected function _setPassword($password){ 45 $hasher = new DefaultPasswordHasher; 46 return $hasher->hash($password); 47 } 48 49}
AbeUsersController
1<?php 2namespace App\Controller; 3 4use App\Controller\AbeAppController; 5use App\Model\Entity\AbeUser; 6use App\Model\Table\AbeUsersTable; 7use App\Controller\UnauthorizedException; 8use Cake\Event\Event; 9use Cake\Auth\DefaultPasswordHasher; 10 11/** 12 * beforeFilter 13 * @param Event $event イベントオブジェクト 14 * @return void 15 * 16 * index 17 * 18 */ 19 20 21class AbeUsersController extends AbeAppController 22{ 23 public function initialize(){ 24 parent::initialize(); 25 } 26 27 public function beforeFilter(Event $event){ 28 parent::beforefilter($event); 29 $this->Auth->allow(['index','login','add']); 30 } 31 32 //AbeUsersの一覧 33 public function index(){ 34 $this->loadModel('AbeUsers'); 35 $users = $this->AbeUsers->find('all'); 36 $this->set(compact('users')); 37 38 } 39 40 //AbeUsersのログイン画面 41 public function login(){ 42 $this->set('title3','会員ログイン'); 43 $this->loadModel('AbeUsers'); 44 if($this->request->is('post')){ 45 $user = $this->Auth->identify(); 46 if($user){//該当するユーザーがいればログイン処理 47 $this->Auth->setUser($user); 48 return $this->redirect($this->Auth->redirectUrl());//Cookbook 49 }else{ 50 $this->Flash->error(__('Username or Password is incorrect.'));//Cookbook 51 } 52 } 53} 54 55 //AbeUsersのログアウト画面遷移 56 public function logout(){ 57 $this->request->session()->destroy();//セッションの破棄 58 return $this->redirect($this->Auth->logout());//ログアウト処理 59 } 60 61 //AbeUsersのユーザー追加 62 public function add(){ 63 if($this->request->is('post')){//POST送信かどうかの確認 64 $user = $this->AbeUsers->newEntity();//POST送信ならAbeUsersのnewEntityメソッドを呼び出し、インスタンスを作成 65 $user = $this->AbeUsers->patchEntity($user,$this->request->data);//インスタンスに取得したデータをマージする 66 if($this->AbeUsers->save($user)){//データを保存できたらindexを返す 67 return $this->redirect(['action' => 'index']); 68 } 69 } 70 } 71 72 73}
AbeAppController
1<?php 2namespace App\Controller; 3 4use Cake\Controller\Controller; 5use Cake\Event\Event; 6use Cake\ORM\Entity; 7use Cake\ORM\Table\AbeUsersTable; 8use Cake\Auth\DefaultPasswordHasher; 9use Cake\ORM\Entity\AbeUser; 10 11/** 12 * Application Controller 13 * 14 * Add your application-wide methods in the class below, your controllers 15 * will inherit them. 16 * 17 * @link http://book.cakephp.org/3.0/en/controllers.html#the-app-controller 18 */ 19class AbeAppController extends Controller 20{ 21 22 public function initialize() 23 { 24 parent::initialize(); 25 $this->loadComponent('Flash'); 26 $this->loadComponent('RequestHandler'); 27 //CSRFコンポーネントの有効化 28 //$this->loadComponent('Csrf'); 29 $this->loadComponent('Auth',[ 30 'authorize'=> ['Controller'],//認可ハンドラーの設定 31 'authenticate' => [ 32 'Form' => ['userModel' =>'AbeUsers', 33 'finder' => 'auth', 34 'fields' =>['username' => 'username','password' => 'password'] 35 ] 36 ], 37 'loginAction' => ['controller' => 'AbeUsers','action' => 'login'], 38 //ログイン後の画面遷移 39 'loginRedirect' => ['controller' => 'AbeMasters','action' =>'menu'], 40 //ログアウト後の画面遷移 41 'logoutRedirect' => ['controller' => 'AbeUsers','action' => 'login',], 42 'authError' => 'ログインできませんでした。', 43 //'strage' => 'Memory', 44 ]); 45 } 46 47 48 public function isAuthorized($user = null){ 49 50 51 return true; 52 } 53 54 55 56}
(eafa7f257aa93ed8ab61149224b7744e.png)
##参考にしたサイト
Cookbook
Maromaroさん
J.Matsuzakiさん
Teratailの質問
Teratailの質問2
##試したこと
・passwordのハッシュ化で文字数制限があると通らないという話を聞いて
→DB作成時から255文字の制限で関係なかった
・AbeAppControllerの'finder' => 'auth',を消す
##開発環境
・mysql 5.6.32
・PHP 5.6.24
・apache 2.2.15
・CakePHP 3.2
あなたの回答
tips
プレビュー