会員制サイトを製作するにあたり、ユーザー認証システムとして「Sentinel」というフリーミアムライセンスのライブラリを使用することにしました。
Sentinelは、以下のような機能を備えています。
- ユーザは複数グループに所属可能。
- 複数の要素でログイン可能(email、ユーザー名、etc)
- リマインダーメール機能
- 権限をユーザとグループそれぞれに持たせられ、それらの重ね掛けも可能。
- ログイン失敗時に規定回数でアカウントをロックさせられる
ユーザー認証システムとして十分な機能が実装されています。
導入は、もはやお約束のcomposerでサクッと行います。「schema」ディレクトリの中にSQL文が用意されていますので、それを使ってMYSQLに必要なテーブルを構築してやります。
sentinelを複数サブドメインで使用する
さて、ここからが本題ですが、今回の案件は複数のサブドメインにまたがるログイン機能を必要としておりますが、Sentinelをテストしたところ(当然のことですが)未対応でした。
SentinelはGithubで公開されていますので、パッケージをフォークして、クッキーの読み書き部分を書き直すことで対応しようと思ったのですが、コードを読み進めるうちに書き換えなくても対応できることが分かりましたので、ここにシェアしておきたいと思います。
例えば、「example.com」というドメインの場合、以下のように手動でSentinelインスタンスを初期化してやればOKです。
use Cartalyst\Sentinel\Native\Facades\Sentinel; use Cartalyst\Sentinel\Native\SentinelBootstrapper; $bootstrapper = new SentinelBootstrapper(['cookie' => ['domain' => '.example.com']); Sentinel::instance($bootstrapper);
「SentinelBootstrapper」という初期設定用のインスタンスを作って、Sentinelを手動で初期化します。
パラメータは連想配列で指定します。クッキーの適用範囲をサブドメインを含めるように指定してやれば良いので、先頭にドットを付けた「.example.com」をドメインに指定します。
クッキーに関係する部分のコードを読めば分かるのですが、ドメイン以外にもパスやSSLなどクッキーに関する設定をカスタマイズすることができます。縦えば引数を以下のように指定すると、サブドメインに対応し、尚且つSSL通信のみに対応したログインシステムになります。
['cookie' => ['domain' => '.example.com', 'secure' => true]]
参考になりましたら幸いです。
バイナラ、ナライバ
ホームページの制作(デザイン・コーディング・プログラミング)に加え、ネットショップの販売促進に関するアドバイスも致します。 20年以上に渡って実際にネットショップを運営した経験を生かし、聞きかじりではない実績を伴ったノウハウを、自分の言葉でお伝えいたします。 プログラミングの経験は30年以上。HTML、CSS、JavaScript、TypeScript、Vue、NuxtJS、Node.js、MySQL、MongoDB、Elasticsearch、WordPress、PHP、Docker、Electronなど、幅広く対応します。
コメント
[…] ログイン失敗時に規定回数でアカウントをロックさせられる (ユーザー認証パッケージSentinelを複数サブドメインで使用する) だそうですが、今回使いたいのは単純に ・メールアドレス […]