Got*_*bel 7 security routing authorization internationalization symfony
我设置了我的安全设置来保护根路径下的所有内容/,以便公共页面查看隐私策略/privacy.一切正常.
# security.yml
access_control:
- { path: ^/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: ROLE_USER }
Run Code Online (Sandbox Code Playgroud)
现在我在隐私策略页面添加了一些不同的翻译,以便路由从更改/privacy为/{_locale}/privacy.不幸的是我无法将_locale参数添加到安全路径中,如下所示:
access_control:
...
- { path: ^/{_locale}/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }
Run Code Online (Sandbox Code Playgroud)
那么我该如何修改我security.yml以便我可以添加_locale到路径并将其限制为预定义的语言,例如(en|fr|es|de)?
我设法解决了这个问题
access_control:
...
- { path: ^/(en|fr|es|de)/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }
Run Code Online (Sandbox Code Playgroud)
对其他回答者的建议:我现在必须(en|fr|de)手动将此字符串输入所有路径.当我添加一种语言时,我必须在许多情况下修改这个字符串.如果可以定义一个字符串会好得多
parameters:
languages: "(en|fr|es|de)"
Run Code Online (Sandbox Code Playgroud)
并在路线中使用它
- { path: ^/%languages%/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }
Run Code Online (Sandbox Code Playgroud)
但我不认为这会奏效.
如果您的所有语言环境都是2个字符的(en|fr|es|de|...),您可以使用更通用的正则表达式,如下所示:
- { path: '^/[a-z]{2}/privacy$', role: 'IS_AUTHENTICATED_ANONYMOUSLY' }
Run Code Online (Sandbox Code Playgroud)
这样,您security.access_control每次添加新区域设置时都不必触摸.
对于表单中的语言环境,EN_en您可以使用类似这样的btw:
- { path: '^/[a-zA-Z]{2}_[a-zA-Z]{2}/privacy$', role: 'IS_AUTHENTICATED_ANONYMOUSLY' }
Run Code Online (Sandbox Code Playgroud)
如今(自 Symfony 4.1 或更高版本)您可以在一个地方定义语言环境并在您的应用程序中的任何地方使用它
在config/services.yaml加
parameters:
myAppName.locales: en|fr|es|de
Run Code Online (Sandbox Code Playgroud)
在 config/routes.yaml
cms:
prefix: /{_locale}/
controller: App\Controller\DefaultController::index
requirements:
_locale: '%myAppName.locales%'
Run Code Online (Sandbox Code Playgroud)
在 config/packages/security.yaml
security:
## .... no changes here
access_control:
- { path: ^/(%myAppName.locales%)/cms, roles: ROLE_ADMIN }
Run Code Online (Sandbox Code Playgroud)