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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

1回答

5347閲覧

CakePHP3で管理者とユーザーそれぞれでログイン

anotenka

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

0クリップ

投稿2018/08/24 05:44

前提・実現したいこと

cakePHP3.6で管理システムを作っています。
管理者用のログイン画面とパートナー用のログイン画面の2つの認証が必要です。
3.xではAppController.phpで一括でAuthの設定をしなければならないとのことで
ifでadminだったらEmpoyeesモデル、それ以外Usersモデルで認証するよう設定してみたつもりですが
Usersの方はテストユーザーでログインができ、
Employeesの方はログインすることができませんでした。

Controllerが間違っているのか、routesのやり方が間違っているのかわかりません。

2つのテーブルを使った認証を実装するための手順や設定などがあれば教えていただきたいです。
宜しくお願い致します。

発生している問題・エラーメッセージ

該当のソースコード

AppController

php

1<?php 2 3namespace App\Controller; 4 5use Cake\Controller\Controller; 6use Cake\Event\Event; 7 8 9class AppController extends Controller 10{ 11 12 public function initialize() 13 { 14 parent::initialize(); 15 if ($this->request->prefix == 'admin') { 16 $this->loadComponent('Flash'); 17 $this->loadComponent('Auth', [ 18 'loginRedirect' => [ 19 'controller' => 'Employees', 20 'action' => 'main' 21 ], 22 'logoutRedirect' => [ 23 'controller' => 'Employees', 24 'action' => 'login' 25 ], 26 'authenticate' => [ 27 'Form' => [ 28 'fields' => [ 29 'username' => 'employee_no', 30 'password' => 'password' 31 ] 32 ] 33 ], 34 'authError' => 'ログインできませんでした。ログインしてください。' 35 ]); 36 $this->Auth->sessionKey = 'Admin'; 37 } else { 38 $this->loadComponent('Flash'); 39 $this->loadComponent('Auth', [ 40 'loginRedirect' => [ 41 'controller' => 'Users', 42 'action' => 'main' 43 ], 44 'logoutRedirect' => [ 45 'controller' => 'Users', 46 'action' => 'login' 47 ], 48 'authenticate' => [ 49 'Form' => [ 50 'fields' => [ 51 'username' => 'user', 52 'password' => 'password' 53 ] 54 ] 55 ], 56 'authError' => 'ログインできませんでした。ログインしてください。' 57 ]); 58} 59} 60} 61

/Controller/Admin/
EmployeesController.php

php

