app.user 在 Google App Engine (GAE) 上部署时无法识别

app.user not recognized upon deployment on Google App Engine (GAE)

我有一个用 php7.4 编写的应用程序,框架是 symfony 5,我正在尝试在标准环境 Google App Engine 上部署它。

身份验证由 login_form 处理,user_provider(目前)是 in_memory_user 提供商。 (这不是最终版本,稍后会更改身份验证,但现在我应该能够在 GAE 上使用这样的配置部署应用程序。)

security.yaml 文件:

security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
    users_in_memory: 
        memory: 
            users:
                userOne:
                    password: userOne
                    roles: ROLE_USER
                userTwo:
                    password: userTwo
                    roles: ROLE_USER
                adminOne:
                    password: admin
                    roles: ROLE_ADMIN
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        anonymous: ~
        provider: users_in_memory
        form_login:
            login_path: login
            check_path: login
            default_target_path: accueil
        logout:
            path:   logout
            target: login
            
access_control:
    - { path: ^/admin, roles: [ROLE_ADMIN, ROLE_USER] }
    - { path: ^/logout, roles: [ROLE_ADMIN, ROLE_USER] }
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
encoders:
    Symfony\Component\Security\Core\User\User: plaintext

运行 本地应用程序,一切正常。一旦我在 login_form 中提交了我的用户名和密码,他就设置了 'app.user'。当重定向到'accueil'-页面(这是基础-urlgae-domain/admin)时,它在那里识别是一个登录的用户,并且该用户被授予访问该页面的权限。

在 App Engine 上这不起作用。它确实可以识别您输入的密码是正确还是错误,因此它可以识别 users_in_memory 提供程序,如果出现以下情况,它会立即调用“/admin”页面用户名 + 密码正确,但他立即重定向到登录页面,因为他无法识别已登录的用户,因此您无权访问“/admin”页面。

为了测试,我删除了 access_control,现在用户再次可以访问“/admin”页面,但在该页面内,没有任何东西是针对他的角色进行个性化设置的,因此,他再次在 'app.user'.

中找不到用户

我的 app.yaml 看起来像这样(### 在部署时被替换为正确的信息)

runtime: php74

env_variables:
  APP_ENV: prod
  APP_SECRET: ###
  DATABASE_URL: ###

handlers:

- url: /resources
  static_dir: public/resources

- url: /node_modules
  static_dir: public/node_modules
  
- url: .*
  script: auto


basic_scaling:
  max_instances: 5

更新:

我看到在访问我的登录页面时,会创建一个会话 cookie(就像我在本地 运行 它时一样)。在提交登录表单并检查用户在 users_in_memory 提供商中被识别后,他删除了这个 cookie/session_id 并且没有创建新的。对我来说,这就是为什么在此之后他无法获取有关已登录用户的信息的根本原因。

在本地运行ning时,登录前会生成一个cookie,登录后会删除之前的cookie/session_id并创建一个新的cookie。那里一切正常。

因此,如果有人知道为什么登录后没有创建新会话 cookie/session_id,那将会有所帮助。我虽然可能这是新的 GDPR 规定,你必须在某处添加一些东西让用户接受 cookie。或者它只是我没有的一些配置 add/change?

如果您的 App Engine 服务纵向扩展,App Engine 标准环境不支持会话亲和性,您的内存用户将不会在实例之间共享。尝试将 scaling strategy 移动到手动缩放并设置 1 instance

如@SimonartM 所述,为了将来参考,有必要按照 community tutorial 提到的步骤处理会话。

To make sessions persist across multiple App Engine instances, you'll need to use a database. Symfony provides a way to handle this using PDO session storage.