エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説

      2019/03/25

CakeDC/Usersのリダイレクト設定解説

 
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応」の記事で、CakePHP3で CakeDC/Usersを使ってログイン認証機能を実装し、実際にログインを実施してみました。
果たしてログイン後はどこの画面に遷移するでしょうか?
 
今回の記事では、そのログイン後に遷移する画面(リダイレクトする画面)を設定する方法を解説します。
 
 

CakeDC/Usersのログイン後のリダイレクト設定

 

1.bootstrap.phpを編集

 
最初にリダイレクトの設定情報を記述する設定ファイルの情報を「bootstrap.php」に追記します。
 
編集するファイルは下記になります。
/config/bootstrap.php
 
下記の 1行目の記述を追加します。

Configure::write('Users.config', ['users']);
Plugin::load('Users', ['routes' => true, 'bootstrap' => true]);

 
追記する場所は「CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応」で、CakeDC/Usersをインストールしたときに追記した、2行目のプラグインをロードする「Plugin::load...」の前に記述をします。
「Configure::write...」と「Plugin::load...」の順番は重要な意味を持ちますので、順番を間違えないように記述します。
 
 

2.users.phpを作成、編集

 
続いて、前項で追記した内容に該当する設定ファイル「users.php」を作成し、内容を編集します。
 
作成し、編集するファイルは、以下となります。
このファイルは、新規で作成をします。
/config/users.php
 
編集する内容は、以下になります。

<?php
use Cake\Core\Configure;
use Cake\Routing\Router;

$config = [
    //default configuration used to auto-load the Auth Component, override to change the way Auth works
    'Auth' => [
        'loginAction' => [
            'plugin' => 'CakeDC/Users',
            'controller' => 'Users',
            'action' => 'login',
            'prefix' => false
        ],
        'authenticate' => [
            'all' => [
                'finder' => 'auth',
            ],
            'CakeDC/Users.ApiKey',
            'CakeDC/Users.RememberMe',
            'Form',
        ],
        'authorize' => [
            'CakeDC/Users.Superuser',
            'CakeDC/Users.SimpleRbac',
        ],

        'loginRedirect' => [ // ログイン後
            'plugin' => 'CakeDC/Users',
            'controller' => 'Users',
            'action' => 'index',
        ],
        'logoutRedirect' => [ // ログアウト後
            'plugin' => null,
            'controller' => 'Pages', // トップページにリダイレクトする例
            'action' => 'display', 'home',
        ]
    ],
];

return $config;

 
この編集する内容の基本形は、プラグインの設定情報ファイルである「/vendor/cakedc/users/config/users.php」にありますので、必要に応じてコピペすると楽に設定できます。
 
28~30行目がリダイレクトする URLの指定です。
上記の設定は、下記の URLにリダイレクトする設定になっています。
 http://example.com/users/users/
 
また、32~36行目がログアウトしたときにリダイレクトする URLの指定です。
上記の設定は、トップページにリダイレクトするようになっています。
 
 

2.permissions.phpを作成、編集

 
パーミッションの設定を行う「permissions.php」を作成し、内容を編集します。
 
パーミッションの設定は、ユーザのロール(role、権限)に対してどのページを表示させることができるか、という設定を行うもので、この設定を正しく行わないとリダイレクト先のページが表示されない場合も出てきます。
 
編集するファイルは、以下となります。
ファイルがない場合は新規作成します。
/config/permissions.php
 
 
編集する内容は、以下になります。

<?php
    return [
        'Users.SimpleRbac.permissions' => [
            [
                'role' => 'user',
                'controller' => '*',
                'action' => "*",
            ],
            [
                'role' => 'superuser',
                'controller' => '*',
                'action' => "*",
            ],
        ]
    ];

 
上記の設定は、「*」を指定することで、すべてのコントロール、すべてのアクションを対象にアクセスを可能にする設定で、「user」も「superuser」もすべてのページにアクセスする権限を割り当てています。
 
アクセスできるページを制限する場合は、下記のような形でページを指定します。
 

<?php
    return [
        'Users.SimpleRbac.permissions' => [
            [
                'role' => 'user',
                'plugin' => 'CakeDC/Users',
                'controller' => 'Users',
                'action' => ['register', 'edit', 'view'],
            ],
        ]
    ];

 
permissions.phpの標準設定は、下記のファイルにありますので、あわせて参考にしてください。
/vendor/cakedc/users/config/permissions.php
 
 


 

CakeDC/Usersのリダイレクトの特性を理解する上で大事なポイント

 

CakeDC/Usersのリダイレクト設定の仕様

 
CakeDC/Usersのリダイレクト設定には非常に悩ましい事象があります。
リダイレクト設定をしていても想定しているページにリダイレクトしない、という事象です。
 
ただ、これは、CakeDC/Usersのリダイレクトの仕組みですので、そういうものだという理解をする必要がある内容です。
 
 
CakeDC/Usersのリダイレクトは、下記の仕組みになっています。

  • 認証が必要なページにアクセスをし、権限がないためにログインページにリダイレクトした場合は、ログイン認証が実行されると、ログイン前にリダイレクトしたページにリダイレクトする
  • 上記の設定がない場合は、リダイレクトの設定に従ってリダイレクトをする

 
