首页 > 解决方案 > 没有为“x”防火墙上的“守卫”侦听器明确配置提供者是不明确的,因为有多个注册提供者

问题描述

当我尝试执行两个不同的用户登录路径时,我需要帮助来解决错误。我想知道如何使用两个提供商来验证两种类型的用户(管理员/商品)。

当我在 security.yaml 中使用两个提供程序时,我的错误在 Symfony 中看起来像这样:

没有为“api”防火墙上的“guard”监听器显式配置提供程序是不明确的,因为有多个注册提供程序。

注意:我使用的是 JWT 身份验证。

我的文件security.yaml:

security:
  encoders:
    App\Entity\User:
      algorithm: argon2i
    App\Entity\Merch:
      algorithm: argon2i
providers:
  users_provider:
    name: users_provider
    entity:
      class: App\Entity\User
      property: username   
  merchs_provider:
    name: merchs_provider
    entity:
      class: App\Entity\Merch
      property: codeMerch
firewalls:
  dev:
    pattern: ^/(_(profiler|wdt)|css|images|js)/
    security: false
  login_users:
    pattern:  ^/api/user/login
    stateless: true
    anonymous: true
    provider: users_provider
    context: my_context
    json_login:
      check_path: /api/user/login_check_user
      success_handler: lexik_jwt_authentication.handler.authentication_success
      failure_handler:          lexik_jwt_authentication.handler.authentication_failure
    login_merch:
      pattern:  ^/api/merch/login
      stateless: true
      anonymous: true
      provider: merchs_provider
      context: my_context
      json_login:
        check_path: /api/merch/login_check_merch
        success_handler: lexik_jwt_authentication.handler.authentication_success
        failure_handler: lexik_jwt_authentication.handler.authentication_failure
    refresh:
      pattern:  ^/api/token/refresh
      stateless: true
      anonymous: true
    api:
      pattern:   ^/api
      stateless: true
      guard:
        authenticators:
        - lexik_jwt_authentication.jwt_token_authenticator
    main:
      anonymous: true
access_control:
  - { path: ^/admin, roles: ROLE_ADMIN }
  - { path: ^/validator, roles: ROLE_VALIDATOR }
  - { path: ^/api/user/login, roles: ROLE_ADMIN }
  - { path: ^/api/merch/login, roles: ROLE_MERCH }
  - { path: ^/api/token/refresh, roles: IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }

标签: phpsymfony

解决方案


您有 2 个用户提供者:

  • users_provider
  • merchs_provider

您的防火墙配置api缺少您要用于此防火墙的配置

您需要为api防火墙显式配置提供程序以消除警告:

firewalls:
  # [..]
  api:
    pattern:   '^/api'
    stateless: true
    provider: 'users_provider'
    guard:
      authenticators:
        - 'lexik_jwt_authentication.jwt_token_authenticator'

使用链提供商允许用户和商家对 API 进行组合访问。

providers:
  # [..]
  chain_provider:
    chain:
      providers: ['users_provider', 'merchs_provider']

推荐阅读