Symfony:如何将前台和后台分开 Users/Sessions
Symfony: how to separate Users/Sessions for Frontoffice and Backoffice
我在同一个应用程序中有一个包含前台和后台的项目。 URL.
后台用^/admin/分隔
Backoffice 需要有Administrator 对象作为登录的User,Frontoffice 需要同时有Member 对象作为登录的User。
有没有办法让应用程序的不同部分同时拥有单独的会话和用户?使用子域(如 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:
CrenceCMS\UserBundle\Model\AdminModel:
algorithm: bcrypt
cost: 12
CrenceCMS\UserBundle\Model\MemberModel:
algorithm: bcrypt
cost: 12
access_control:
- { path: ^/admin/, roles: ROLE_ADMIN }
可在此处找到有关创建自定义提供程序的更多信息:https://symfony.com/doc/current/security/custom_provider.html
我在同一个应用程序中有一个包含前台和后台的项目。 URL.
后台用^/admin/分隔Backoffice 需要有Administrator 对象作为登录的User,Frontoffice 需要同时有Member 对象作为登录的User。
有没有办法让应用程序的不同部分同时拥有单独的会话和用户?使用子域(如 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:
CrenceCMS\UserBundle\Model\AdminModel:
algorithm: bcrypt
cost: 12
CrenceCMS\UserBundle\Model\MemberModel:
algorithm: bcrypt
cost: 12
access_control:
- { path: ^/admin/, roles: ROLE_ADMIN }
可在此处找到有关创建自定义提供程序的更多信息:https://symfony.com/doc/current/security/custom_provider.html