0

我想用 FOSUserBundle 保护我的 API(并避免使用 FOSOAuthServerBundle,因为缺少完整示例的文档)。

为了使我的 API 安全,我刚刚创建了防火墙,如下所示:

firewalls:
    dev:
        pattern:       ^/(_(profiler|wdt)|css|images|js)/
        security:      false
    api_doc:
        pattern:      ^/api/doc
        security:     false
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_token_generator: security.csrf.token_manager
        logout:       true
        anonymous:    true

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] } 
    - { path: ^/admin/, roles: [ROLE_SUPER_ADMIN]}

这很棒!但这要求每个人在使用网站之前都必须连接,以便我可以显示广告列表等。(出于安全目的,即使是 GET 查询也需要连接)

为了克服,我正在考虑让所有用户都与具有有限权限的“默认”用户连接(对于简单查询而无需发布就足够了)。

有可能这样做吗?

谢谢你的帮助。

PS:我确实设法让 FOSUserBundle 和 FOSOAuthServerBundle 一起工作。事实上,我能够创建一个客户端并通过命令行为其获取访问令牌。但是,我无法security.yml正确配置,以便获得一个返回访问令牌的登录页面。

4

1 回答 1

0

查看有关如何使用 API 密钥验证用户的 symfony 条目。该条目包含您需要的大部分代码,并且有据可查。

您必须在fos_user表中为 API 密钥添加一个字段,例如

ALTER TABLE fos_user ADD api_key VARCHAR(255) DEFAULT NULL;

您还需要ApiKeyUserProvider::getUsernameForApiKey根据给定的 API 密钥正确实现在数据库中查找用户,如下所示:

$repository = $this->manager->getRepository('Application\UserBundle\Entity\User');
$user = $repository->findOneBy(array('apiKey' => $apiKey));
return empty($user) ? $user : $user->getUsername();

几年前我实现了这个,它很容易遵循并且效果很好!

于 2016-09-15T06:49:51.153 回答