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

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

ただいまの
回答率

87.37%

Cakephp3 Controller、Template内でフォルダを階層に分けて、ログインをしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 669

前提・実現したいこと

Controller、Templateをフォルダ分けして、ルーティングを変更しました。
その際、階層に分けたルーティングは正常に動いていると思うのですが、AppControllerに書いたログイン認証が機能していませんでした。

階層

Controller/
├AppControler
├LoginController
Admin/
├AppControler ←これが機能していない
├LoginManegerController
├TopManagerController

Template/
├Login
Admin/
├LoginManeger
├TopManagerController

※拡張子は省略しております。

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

http://localhost/myapp/admin/loginManager
にアクセスは出来るのですが、
LoginManagerController内のloginメソッドに処理がとびません。
リロードがされるだけです。

また、
http://localhost/myapp/admin/TopManager
にアクセスを行うと、
http://localhost/myapp/admin/login/login?redirect=%2Fadmin%2FTopManager
にリダイレクトされ、
Error: LoginController could not be found. と表示されます。

該当のソースコード

routes.php に以下を追加

Router::prefix('admin', function (RouteBuilder $routes) {
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'index']);
    $routes->fallbacks(DashedRoute::class);
});


Admin/AppControler

<?php
/**
 * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
 * @link      https://cakephp.org CakePHP(tm) Project
 * @since     0.2.9
 * @license   https://opensource.org/licenses/mit-license.php MIT License
 */
namespace App\Controller\Admin;

use Cake\Controller\Controller;
use Cake\Event\Event;

/**
 * Application Controller
 *
 * Add your application-wide methods in the class below, your controllers
 * will inherit them.
 *
 * @link https://book.cakephp.org/3.0/en/controllers.html#the-app-controller
 */
class AppController extends Controller
{

    /**
     * Initialization hook method.
     *
     * Use this method to add common initialization code like loading components.
     *
     * e.g. `$this->loadComponent('Security');`
     *
     * @return void
     */
    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler', [
            'enableBeforeRedirect' => false,
        ]);

        $this->loadComponent('Flash');

        $this->loadComponent('Auth', [
            'loginAction' => [
                'controller' => 'LoginManager',
                'action' => 'login'
            ],
            'loginRedirect' => [
                'controller' => 'TopManager',
                'action' => 'index'
            ],
            'logoutRedirect' => [
                'controller' => 'LoginManager',
                'action' => 'logout'
            ],
            'authenticate' => [
                'Form' => [
                    'userModel' => 'Admin',

                    'fields' => [
                        'username' => 'login_id',
                        'password' => 'password'
                    ],'finder' => 'auth'
                ]
            ]
        ]);

        /*
         * Enable the following component for recommended CakePHP security settings.
         * see https://book.cakephp.org/3.0/en/controllers/components/security.html
         */
        //$this->loadComponent('Security');
    }

    // 共通処理
    public function beforeFilter(Event $event)
    {

    }

}


LoginManegerController

<?php
  namespace App\Controller\Admin;

  use Cake\ORM\TableRegistry;
  use Cake\Auth\DefaultPasswordHasher;
  use \Exception;
  use Cake\Event\Event;
  use Cake\Utility\Security;

  class LoginManagerController extends AppController
  {
      // 認証を通さないアクションを設定
      public function beforeFilter(Event $event)
      {
        parent::initialize();
        $this->Auth->allow(['index','login','logout']);
      }

      public function index()
      {

      }

     public function login(){
      if ($this->request->is('post')) {
          $user = $this->Auth->identify();
          if ($user) {
            $this->Auth->setUser($user);
            return $this->redirect($this->Auth->redirectUrl());
          }
        }
    }

    public function logout()
    {

    }

  }
?>


LoginManager

<!DOCTYPE html>
<html lang="ja">
<head>
    <?= $this->Html->charset() ?>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>管理者ログイン画面</title>
    <?= $this->Html->meta('icon') ?>

    <?= $this->Html->css('base.css') ?>
    <?= $this->Html->css('style.css') ?>
    <?= $this->Html->css('header.css') ?>

    <?= $this->fetch('meta') ?>
    <?= $this->fetch('css') ?>
    <?= $this->fetch('script') ?>
</head>
<body>
  <h1>管理者ログイン画面</h1>

<?php

    echo $this->Form->create();

    echo $this->Form->control('login_id',['type'=>'text','label'=>__('Login ID'),'id' => 'login_id',
                              "maxlength"=>"255"]);
    echo $this->Form->control('password',['type'=>'password','label'=>__('Password'),'id' => 'password',
                              "maxlength"=>"255"]);
    echo $this->Form->button('Login');

    echo $this->Form->end();
?> 

</body>
</html>

Admin/配下の
AppControllerのログイン認証を正常に動かすには、
どのように修正すればよろしいでしょうか?

大変恐縮ですが、分かる方どなたか
アドバイスのほどよろしくお願いいたします。

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

cakephp3.7
php 7.2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

prefixルーティング内で認証を個別に設定するなら、ルーティングパラメーターに prefix を付けるようにします。

loginActionloginRedirectlogoutRedirect などの指定はすべて、prefixパラメーターを付けて指定します。

            'loginAction' => [
                'prefix' => 'admin',
                'controller' => 'LoginManager',
                'action' => 'login'
            ],

また、一般ユーザーと管理者のように、認証に使用するモデル(userModel)が異なる場合は、セッションキーを変更しておくとよいでしょう。

            'storage' => [
                'className' => 'Session',
                'key' => 'Auth.Admin', // デフォルトは Auth.User
            ],

AuthComponent 設定オプション - CakePHP 3.9

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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