eccube4系の管理画面やマイページのログイン機能は、SymfonyのSecurityをもとに構築されています。
このSecurityのシステムが強力で、security.yaml
に設定を書いておけば、特定の特定のURLには、ログインが必要といった実装がかなり楽に実装できます。
今回はeccube4系の実装をみて理解していきます。
eccube4の場合security.yaml
のパスは、app/config/eccube/packages/security.yaml
にあります。
またアクセスコントロールの設定は別ファイルsrc/Eccube/DependencyInjection/EccubeExtension.php
に書かれています。
あと、eccube4の特徴としてアクセスコントロールの設定が、src/Eccube/DependencyInjection/EccubeExtension.php
に書かれています。
security.yaml
に書けば、設定をsecurity.yaml
のみに集約できるため読みやすいですが、
あえてこちらに書かれているのは、動的に設定値を設定したい機能があるためと思われます。
↓src/Eccube/DependencyInjection/EccubeExtension.php
eccube4ではfirewalls
という階層の下に、admin
とcustomer
が設定されています。
eccube4ではサイト運営者用の管理画面、と会員マイページの画面の2つのログイン制御を行う必要があります。
複数のログインを制御するためにadmin
、customer
の下にprovider
というキーがあり、
そこで、member_provider
と、customer_provider
が指定されています。
また、その実装クラスは、第2階層のproviders
に指定されています。
管理画面のMemberProvider
と会員マイページのCustomerProvider
のクラスには、
Core/User/UserProviderInterface.php
のインターフェースが定義されています。
例えばですが、Providers
とfirewalls
下の値を増やせば、管理画面・マイページ以外の認証機能も追加していくことが可能です。
ログインフォームのパスを指定している部分がform_login
下のlogin_path
とcheck_path
です。
/login
等のURLまたは、ルート名(eccubeの場合admin_login)を指定することで、
ログイン時のフォームのリダイレクト設定をいい感じにしてくれます。
firewalls
を設定しても、これだけでは、ログイン後の画面はセキュアではありません。
後ほど解説するアクセスコントロールの設定と合わせることで認証の制御が可能となります。
参考: https://symfony.com/doc/3.4/security/form_login_setup.html#create-the-correct-routes
アクセスコントロールの解説の前に、anonymous(匿名)について軽く説明します。
管理画面、マイページともにfirewalls
の中で、anonymous: true
と設定されています。
anonymous: true
とすることで、匿名のユーザーを作り出します。
また、この匿名ユーザーはログイン前のロールとして使用されます。
(Symfonyのプロファイラーでもanonymous
は確認できます。
認証されたユーザーのみ閲覧できるようにする場合は、URLのパターンとロール(Role)で制御します。
eccube4の場合、src/Eccube/DependencyInjection/EccubeExtension.php
の実装がそれに当たります。
(もちろんSecurity.yaml
に記載することもできます。)
ログインしていない状態の場合、IS_AUTHENTICATED_ANONYMOUSLY
が設定されています。
たとえば/admin
のpathとROLE_ADMIN
のRoleが設定されている場合、
匿名ユーザーの場合、アクセスコントロールで設定されたURLはロール閲覧できません。
管理画面のURLには、ROLE_ADMIN
つまり管理者としてログインしていないと閲覧できないといった設定をしています。
マイページの場合も同様です。
参考: https://symfony.com/doc/3.4/security.html#add-code-to-deny-access
アクセスコントロールの実装をよくみると、
マイページの会員情報の編集(/mypage/change)のロールにIS_AUTHENTICATED_FULLY
の指定があります。
Securityの機能で以下の特別な属性(ロールに近いもの)があるようです。
IS_AUTHENTICATED_REMEMBERED
IS_AUTHENTICATED_FULLY
IS_AUTHENTICATED_ANONYMOUSLY
IS_AUTHENTICATED_ANONYMOUSLY
はログイン前の状態です。
セッションが続く時間よりも長くログインしたままにすることをユーザーに選択させることができるremember_me
の状態によって、
IS_AUTHENTICATED_REMEMBERED
とIS_AUTHENTICATED_FULLY
での認証の結果は変わります。
remember_me
のクッキーがブラウザに残っており、セッションが切れている場合に、
IS_AUTHENTICATED_FULLY
では認証に失敗しますが、
IS_AUTHENTICATED_REMEMBERED
は認証に成功します。
マイページの会員登録画面は不正にログインされると問題があるため、
他の画面と異なり、remember meではなく、セッションが保持されているときのみアクセス可能とすることで、セキュリティの強度を上げていると考えられます。
すべての設定値を解説できていないので、eccube4のSecurity.yamlを完全に理解したとまでは言えないですが、
Securityの主要な部分について解説できたかなと思います。
eccube4はSymfonyに則って実装されているので、ドキュメントが豊富です。
本記事はこれで終了ですが、詳しく知りたい方はぜひドキュメントを確認してみてください。(Google翻訳さえあればなんとかなります。)
eccube4の開発は、実装でも迷ったら最悪ドキュメント当たりつつ本体のソースコードを読めばだいたい解決するので、安心感がありますねー。