复杂的防火墙配置 - Symfony2安全性

时间:2014-03-02 12:18:54

标签: php symfony authentication

情况如下:

我目前有两个现有防火墙 - 即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现有订单,只需创建一个新订单。

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

2 个答案:

答案 0 :(得分: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, ... ] }

答案 1 :(得分:0)

不确定我真的遇到了你的问题。 也许知道你可以设置一个连锁提供商从多个“提供商”登录,这可能会有所帮助:

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