У меня есть приложение с формой входа в систему, которая работает нормально.
Затем я добавил к нему сторону API, используя это руководство. Теперь мой вход в веб-интерфейс больше не работает.
Это мой файл security.yaml:
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
users:
entity:
class: 'App\Entity\User'
property: 'username'
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
anonymous: true
guard:
authenticators:
- App\Security\LoginFormAuthenticator
form_login:
login_path: app_login
check_path: app_login
logout:
path: app_logout
target: app_user_index
secured_area:
form_login:
csrf_token_generator: security.csrf.token_manager
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 12
role_hierarchy:
ROLE_ADMIN: ROLE_USER
# activate different ways to authenticate
# http_basic: true
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
# form_login: true
# https://symfony.com/doc/current/security/form_login_setup.html
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
# - { path: ^/delete, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }
Я не уверен, что еще мне нужно опубликовать, но я не могу придумать ничего другого, что могло бы измениться, что могло бы привести к поломке.
Если я вернусь к точке до внедрения API, вход в систему снова будет работать нормально.
В чем может быть проблема?





Попробуйте сравнить файл до и после, чтобы увидеть различия.
Вы проверяли журналы? Вы получаете сообщение об ошибке?
Поскольку в статье говорится об изменении ряда различных файлов, трудно сказать. т.е. Ваш опубликованный файл не содержит ничего из того, что описано в статье, например, брандмауэр ^/api.
Может быть, создать скелет строки за строкой в статье в отдельной папке, а затем сравнить с вашим проектом, файл за файлом, добавляя каркас...
Похоже, вы не указываете своему основному брандмауэру, какого провайдера использовать для аутентификации, поэтому ваш API может переопределить его...
т.е. Ваш main: form_login: provider: должен быть пользователями, и ваш API может использовать пакет fos_user
Оба должны иметь возможность использовать одного и того же провайдера, если имена полей одинаковы.
Редактировать: 1) Кассовая симфония брандмауэры и контроль доступа
2) Решите, хотите ли вы тех же пользователей, что и ваш основной сайт, или другого поставщика пользователей для API.
3) Укажите form_login в соответствующем разделе брандмауэра на провайдера пользователя, которого вы хотите использовать.
Выше у вас зарегистрирован один провайдер, "пользователи" в разделе провайдеров. Предполагая, что вы хотите, чтобы отдельные пользователи были на вашем основном сайте: Если бы вы следовали статье, вы бы добавили «fos_userbundle» в качестве другого поставщика в этом разделе и добавили разделы брандмауэра, чтобы разрешить oauth для API. В разделе «form_login» на «auth_authorize» есть провайдер, который указывает на fos_userbundle. Вы также должны были добавить маршрут API, чтобы контролировать, на какой маршрут отвечает ваш API (шаблон: ^/api <== любой маршрут, начинающийся с API)
Я подозреваю, что ваш пользовательский провайдер в основном разделе теперь не знает, какой пользовательский пакет использовать для аутентификации. т. е. пытались ли вы войти в систему как пользователь API на своем основном сайте? Он аутентифицируется? Если это так, вам нужно сообщить своему «основному» разделу брандмауэра, что провайдер пользователя должен быть провайдером «пользователей», добавив provider: users в раздел «form_login» брандмауэра.
Если вы хотите использовать отдельного поставщика пользователей для вашего основного сайта и вашего API:
(непроверенный код)
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
users:
entity:
class: 'App\Entity\User'
property: 'username'
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
oauth_token:
pattern: ^/oauth/v2/token
security: false
oauth_authorize:
pattern: ^/oauth/v2/auth
form_login:
provider: fos_userbundle
check_path: /oauth/v2/auth_login_check
login_path: /oauth/v2/auth_login
use_referer: true
api:
pattern: ^/api
fos_oauth: true
stateless: true
anonymous: false
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
anonymous: true
guard:
authenticators:
- App\Security\LoginFormAuthenticator
form_login:
provider: users
login_path: app_login
check_path: app_login
logout:
path: app_logout
target: app_user_index
secured_area:
form_login:
csrf_token_generator: security.csrf.token_manager
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 12
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
# activate different ways to authenticate
# http_basic: true
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
# form_login: true
# https://symfony.com/doc/current/security/form_login_setup.html
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
# - { path: ^/delete, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }
- { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }
Если вы хотите использовать одного и того же провайдера для основного сайта и API:
(непроверенный код)
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
users:
entity:
class: 'App\Entity\User'
property: 'username'
firewalls:
oauth_token:
pattern: ^/oauth/v2/token
security: false
oauth_authorize:
pattern: ^/oauth/v2/auth
form_login:
provider: users
check_path: /oauth/v2/auth_login_check
login_path: /oauth/v2/auth_login
use_referer: true
api:
pattern: ^/api
fos_oauth: true
stateless: true
anonymous: false
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
anonymous: true
guard:
authenticators:
- App\Security\LoginFormAuthenticator
form_login:
provider: users
login_path: app_login
check_path: app_login
logout:
path: app_logout
target: app_user_index
secured_area:
form_login:
csrf_token_generator: security.csrf.token_manager
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 12
role_hierarchy:
ROLE_ADMIN: ROLE_USER
# activate different ways to authenticate
# http_basic: true
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
# form_login: true
# https://symfony.com/doc/current/security/form_login_setup.html
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
# - { path: ^/delete, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }
- { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }
Прочитав ваш ответ еще раз после некоторого перерыва в коде, я понял, что вы имели в виду, и увидел проблему. Большое спасибо за помощь.
@Маркус, похоже, вы создали незарегистрированную учетную запись и зарегистрированную учетную запись. Вы можете использовать эту страницу для объединения учетных записей stackoverflow.com/contact. Таким образом, вы можете редактировать свои собственные сообщения, не ставя их в очередь.
Спасибо за ответ. Не могли бы вы отредактировать свой ответ и привести пример, как бы вы настроили провайдеров в брандмауэре? Я очень новичок в Symfony 4, и это первый проект, который я пытаюсь создать с нуля.