5

FOSOAuthServerBundle を使用してユーザーを認証する基本的な API があります。ユーザーは、ROLE_USER および ROLE_ADMIN ロールを持つことができます。FOSOAuthServerBundle docs に基づいて、デフォルトの動作はスコープをロールとして使用することであるため、通常のユーザーがいる場合はバンドルがscope: user応答で返され、管理者ユーザーの場合はscope: admin. しかし、それはこのように機能していません。バンドルは、supported_scopesエントリで構成されているものをすべて返します。以下は私のconfig.ymlです。

fos_oauth_server:
    service:
        options:
            supported_scopes: user admin

の私のaccess_controlセクションsecurity.ymlは空で、私のfirewallsセクションは以下のとおりです。

firewalls:
        users_create:
            pattern: ^/v1/users
            methods: [POST]
            security: false

        api:
            pattern:    ^/
            security: true
            fos_oauth:  true
            stateless:  true

access_control:
        # You can omit this if /api can be accessed both authenticated and anonymously

この方法ではuser admin、ユーザーが ROLE_ADMIN ロールを持っていなくても、バンドルは常にスコープとして返​​されます。

{
"access_token": "ZGQ2ODE5ZjAzNTZkOWY0OWMyNmZmODE4MjcwZTJmYjExNzY0NzQxOTRmMzk4NzA2Mjc2NjIyZmY1ZDgwMzk4NA"
"expires_in": 3600
"token_type": "bearer"
"scope": "user admin"
"refresh_token": "NmM5ZGFmNzBiNTNjYmQzMTQ1MTk0ODJjOTAxMWU0YWIwMzM1MzgyODg4ZTAzNTI5ZTk2MDc3OGU2MTg0MWZiMA"
}

私は何が欠けていますか?ユーザー ロールはトークン スコープに関連付けられていませんか? ユーザーが管理者かどうかを知る良い方法はありますか?

4

4 に答える 4

2

docから、デフォルトの動作はスコープをロールにマップすることです。あなたの場合、ロールは ROLE_USER と ROLE_ADMIN になります。

使用を制限するには、security.yml ファイルを次のように編集します。

# app/config/security.yml
security:
    access_control:
        - { path: ^/api/super/secured, role: ROLE_ADMIN }
        - { path: ^/api/general, role: ROLE_USER }

コントローラー内のアクセスを制限するには、これを使用できます。

if ($this->get('security.context')->isGranted('ROLE_ADMIN')) {
    // the user has the ROLE_ADMIN role, so act accordingly
}

再びドキュメントから、

これで、クライアントはアクセス トークンを要求するときにスコープ パラメーターを渡すことができるようになります。

お役に立てれば。

アップデート:

同様の質問に対するこちらの回答、 FOSOAuthServerBundle の設定に関するこの記事をご覧ください。構成部分に細心の注意を払ってください。

于 2016-02-02T16:46:20.830 に答える