最近、FOSUser FOSOAuthServer と FOSRest バンドルを使用して API をセットアップしました。
私のsecurity.ymlには次のものがあります:
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
oauth_token: # Everyone can access the access token URL.
pattern: ^/login
security: false
api:
pattern: / # All URLs are protected
fos_oauth: true # OAuth2 protected resource
stateless: true # Do no set session cookies
anonymous: false
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
これにより、ログイン ルートへの匿名アクセスが許可されますが、他のすべてのルートでは認証が必要になります。
リクエストを OAuth クライアントにプロキシするログイン ルートを作成しました。このようにして、ユーザーはクライアントの秘密を知ることはありません: (例ではクライアント ID と秘密を削除したことに注意してください)
/**
* @Post("/login")
*/
public function postLoginAction(Request $request){
$request->request->add( array(
'grant_type' => 'password',
'client_id' => 'clientID_clientRandomID',
'client_secret' => 'clientSecret'
));
return($this->get('fos_oauth_server.controller.token')->tokenAction($request));
}
有効なユーザー/パスが送信された場合、これは OAuth トークンを返します。
このトークンを取得したら、リクエストのヘッダーに追加できます
Authorization: Bearer OAuth_TOKEN
ユーザーが検証されると、必要に応じて、API 呼び出しでいつでもロールを確認できます。次のようなもの:
public function getUserAction()
{
$this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!');
$user = $this->getUser();
$view = $this->view($user);
return $this->handleView($view);
}
ロールをチェックする別の方法は、security.yml で実行できます。
# app/config/security.yml
security:
# ...
access_control:
- path: "^/api/users/\d+$"
allow_if: "'DELETE' == request.getMethod() and has_role('ROLE_ADMIN')"
これは次の投稿で見つけました: RESTFul OAuth with FOSOAuthServer / FOSRest & FOSUser
これは私が Symfony3 ビルドにアプローチした方法です。Symfony2 では一部の構文 (ユーザー ロールのチェック) が異なる場合があります。
APIを構築する際に、この投稿を参考にしました: http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/