我有一个具有表单登录功能的应用程序,运行正常。
然后我使用this guide向其中添加了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之前恢复到正常状态,则登录可以再次正常运行。
可能是什么问题?
答案 0 :(得分:4)
尝试比较文件前后的差异,以了解差异。
您是否检查过日志?您遇到错误了吗?
由于本文讨论的是更改许多不同的文件,因此很难说出来。即您发布的文件不包含本文中的任何内容,例如^ / api防火墙
也许可以在单独的文件夹中为文章中的行创建框架行,然后逐个文件地与您的项目进行比较,添加框架内容...
似乎您没有告诉主防火墙要使用哪个提供程序进行身份验证,因此您的api可能会覆盖它...
即您的主要:form_login:提供程序:需要是用户,您的api可以使用fos_user捆绑包
只要字段名称相同,两者都应能够使用相同的提供程序
编辑: 1)结帐交响曲firewalls and access control
2)确定是要与主站点使用相同的用户,还是要使用不同的api用户提供程序
3)将防火墙相关部分中的form_login指向要使用的用户提供程序
上面您已注册了一个提供者,即“提供者”部分中的“用户”。 假设您希望将单独的用户访问主站点: 如果您按照本文中的内容进行操作,则应在该部分中将“ fos_userbundle”作为另一个提供程序,并添加防火墙部分以允许对API进行oauth。在“ aouth_authorize”上“ form_login”下,有一个提供程序指向fos_userbundle。您还应该添加api路由来控制api响应的路由(模式:^ / api <==任何以api开头的路由)
我怀疑您在主要部分下的用户提供者现在不知道要使用哪个用户捆绑包进行身份验证。也就是说,您是否尝试过在主站点上以api用户身份登录?可以验证吗?如果是这样,您需要通过在防火墙的“ form_login”部分添加provider:用户来告知防火墙的“ main”部分,该用户提供程序必须是“ users”提供程序。
如果要为主站点和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 ] }