【问题标题】:Complex firewall configuration - Symfony2 security复杂的防火墙配置 - Symfony2 安全
【发布时间】:2014-03-02 12:18:54
【问题描述】:

情况如下:

我目前有两个现有的防火墙—​​—即mainadmin。不知何故,我需要为我的购物部分添加第三个防火墙。

我的店铺基本有这些步骤:

Select subscription -> user creation/login -> Capture billing information -> Review purchase -> Capture payment

新要求是,如果用户尚未登录,我需要捕获用户信息和帐单地址但不将其存储在用户存储库中——客户的论点是这将停止从将电子邮件地址锁定到可能没有完成整个购买流程的帐户,从而防止用户在将来决定继续使用该电子邮件地址。

这是我想到的身份验证流程:

  • 我创建了一个名为 shop 的新防火墙。
  • 当用户未登录时,我将他重定向到shop/account/create。此步骤将在系统中创建一个新订单,标记为initiated此订单将包含所提供的用户信息以及会话 ID。 不会创建实际的用户帐户。
  • 自定义身份验证提供程序将检查会话 ID 并查找与其绑定的现有 initiated 订单,并根据订单中的用户信息构造一个经过身份验证的令牌和一个模拟用户实体。
  • 捕获付款后,系统将在数据存储中创建一个新用户,并购买相应的订阅。

我已经对自定义身份验证提供程序进行了原型设计,这是我的security.yml

firewalls:
    main:
        pattern: ^/
          form_login:
              check_path: /user/login_check
              provider: fos_userbundle
              csrf_provider: form.csrf_provider
              default_target_path: /user/home
          logout:
              invalidate_session: false
              path: /user/logout
              target: /
     admin:
          pattern: ^/admin
          form_login:
              login_path: /admin/login
              check_path: /admin/login_check
              provider: app_adminbundle
              csrf_provider: form.csrf_provider
              default_target_path: /admin
          logout:
              invalidate_session: false
              path: /admin/logout
              target: /admin/login
     shop:
         pattern: ^/shop
         shop_auth: true

shop_auth 是我的自定义身份验证提供程序。 (我已经把实现放在这里了:https://gist.github.com/bezhermoso/9305705

我的问题是我不知道如何配置我的防火墙,因此如果用户已经登录main 防火墙,我的商店应该简单地允许他进入,而无需根据现有订单检查他的会话 ID并创建一个新的。

如何配置我的防火墙来执行此操作?

【问题讨论】:

    标签: php symfony authentication


    【解决方案1】:

    所以我看错了...

    在朋友的帮助下,我得以实施解决方案。他指出我不需要创建单独的防火墙。相反,只需将我的自定义身份验证提供程序(负责将当前会话与挂单匹配)添加到 "main" 配置并通过自定义属性和自定义投票器控制授权:

    security.yml:

    firewalls:
        main:
            pattern: ^/
              form_login:
                  check_path: /user/login_check
                  provider: fos_userbundle
                  csrf_provider: form.csrf_provider
                  default_target_path: /user/home
              logout:
                  invalidate_session: false
                  path: /user/logout
                  target: /
              shop_auth: true #Ta-da!
    
    access_controls:
        - { path: /shop, [CAN_SHOP, ... ] }
    

    【讨论】:

      【解决方案2】:

      不确定我是否真的明白你的问题。 也许知道您可以设置一个链提供商以从多个“提供商”登录会有所帮助:

      providers:
        chain_provider:
           chain:
             providers: [shop_auth, main_provider]
        shop_auth:
           id: service.shop_auth
        main_provider: 
           id: fos_userbundle
      
      firewalls:
        # ...
        shop:
          form_login:
             provider: chain_provider
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 2020-11-25
        • 1970-01-01
        相关资源
        最近更新 更多