1<?php 2namespace App\Controller\Admin; 3 4use App\Controller\AppController; 5use Cake\Event\Event; 6use Cake\Controller\Component\AuthComponent; 7 8 9class EmployeesController extends AppController 10{ 11 12 public function isAuthorized($employee) 13 { 14 if (isset($employee['role']) && $employee['role'] === 'admin') { 15 return true; 16 } 17 return false; 18 } 19 20 public function beforeFilter(Event $event) 21 { 22 parent::beforeFilter($event); 23 $this->Auth->allow(['add','logout','login']); 24 25 $this->Auth->config('authenticate', [ 26 AuthComponent::ALL => ['userModel' => 'Employees'], 27 'Basic', 28 'Form' 29 ]); 30 } 31 32public $paginate = [ 33 'limit' => 50, 34 'order' => [ 35 'Employees.id' => 'asc' 36 ] 37]; 38 39public function main() 40{ 41 $employees = $this->paginate($this->Employees); 42 $this->set(compact('employees')); 43 $this->set('_serialize',['employees']); 44 45} 46 47 public function index() 48 { 49 $employees = $this->paginate($this->Employees); 50 51 $this->set(compact('employees')); 52 } 53 54//中略 55 56public function login() 57{ 58 if($this->request->is('post')){ 59 $employee = $this->Auth->identify(); 60 if ($employee){ 61 $this->Auth->setUser($employee); 62 return $this->redirect($this->Auth->redirectUrl()); 63 } 64 $this->Flash->error(__('ユーザーIDかパスワードが間違っています。')); 65 } 66} 67 68public function logout() 69{ 70 $this->request->session()->destroy(); 71 return $this->redirect($this->Auth->logout()); 72} 73 74} 75

/Controller/
UsersController.php

php

1<?php 2namespace App\Controller; 3 4use App\Controller\AppController; 5use Cake\Event\Event; 6 7 8class UsersController extends AppController 9{ 10 public function initialize() 11 { 12 parent::initialize(); 13 14 $this->loadComponent('Auth', [ 15 'authorize' => ['Controller'], 16 17 ]); 18 } 19 20 public function beforeFilter(Event $event) 21{ 22 parent::beforeFilter($event); 23 $this->Auth->allow(['add','logout','login']);//ログイン前でも参照できるページ 24 25 } 26 27 public $paginate = [ 28 'limit' => 50, 29 'order' => [ 30 'Users.id' => 'asc' 31 ] 32 ]; 33 34 public function main() 35 { 36 $users = $this->paginate($this->Users); 37 $this->set(compact('users')); 38 $this->set('_serialize',['users']); 39 40 } 41 public function index() 42 { 43 $users = $this->paginate($this->Users); 44 if ($this->request->is('post')) { 45 $requestData = $this->request->data(); 46 $conditions = []; 47 if (!empty($requestData['find_user'])) { 48 $conditions['user like'] = '%'.$requestData['find_user'].'%'; 49 } 50 if (!empty($requestData['authority_code'])) { 51 $conditions['authority_code like'] = '%'.$requestData['authority_code'].'%'; 52 } 53 $users = $this->Users->find() 54 ->where($conditions); 55 } 56 $this->set('msg', null); 57 $this->set('users', $users); 58 $users = $this->paginate($this->Users); 59 } 60 61public function login() 62{ 63 if($this->request->is('post')){ 64 $user = $this->Auth->identify(); 65 if ($user){ 66 $this->Auth->setUser($user); 67 return $this->redirect($this->Auth->redirectUrl()); 68 } 69 $this->Flash->error(__('ユーザーIDかパスワードが間違っています。')); 70 } 71} 72 73 public function logout() 74 { 75 $this->request->session()->destroy(); 76 return $this->redirect($this->Auth->logout()); 77 } 78 79 public function isAuthorized($employee = null) 80 { 81 // todo.. 82 return true; 83 } 84} 85

routes.php

php

1<?php 2 3 4use Cake\Core\Plugin; 5use Cake\Routing\RouteBuilder; 6use Cake\Routing\Router; 7use Cake\Routing\Route\DashedRoute; 8 9 10 11Router::defaultRouteClass(DashedRoute::class); 12 13Router::scope('/', function (RouteBuilder $routes) { 14 15 16 $routes->connect('/users/', ['controller' => 'Users', 'action' => 'login']); 17 $routes->connect('/partners/', ['controller' => 'partners', 'action' => 'login']); 18 $routes->connect('/employees/', ['controller' => 'employees', 'action' => 'login']); 19 20 21 $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display','index']); 22 $routes->connect('/admin/employees', ['controller' => 'Employees', 'action' => 'login', 'prefix' => 'admin']); 23 24 25 $routes->fallbacks(DashedRoute::class); 26}); 27Router::prefix('admin', function ($routes) { 28 $routes->fallbacks('DashedRoute'); 29}); 30plugin::routes(); 31

/template/Admin/Employees/
login.ctp

<div class="login_form"> <?= $this->Form->create() ?> <fieldset> <legend><?= __('管理システム') ?></legend> <?= $this->Form->control('employee_no', ['label' => '社員番号']) ?> <?= $this->Form->control('password', ['label' => 'パスワード']) ?> <div class="log_b"><?= $this->Form->button(__('ログイン','true')) ?> <a class="button" href="/admin/employees/login" target="login">終了</a></div> <?= $this->Form->end() ?> </fieldset> </div> <br> <?= $this->Flash->render() ?>

/template/Users/
login.ctp

<div class="login_form"> <?= $this->Form->create(false, array('div' => 'false', 'label' => 'false')) ?> <fieldset> <legend><?= __('管理システム') ?></legend> <?= $this->Form->control('user', ['label' => '社員番号']) ?> <?= $this->Form->control('password', ['label' => 'パスワード']) ?> <div class="log_b"><?= $this->Form->button(__('ログイン','true')) ?> <a class="button" href="/users/login" target="login">終了</a></div> <?= $this->Form->end() ?> </fieldset> </div> <br> <?= $this->Flash->render() ?>

試したこと

route.phpでadminの設定
AppControllerにAuth認証の設定

補足情報(FW/ツールのバージョンなど)

cakePHP3.6
PHP 7.2.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じようなprefixで認証を分ける実装をしたことがあります。$this->Auth->sessionKey = 'Admin';でセッションを分けており、ルーティングもよさそうだと思いました。

1点、Authコンポーネントの設定でEmpoyeesモデルの指定がないのが気になりました

'authenticate' => [ 'Form' => [ 'userModel' => 'Empoyees' // これを追加 'fields' => [ 'username' => 'employee_no', 'password' => 'password' ] ] ],

投稿2018/08/24 09:22

編集2018/08/24 09:23
popobot

総合スコア6586

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

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

anotenka

2018/08/24 10:02

アドバイス頂いたとおりに直し、細かいミスなども修正したら 無事にログインまで実装できました! 教えて下さり本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問