我有一个在同一个应用程序中使用前台和后台的项目。后台在URL中用^/admin/分隔。
后台需要将管理员对象设置为登录用户,前台需要同时将成员对象设置为登录用户。
有没有办法同时为应用程序的不同部分设置单独的会话和用户?使用子域(如 admin.example.com(或其他域进行后台办公不是一种选择。如果是,那么如何实现这一目标?
您可能希望为 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文件可能会有所帮助。
根据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:
CrenceCMSUserBundleModelAdminModel:
algorithm: bcrypt
cost: 12
CrenceCMSUserBundleModelMemberModel:
algorithm: bcrypt
cost: 12
access_control:
- { path: ^/admin/, roles: ROLE_ADMIN }
有关创建自定义提供程序的详细信息,请参阅:https://symfony.com/doc/current/security/custom_provider.html