そのため、例えば、
 
  http://example.com/
にアクセスします。でも、認証が必要なページのため
  http://example.com/login
にリダイレクトします。この場合、ログイン認証を通過すると
  http://example.com/
に遷移します。
 
この記事で解説をした「http://example.com/users/users/」にリダイレクトをする設定にしていたとしても、ログイン後は「http://example.com/」にリダイレクトするのです。
そのため、リダイレクト設定が正しく動作していないんじゃないか、という気になるのですが、ログイン画面「http://example.com/login」の前にアクセスしていた URLが「http://example.com/」であるため、正しい動きなのです。
「http://example.com/login」にリダイレクトした後にリロードしたり、ブラウザを閉じても動作は変わりません。
 
 
この記事で解説をしたリダイレクト設定を検証するには、
・検証に一度も使っていないブラウザを用意するか
・ブラウザのキャッシュをすべて削除するか
の対応を行う必要があります。
そのうえで、「http://example.com/」などリダイレクトする URLを入力せずに、直接「http://example.com/login」の URLを入力する、という方法が必要です。
 
その状態でログインすると、「/config/users.php」に設定したリダイレクトページに遷移します。
 
 

CakeDC/Usersのリダイレクトを実運用で活用するポイント

 
実運用上は、ユーザがわざわざブラウザを変えたり、キャッシュを削除してアクセスすることはないワケですので、設定しているリダイレクト処理はほぼ使われることはない、ということになるでしょう。
 
また、実運用上は、リダイレクトさせたいページがある場合は、リダイレクト設定をしたうえでログイン画面を呼び出すのではなく、リダイレクトさせたいページにリンクを張って、ログインページにリダイレクトさせる、という処理が必要になるのでしょう。
 
具体的には、「http://example.com/news/」にリダイレクトさせたいとしましょう。
 
その時は、「ログインページはこちら」のリンクは「http://example.com/login」ではなく、「http://example.com/news」に設定したうえで、リダイレクトして「http://example.com/login」に遷移するようにしておく、ということですね。
 
 
この仕様は一見するとややこしいように感じますが、ログイン認証を要求するリンクごとにログイン後にリダイレクトするページを指定することが簡単な仕様、ということになります。
 
具体的には、同じページの中でもそれぞれ認証が必要なページにリンクを設定します。
 ・マイページはこちら(http://example.com/mypage)
 ・ニュース更新はこちら(http://example.com/news)
この状態で、すでに認証を通っていればそのページに遷移しますが、認証が通っていなければログイン画面が出て、その後、それぞれのページに遷移する、ということです。
 
ブラウザをリロードしたり、ブラウザを閉じてもログイン後のリダイレクトする URLの情報は失われませんので、ログイン前にユーザの作業が中断しても、ログイン後は想定しているページにリダイレクトする安心な仕様になっています。
(これを安心な仕様とみるか、余計な仕様とみるか、判断は分かれると思いますが...)
 
 

permissions.phpの設定ミスでログアウトできない場合も

 
permissions.phpの設定を間違えて、ログアウトページにアクセスできない設定にしてしまうと、ログアウトができなくなります。
 
私が初めて CakeDC/Usersインストールしたとき、何も考えずに「superuser」でログインしたのですが、ログアウトの URLがそもそも分からなかったことと、permissions.phpの設定を間違えていたことで、ログアウトができずに困ったことがありました。
 
permissions.phpの設定は、十分に注意して設定し、十分な検証を実施しましょう。
 
 

CakePHP3のCakeDC/Usersの関連記事

 
CakePHP3の CakeDC/Usersを使うために、基本となるインストールの方法から入力画面のテンプレートのカスタマイズや、リダイレクトの設定など、CakeDC/Usersに関する記事を下記に書いています。
あわせて参考にしてみてください。
 CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
 CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
 CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
 Google reCAPTCHAのSite key、Secret keyの取得方法・20170408バージョン
 CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
 
 

CakePHP3の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3で値を入力直後にバリデーションする方法解説
CakePHP3で値を入力直後にバリデーションする方法解説

CakePHP3でバリデーションの実行を保存する時から入力情報を受け取るときに変更する処理の解説。CakePHP3ではnewEntity()の処理でバリデートするため1行追加で対応可能。

CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。

VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する。
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する

VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。

CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法

CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。

CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応

CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!

CakePHP 2.x系 Viewでのコメントの記述方法など

CakePHPにおいて View、ctpファイルでコメントを記述する方法を解説。

CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
CakePHP3、CakePHP4のdatetime型カラムの日時の扱い。秒まで表示する方法

CakePHP3の日時カラムで秒まで扱う場合はdate()、strtotime()関数ではうまくいかない。CakePHP3であらかじめ用意された「i18nFormat()」を使用する。

CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法

CakePHP4でcontrollerで実行したバリデーションの結果をModelのバリデーション結果に追加するメソッド「setError()」「setErrors()」の使い方の解説。

CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法

CakePHP4で定数に変数を埋め込み、翻訳機能「__()」で変数に値を入れる方法を紹介。定型の文章の一部だけを置換したい場合に利用すると便利。


Warning: Trying to access array offset on null in /home/ss-giken/s-giken.net/public_html/blog/wp-content/plugins/amazonjs/amazonjs.php on line 637