🎻

[Symfony] switch_user(ユーザー切り替え)機能の使い方

2020/06/14に公開

ドキュメント を読めば分かることをわざわざ日本語記事にしていくシリーズです笑

Symfonyのユーザー管理機能(Securityコンポーネント)には、 switch_user という機能があり、正規のログインフォームを介さずに別のユーザーでログインした状態に切り替えるということが可能です。

その方法を説明します。とても簡単です。

1. security.yaml に行追記

# 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 を渡すだけです👌

GitHubで編集を提案

Discussion