Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony API平台授权与身份验证_Symfony_Authentication_Jwt_Authorization_Api Platform.com - Fatal编程技术网

Symfony API平台授权与身份验证

Symfony API平台授权与身份验证,symfony,authentication,jwt,authorization,api-platform.com,Symfony,Authentication,Jwt,Authorization,Api Platform.com,我正在使用开发一个API,我正在努力解决如何保护API 我的前端应用程序(博客站点)包含的内容不需要用户登录即可查看(公共内容)。要从API获取此内容,我不需要对用户进行身份验证,但我仍然需要授权应用程序,以防止每个人都能够调用API。一些示例路线包括: GET /api/blogs GET /api/blogs/{id} POST /api/users POST /api/blogs 用户仍然可以登录以访问站点的其他部分(安全内容)。对于这些API调用,我需要验证用户以检查其角色(管理员或

我正在使用开发一个API,我正在努力解决如何保护API

我的前端应用程序(博客站点)包含的内容不需要用户登录即可查看(公共内容)。要从API获取此内容,我不需要对用户进行身份验证,但我仍然需要授权应用程序,以防止每个人都能够调用API。一些示例路线包括:

GET /api/blogs
GET /api/blogs/{id}
POST /api/users
POST /api/blogs
用户仍然可以登录以访问站点的其他部分(安全内容)。对于这些API调用,我需要验证用户以检查其角色(管理员或其他角色)。一些示例路线包括:

GET /api/blogs
GET /api/blogs/{id}
POST /api/users
POST /api/blogs
建议使用JWT进行身份验证,但这意味着用户必须登录才能查看公共内容。在
security.yaml
中,我尝试了以下方法:

access_control:
  - { path: ^/api/blogs, roles: IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/api/users, roles: ROLE_ADMIN }
但是,
/api/blogs
被列为白名单,每个人或任何应用程序都可以从api调用它

以下是我的
安全性的全部内容。yaml

security:
  encoders:
    App\Entity\User:
      id: App\Security\PasswordEncoder

  providers:
    app_user_provider:
      entity:
        class: App\Entity\User
        property: email
  firewalls:
    dev:
      pattern: ^/(_(profiler|wdt)|css|images|js)/
      security: false

    main:
      pattern: ^/api/
      stateless: true
      anonymous: true
      provider: app_user_provider
      json_login:
        check_path: api_authenticate
        username_path: email
        password_path: password
        success_handler: lexik_jwt_authentication.handler.authentication_success
        failure_handler: lexik_jwt_authentication.handler.authentication_failure
      guard:
        authenticators:
          - lexik_jwt_authentication.jwt_token_authenticator

  access_control:
    - { path: ^/api/blogs, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api/users, roles: ROLE_ADMIN }

我的问题是,在我的情况下,处理授权和身份验证的正确方法是什么?JWT是否足以同时完成这两项工作?我需要在数据库中创建一个特殊的API用户吗?

一个“JSON Web令牌”(JWT)就是客户端(浏览器)告诉应用程序一个应用程序可以验证的“声明”(例如,“我是John Appleseed,用户号123”)的一种方式

它之所以能够这样做,是因为声明首先由应用程序生成并以加密方式签名:任何对该声明和应用程序的篡改都会知道它是无效声明

因此,JWT仅适用于身份验证:验证系统中的用户身份。你是谁

验证成功后进行授权。应用程序是否根据您的身份确定您拥有或无权访问哪些资源或操作。你可以这样做吗

通常,在Symfony中有两种处理授权的方法。您可以在
security.yaml
上配置
access\u control
键,或者如果您的要求更复杂,您可以在控制器中处理它

在您的情况下,使用JWT令牌并配置
access\u control
就足够了。您的API中有公共部分,任何用户都可以查询(
以匿名方式进行身份验证),还有私有部分,只有经过身份验证的用户才能访问
角色管理

进一步阅读:

通过正确的CORS(允许的来源)设置阻止其他站点(应用程序)访问您的API。如果在Nginx/PHP-fpm组合中使用Nginx作为反向代理,那么这可以在PHP(Symfony)级别或Nginx级别上完成


如果您的API仅用于服务器到服务器的通信,您还可以向头或请求添加一些特定的“sitekey哈希”。与您请求Google API时类似。但这是前端到后端通信的要点,因为密钥在前端是可见且不安全的。

@yivi感谢您的回复。等我到电脑前再查一下谢谢你的回答。但是如果我将公共部分设置为匿名的
IS\u AUTHENTICATED\u
,这难道不意味着任何知道API端点的人都可以直接调用API吗?如果我还想保护API,这样只有授权的应用程序才能调用API呢?我不明白你说什么。要么您希望API的一部分是公共的,要么您不希望它是公共的。阅读您的问题,您似乎希望
/api/blogs/
是公共的(因此,无需登录即可访问),而
/api/users/
是私有的(只有经过身份验证和授权的用户才能访问)。如果不是这样的话,您可能需要进一步解释您想要实现的功能。我想我将使API成为一个私有API,只有内部应用程序才能调用它。然后,我只需要担心授权用户使用JWT和特定于保护的端点。谢谢你的帮助。