🎻
[Symfony] switch_user(ユーザー切り替え)機能の使い方
ドキュメント を読めば分かることをわざわざ日本語記事にしていくシリーズです笑
Symfonyのユーザー管理機能(Securityコンポーネント)には、 switch_user
という機能があり、正規のログインフォームを介さずに別のユーザーでログインした状態に切り替えるということが可能です。
その方法を説明します。とても簡単です。
security.yaml
に行追記
1. # config/packages/security.yaml
security:
:
firewalls:
:
main:
:
+ switch_user: { role: ROLE_ADMIN }
これだけで、 ROLE_ADMIN
を持っているユーザーに対して switch_user
機能が許可されます👌(もちろん他のロールに対して許可してもOK)
ちなみに、 ROLE_ALLOWED_TO_SWITCH
というロールを持っているユーザーが自動で switch_user
の対象になるので、以下のような書き方でも同じ効果が得られます。
security:
firewalls:
main:
switch_user: true
role_hierarchy:
ROLE_ADMIN: [ROLE_USER, ROLE_ALLOWED_TO_SWITCH]
2. ユーザー切り替えをするためのリンクを設置
{% if is_granted('ROLE_ADMIN') %}
<a href="{{ path('home', {_switch_user: 'ユーザー名'}) }}">このユーザーに切り替え</a>
{% endif %}
こんな感じで、URLパラメータとして _switch_user=ユーザー名
を渡すだけで、ユーザーを切り替えてリンク先へ行くことができます👌
3. ユーザー切り替えを終了するためのリンクを設置
ユーザー切り替えを終了するためのリンクも忘れずに設置しておきましょう。
普段はログアウトするためのリンクが設置されている箇所を、ユーザー切り替え中はユーザー切り替え終了のためのリンクに置き換える、というふうにしておけば自然だと思います。
ユーザー切り替え中は ROLE_PREVIOUS_ADMIN
というロールを保持している状態になっているので、これで条件分岐すればOKです。
{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
<a href="{{ path('home', {_switch_user: '_exit'}) }}">ユーザー切り替え終了</a>
{% else %}
<a href="{{ path('logout') }}">ログアウト</a>
{% endif %}
こんな感じですね。ユーザー切り替えを終了するときはURLパラメータで _switch_user=_exit
を渡すだけです👌
Discussion