Symfony FOSUserBundle登录中的区域设置开关
我正在尝试让区域设置切换在我的应用程序的登录屏幕中工作。为了做到这一点,我在登录页面上有指向site.com/(默认区域设置)和site.com/en(我支持的第二个区域设置)的链接。我一登录,这种切换就非常有效。但是,如果我还没有通过身份验证,登录总是返回默认的区域设置。我的理解是,如果我使用来自FOSUserBundle的命名路由,那么它应该能够自动处理区域设置,但我无法让它工作 我的应用程序/config/security.ymlSymfony FOSUserBundle登录中的区域设置开关,symfony,fosuserbundle,Symfony,Fosuserbundle,我正在尝试让区域设置切换在我的应用程序的登录屏幕中工作。为了做到这一点,我在登录页面上有指向site.com/(默认区域设置)和site.com/en(我支持的第二个区域设置)的链接。我一登录,这种切换就非常有效。但是,如果我还没有通过身份验证,登录总是返回默认的区域设置。我的理解是,如果我使用来自FOSUserBundle的命名路由,那么它应该能够自动处理区域设置,但我无法让它工作 我的应用程序/config/security.yml security: encoders:
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: fos_user_security_login
check_path: fos_user_security_check
logout: true
anonymous: true
access_control:
- { path: ^/_wdt, roles: IS_AUTHENTICATED_ANONYMOUSLY } # allow wdt for debugging
- { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow profiler for debugging
- { path: ^/bundles/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow assets to be loaded anonymously
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, role: ROLE_ADMIN }
- { path: ^/, role: ROLE_USER }
firewalls:
[...]
main:
pattern: ^/
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
logout:
path: fos_user_security_logout
target: #where_no_one_has_gone_before
[...]
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/anmelden$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/registrieren, role: IS_AUTHENTICATED_ANONYMOUSLY }
[...]
我的应用程序/config/routing.yml
# FOS User bundle
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
fos_user_profile:
resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
prefix: /profile
#fos_user_register:
# resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
# prefix: /register
fos_user_resetting:
resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
prefix: /resetting
fos_user_change_password:
resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
prefix: /profile
[...]
#register the path to the file with the be_simple_i18n type fos_user routes
fos_user:
resource: "config/routing/fos_user_i18n.yml"
type: be_simple_i18n
my_yaml_i18n_routes:
resource: "config/routing/i18n.yml"
type: be_simple_i18n
非常感谢您的指点,因为我已经坚持了几天了我不知道您是如何处理区域设置检测/切换的,但您可以按照以下方式操作 将所需的捆绑包添加到
composer.json
:
"require": {
...
"jms/i18n-routing-bundle": "1.1.*",
"jms/translation-bundle": "1.1.*",
"friendsofsymfony/user-bundle": "1.3.*"
},
配置捆绑包:
jms_i18n_routing:
default_locale: en
locales: [en, fr, it, sp]
strategy: prefix
$bundles = array(
...
new JMS\I18nRoutingBundle\JMSI18nRoutingBundle(),
new FOS\UserBundle\FOSUserBundle(),
);
引导捆绑包:
jms_i18n_routing:
default_locale: en
locales: [en, fr, it, sp]
strategy: prefix
$bundles = array(
...
new JMS\I18nRoutingBundle\JMSI18nRoutingBundle(),
new FOS\UserBundle\FOSUserBundle(),
);
修改现有管线,以使用所需的区域设置作为其前缀:
access_control:
# Routes are prefixed by ther user locale.
- { path: ^/[^/]+/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/[^/]+/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/[^/]+/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/[^/]+/admin, role: ROLE_ADMIN }
- { path: ^/[^/]+/, role: ROLE_USER }
现在应该可以了 解决方案最终是将区域设置作为FOSUserBundle路由导入的前缀:
# FOS User bundle
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
prefix: /{_locale}
fos_user_profile:
resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
prefix: /{_locale}/profile
fos_user_register:
resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
prefix: /{_locale}/register
fos_user_resetting:
resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
prefix: /{_locale}/resetting
fos_user_change_password:
resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
prefix: /{_locale}/profile
并更改防火墙以允许匿名路由中的区域设置,并配置注销路径:
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: fos_user_security_login
check_path: fos_user_security_check
logout:
path: fos_user_security_logout
anonymous: true
access_control:
- { path: ^/_wdt, roles: IS_AUTHENTICATED_ANONYMOUSLY } # allow wdt for debugging
- { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow profiler for debugging
- { path: ^/bundles/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow assets to be loaded anonymously
- { path: ^/[a-z]+/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/[a-z]+/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/[a-z]+/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, role: ROLE_ADMIN }
- { path: ^/, role: ROLE_USER } # this must be the last match, as url patterns are checked in the order they appear
从长远来看,使用JMSI18nRoutingBundle可能会更好,但在我尝试它时,它并不是一个临时解决方案,而且该项目的预算不允许我开始找出原因,因此这将留待将来更新。我的解决方案:
您必须为be_simple_i18n类型格式重新定义fos_用户路由。
(我选择了yaml版本):
在app/config/routing.yml中
# FOS User bundle
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
fos_user_profile:
resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
prefix: /profile
#fos_user_register:
# resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
# prefix: /register
fos_user_resetting:
resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
prefix: /resetting
fos_user_change_password:
resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
prefix: /profile
[...]
#register the path to the file with the be_simple_i18n type fos_user routes
fos_user:
resource: "config/routing/fos_user_i18n.yml"
type: be_simple_i18n
my_yaml_i18n_routes:
resource: "config/routing/i18n.yml"
type: be_simple_i18n
在app/Resources/config/routing/fos_user_i18n.yml中:
#you have to make entries for all the fos_user routes here!
#you can find them all in vendor/friendsofsymfony/user-bundle/Resources/routing
fos_user_security_login:
locales: { en: "/login", de: "/anmelden" }
defaults: { _controller: FOSUserBundle:Security:login }
fos_user_security_check:
locales: { en: "/login_check", de: "/login_pruefung" }
defaults: { _controller: FOSUserBundle:Security:check }
#...
在app/config/security.yml中
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: fos_user_security_login
check_path: fos_user_security_check
logout: true
anonymous: true
access_control:
- { path: ^/_wdt, roles: IS_AUTHENTICATED_ANONYMOUSLY } # allow wdt for debugging
- { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow profiler for debugging
- { path: ^/bundles/, role: IS_AUTHENTICATED_ANONYMOUSLY } # allow assets to be loaded anonymously
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, role: ROLE_ADMIN }
- { path: ^/, role: ROLE_USER }
firewalls:
[...]
main:
pattern: ^/
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
logout:
path: fos_user_security_logout
target: #where_no_one_has_gone_before
[...]
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/anmelden$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/registrieren, role: IS_AUTHENTICATED_ANONYMOUSLY }
[...]
防火墙:
[...]
主要内容:
模式:^/
表格(u)登入:
提供商:fos_用户包
登录路径:fos\U用户\U安全\U登录
检查路径:fos\U用户\U安全检查
csrf_provider:security.csrf.token_manager#使用form.csrf_provider代替Symfony我一直在为这个问题挣扎。我希望将纯登录(会话中没有URL)重定向到正确的本地化页面。
我可以在Symfony文档中找到答案:
# app/config/security.yml
security:
# ...
firewalls:
main:
form_login:
# ...
default_target_path: index [ or your named route ]
感谢关于JMS包的提示,我将在下周返回此项目时尝试此方法。我使用此设置来配置我的多语言站点。但是我的登录页面可以使用所有语言,登录后我会被重定向到首页,没有任何区域设置。有什么想法吗?您好,谢谢您的回答,您可以发布相关资源的链接吗?仍在使用Symfony 3/FOS UserBundle 2.1.2。我还必须添加行login\u path:fos\u user\u security\u login
和check\u path:fos\u user\u security\u check
,如上面的代码所示。