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

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

ただいまの
回答率

89.06%

cakephpで認証したら他のページにアクセスできない。

解決済

回答 1

投稿 編集

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

ganariya2525

score 48

 前提・実現したいこと

現在、ソースコードの共有アプリケーションを作成しようと思います。
UsersControllerを作成して認証を作成しました。
そうすると、
cake/users/indexなどにはアクセスできるのですが
cake/index.phpや
cake/Home/index.phpにアクセスできなくなってしまいました。
ほかのページに移動できるようにするにはどうすればよいでしょうか。

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

usersコントローラを作ったあと、他のディレクトリにアクセスできなくなり、
you are not authorized to access that location
と表示されて、もとのusersページに移されてしまいます。

具体的には
C/xampp/htdocs/cake/src/Controller/UsersController(localhost/cake/Users/index)にはアクセスできますが
C/xampp/htdocs/cake/src/Controller/HomeController(localhost/cake/Home/index)や
localhost/cake/index.php(一番最初のデータベースがつながったかどのデータベース)にアクセスできません。

 該当のソースコード

UsersController

<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Event\Event;

/**
 * Users Controller
 *
 * @property \App\Model\Table\UsersTable $Users
 *
 * @method \App\Model\Entity\User[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
 */
class UsersController extends AppController
{
    public function beforeFilter(Event $event)
    {
        parent::beforeFilter($event);

        //addとlogoutでは認証いらないよ!
        $this->Auth->allow(['add', 'logout']);
    }

    public function login()
    {
        //postなら
        if ($this->request->is('post')) {

            //POStされた内容からデータベースを検索
            $user = $this->Auth->identify();

            //成功したら
            if ($user) {

                //セッションにユーザー情報を保持
                //保存したデータは$this->Auth->userで取得できる
                $this->Auth->setUser($user);

                //AppControllerで選択したURLへ
                return $this->redirect($this->Auth->redirectUrl());
            }

            //失敗したらFlashを表示
            $this->Flash->error(__('Invalid username or password, try again'));
        }
    }

    public function logout()
    {
        $this->request->session()->destroy();
        return $this->redirect($this->Auth->logout());
    }

    public function isAuthorized($user)
    {
        return true;
    }

    public function index()
    {
        $this->set('users', $this->Users->find('all'));
    }

    public function view($id)
    {
        $user = $this->Users->get($id);
        $this->set(compact('user'));
    }

    public function add()
    {
        //実体を作る
        $user = $this->Users->newEntity();

        //POST処理なら
        if ($this->request->is('post')) {

            //データを更新するときに使う
            $user = $this->Users->patchEntity($user, $this->request->getData());

            //追加できたら
            if ($this->Users->save($user)) {
                $this->Flash->success(__('The user has been saved.'));

                //リダイレクト
                return $this->redirect(['action' => 'login']);
            }
            $this->Flash->error(__('Unable to add the user.'));
        }

        //userを設定する
        $this->set('user', $user);
    }

}

AppController

<?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;

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', [
            'authorize' => ['Controller'],

            //ログイン後のアクション指定
            'loginRedirect' => [
                'controller' => 'Users',
                'action' => 'index'
            ],

            //ログアウト後の遷移先
            'logoutRedirect' => [
                'controller' => 'Users',
                'action' => 'login'
            ]
        ]);
    }

    public function isAuthorized($user){
        return false;
    }
}


routes.php


<?php
/**

  • Routes configuration
  •  
  • In this file, you set up routes to your controllers and their actions.
  • Routes are very important mechanism that allows you to freely connect
  • different URLs to chosen controllers and their actions (functions).
  •  
  • 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
  • @license       https://opensource.org/licenses/mit-license.php MIT License
    */

use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;

/**

  • The default class to use for all routes
  •  
  • The following route classes are supplied with CakePHP and are appropriate
  • to set as the default:
  •  
  • - Route
  • - InflectedRoute
  • - DashedRoute
  •  
  • If no call is made to Router::defaultRouteClass(), the class used is
  • Route (Cake\Routing\Route\Route)
  •  
  • Note that Route does not do any inflections on URLs which will result in
  • inconsistently cased URLs when used with :plugin:controller and
  • :action markers.
  •  
  • Cache: Routes are cached to improve performance, check the RoutingMiddleware
  • constructor in your src/Application.php file to change this behavior.
  •   */
    Router::defaultRouteClass(DashedRoute::class);

Router::scope('/', function (RouteBuilder $routes) {
/**

  • Here, we are connecting '/' (base path) to a controller called 'Pages',
  • its action called 'display', and we pass a param to select the view file
  • to use (in this case, src/Template/Pages/home.ctp)...
    */
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);

/**

  • ...and connect the rest of 'Pages' controller's URLs.
    */
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);

/**

  • Connect catchall routes for all controllers.
  •  
  • Using the argument DashedRoute, the fallbacks method is a shortcut for
  •    $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);
  •    $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
  •  
  • Any route class can be used with this method, such as:
  • - DashedRoute
  • - InflectedRoute
  • - Route
  • - Or your own route class
  •  
  • You can remove these routes once you've connected the
  • routes you want in your application.
    */
    $routes->fallbacks(DashedRoute::class);
    });

 試したこと

考えている原因として、
UsersControllerのbeforeFilterメソッドで行っている
$this->Auth->allowで認証しなくてよいページを定めているため
他のページにアクセスできていないきがします。
どうすれば、他のページにアクセスできるように変更できるでしょうか。

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

cakephp3

 追記

申し訳ありません。
routes.phpというものが大事だったのですね。
routes.phpを書き換えれば、Usersコントローラーの認証は関係なくなるのでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/09/21 18:32

    ルーティングはどのように設定されているのでしょうか。 https://book.cakephp.org/3.0/ja/development/routing.html フレームワーク配下のファイルであればルールに則ってアクセスしないと幾ら直でURLを実行しようとしても無理かと思います。

    キャンセル

回答 1

checkベストアンサー

0

HomeControllerはAppControllerを継承していますか?
AppContoroller#isAuthorizedがfalseを返すようになっているので、AppControllerを継承したコントローラーはログイン状態に関係なくアクセスできなくなっているのだと思います。

UsersControllerにアクセスできるのは、isAuthorizedをオーバーライドしtrueを返すようになっているからです。

認証(Authentication)と認可(Authorization)は別ものですので、そこを理解できると解決できると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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