2016-01-13 9 views
5

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

fos_oauth_server: 
    service: 
     options: 
      supported_scopes: user admin 

security.ymlマイaccess_controlセクション空で、私の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 

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

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

私は何が欠けていますか?ユーザー役割がトークンスコープに接続されていませんか?私のユーザーが管理者であるかどうかを知る良い方法はありますか?

+0

あなたの 'security.yml'でないかもしれないし、' config.yml'からペーストしているのでしょうか? 'security.yml'から' access_control: 'セクションを提供できますか? –

+0

あなたは正しいIllyaです。私の質問を編集する。 –

答えて

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 
} 

を再びから今doc

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

これが役に立ちます。

UPDATE:

同様の質問への答えは、このhereを見て、FOSOAuthServerBundleを設定する上でこのarticle。設定部分に細心の注意を払ってください。

+0

しかし、私のフロントエンドでユーザーが管理者であるかどうかを知ることはできますか? –

+0

小枝テンプレートでは、あなたがこれを行うことができます: '{%をis_granted場合( 'ROLE_ADMIN')%} {#いくつかのテキスト#} {%endifのの%}' か、ユーザーのエンティティでisGrantedメソッドを実装します(http:/ /stackoverflow.com/questions/9080530/get-role-of-a-user-not-logged-in-twig-symfony2) – Delphine

+0

Delphine、あなたは私の言葉を得ていませんでした。私はREST APIを使用して、JavaScriptのフロントエンドからデータを要求します。私はAPIリクエストをしてから、自分のユーザー役割を取得する必要があります。このデータは私が/私が要求するときには来ない。 APIトークンを要求すると、戻り値には "scope"パラメータがあります。しかし、私はそれが正しい方法であるかどうかわからないし、動作していないように見えます。 –

1

FOSOAuthServerBundleトークンに基づいてユーザーを認証するので、スコープについて心配する必要はありません。それは役割とは異なるものです。あなたのコントローラーの内部では、$this->getUser()を取得して現在の認証済みユーザーを取得できます。この場合、isGrantedも同様に機能しているかどうかを確認します。あなたはAccessTokenエンティティにEAGERfetchを設定する必要があります$this->getUser() doesntの仕事の場合は

http://symfony.com/doc/current/book/security.html

public function helloAction($name) 
{ 
    // The second parameter is used to specify on what object the role is tested. 
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!'); 

    // Old way : 
    // if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { 
    //  throw $this->createAccessDeniedException('Unable to access this page!'); 
    // } 

    // ... 
} 

class AccessToken extends BaseAccessToken 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Client") 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    protected $client; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", fetch="EAGER") 
    */ 
    protected $user; 
} 
+0

あなたは私のポイントを得ていません。自分のフロントエンドでユーザーの役割を知る方法が必要です。だから私がトークンを要求するとき、私はどの役割がユーザに与えられているかを知る必要がある。トークンには既に 'scope'パラメータがありますが、期待通りに動作していないようです(上記の例を挙げました)。 –

+0

あなたはapiから現在のユーザーデータを取得できませんか? – Vardius

+0

いいえ...ユーザの詳細を要求したときFOSOAuthServerBundleはスコープやルールを返しません。私の質問に注意を払うと、/トークンリクエストがあなたにスコープを与えていることがわかりますが、予想通りに動作していません。 –

1

back to 2013 for thisをさかのぼりgithubの上の問題があります。あなたがその問題を読んでリンクをたどると、最終的にスポークキーのユーザーはhis own library and Symfony bundleになり、FOSAuthServerBundleのsuggested as a maintainerになります。 FOS組織がSpomkyの作業を安定させると、FOSOAuthServerBundleの次のメジャーバージョンにマージされるようです。

関連する問題