nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

Symfony2の認証(access_controlとrole_hierarchy編)

Symfony2のユーザーには、権限のレベルを細かく設定できます。

ここでの説明には、Entity経由でログイン編のソースを使います。

権限を確認するために、アクションを1つ追加します。

Controller/DefaultController.php

...

    /**
     * @Route("/user/sugoi")
     * @Template()
     */
    public function sugoiAction()
    {
        return array(
        );
    }

...

Resources/views/Default/sugoi.html.twig

sugoi

当たり前ですが、この時点では、ログインすれば app_dev.php/user/sugoi にはアクセスできます。

では、アクセスできなくしてみましょう。

app/config/security.yml

…

    access_control:
        - { path: ^/user/sugoi, roles: [ROLE_ADMIN] }

これで、 app_dev.php/user/sugoi にアクセスすると、403になるようになりました。

では、一度ログアウトして、UserクラスのRoleをROLE_ADMINにしましょう。

Entity/User.php

    private $roles = array('ROLE_ADMIN');

これでログインすると、 app_dev.php/user/sugoi にアクセスできます。

role_hierarchyの設定は、権限の上下関係を表しています。現在は、

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER

となっていますので、security.ymlを、

…

    access_control:
        - { path: ^/user/sugoi, roles: [ROLE_USER] }

としても、ROLE_ADMINの人は、 app_dev.php/user/sugoi にアクセスすることができます。

access_controlの設定は、rolesの他にも、


  • requires_channel : アクセス方法の設定(https と指定すると強制的にhttps接続になります)

  • ip : 接続元IPアドレスの設定("192.168.0.1/24"とか指定可)


などで縛ることができます。(あとhostとかmethodsとかあるようですが確認できませんでした)
rolesには特殊な権限を3種類設定することができます。(ここから引用)

  • IS_AUTHENTICATED_ANONYMOUSLY : 実際にログインしていないユーザが、サイト上のファイアーウォールの保護された場所にアクセスしたユーザに自動的に割り当てるロール。これは匿名アクセスを許しているときのみ使用可能です。

  • IS_AUTHENTICATED_REMEMBERED : remember me クッキーを介して認証されたユーザに自動的に割り当てるロール。

  • IS_AUTHENTICATED_FULLY : 現在のセッション中にログインをしたユーザに自動的に割り当てるロール。


早い話が、ANONYMOUSLYは、firewallsで設定されていて、anonymousがfalseでない箇所に、ログインしていないユーザーが入ったら設定される、REMEMBEREDは、「remember me」機能を使う場合の権限、FULLYは、ログイン中の全ユーザーが対象になります。REMEMBEREDについては、引用元URLを参照してください。