使用FOSOAuthServerBundle限制对路由的访问

时间:2014-05-06 07:53:44

标签: symfony oauth fosoauthserverbundle

我已经创建了一个REST API,我实际上是尝试使用FOSOAuthServerBundle来保护它。

我创建了路由newclient以生成新客户端,现在我只想允许“管理员”#39;访问此网址。

我想我可以用scopes做到这一点,但我无法弄明白。

这是我的security.yml:

security:

    providers:
        user_provider:
            id: user_provider

    firewalls:
        doc:
            pattern:    ^/doc
            security:   false

        oauth_token:
            pattern:    ^/oauth/v2/token
            security:   false

        oauth_authorize:
            pattern:    ^/oauth/v2/auth
            provider: user_provider
            anonymous:  true

        api:
            pattern:    ^/
            fos_oauth:  true
            stateless:  true
            anonymous:  false

    access_control:
        - { path: ^/, roles: ROLE_CLIENT }
        - { path: ^/newclient, roles: ROLE_ADMIN }

我的config.yml

fos_oauth_server:

    db_driver: orm 
    client_class: WS\RESTBundle\Entity\Client
    access_token_class: WS\RESTBundle\Entity\AccessToken
    refresh_token_class: WS\RESTBundle\Entity\RefreshToken
    auth_code_class: WS\RESTBundle\Entity\AuthCode

任何提示?

1 个答案:

答案 0 :(得分:0)

实际上使用范围进行desling并不是最好的方法,而且捆绑包不支持它:https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/231

我使用了User模型,添加了一个“角色”方法,并检查当前用户的角色是否足以访问路由。

这是一段代码

//Get the current user, check if it's an admin
$token = $this->container->get('security.context')->getToken()->getToken();

$accessToken = $this->container
->get('fos_oauth_server.access_token_manager.default')
->findTokenBy(array('token' => $token));

$client = $accessToken->getClient();


if ($client->getRole() == 'admin') {

...
}

不确定这是否是最佳方式,欢迎任何建议!