情况如下:
我目前有两个现有防火墙 - 即main
和admin
。不知何故,我需要为我的购物区添加第三个防火墙。
我的商店基本上有以下步骤:
Select subscription -> user creation/login -> Capture billing information -> Review purchase -> Capture payment
新的要求是,如果用户尚未登录,我需要捕获用户信息和帐单地址但不将其存储在用户存储库中 - 客户端的论点是这将停止从锁定电子邮件地址到可能未经过整个购买流程的帐户,从而防止用户在将来决定继续使用该电子邮件地址。
以下是我想到的身份验证流程:
shop
。shop/account/create
。此步骤将在系统中创建一个标记为initiated
的新订单。 此订单将包含提供的用户信息以及会话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现有订单,只需创建一个新订单。
如何配置我的防火墙来执行此操作?
答案 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