我在同一个应用程序中有一个Frontoffice和Backoffice的项目。后台用URL中的^ / admin /分隔。
Backoffice需要具有管理员对象,因为登录用户和Frontoffice需要同时将Member对象记录在User中。
是否有办法在应用程序的不同部分同时拥有单独的会话和用户?不能使用子域(如admin.example.com)或不同的域用于后台。 如果是,那么如何实现呢?
答案 0 :(得分:0)
您可能希望为2个区域设置不同的防火墙。以下是app/config/security.yml
看起来如何的示例。请注意:此示例不一个完整的security.yml
文件,它应该只是提示您如何更改当前文件。
security:
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
# firewall for the backoffice (i.e. all paths starting with /admin/ )
backoffice:
pattern: ^/admin/
remember_me:
secret: '%kernel.secret%'
lifetime: 604800 # 1 week in seconds
path: /admin
name: REMEMBERME_BACK
# firewall for the frontoffice (i.e. all paths not catched by previous firewalls)
frontoffice:
remember_me:
secret: '%kernel.secret%'
lifetime: 604800 # 1 week in seconds
path: /
name: REMEMBERME_FRONT
对于更专业的解决方案,您当前的security.yml文件可能会有所帮助。
答案 1 :(得分:0)
根据Tobias Xy的答案和一些额外的研究,我能够找到解决方案。像Tobias Xy所说,主要想法是创建两个不同的防火墙。由于每个单独的防火墙都有自己的会话命名空间。只有缺少的部分是为管理员和成员提供两个不同的提供者。
提供者可以是任何类型(in_memory,实体等),但我使用了提供者服务,它使用一些自定义逻辑从数据库加载用户。为了测试目的,我使用了http_basic身份验证方法,所以我的security.yml看起来像这样:
security:
providers:
crence_cms_admins_provider:
id: crence_cms.user.provider.admin
crence_cms_members_provider:
id: crence_cms.user.provider.member
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
backoffice:
pattern: ^/admin/
provider: crence_cms_admins_provider
http_basic: ~
frontoffice:
anonymous: ~
provider: crence_cms_members_provider
http_basic: ~
encoders:
CrenceCMS\UserBundle\Model\AdminModel:
algorithm: bcrypt
cost: 12
CrenceCMS\UserBundle\Model\MemberModel:
algorithm: bcrypt
cost: 12
access_control:
- { path: ^/admin/, roles: ROLE_ADMIN }
有关创建自定义提供程序的详细信息,请访问:What is the strict aliasing rule?