【问题标题】:Symfony 2.8 - How to configure a firewall for any URL?Symfony 2.8 - 如何为任何 URL 配置防火墙?
【发布时间】:2016-08-30 13:11:31
【问题描述】:

每当我故意 - 尝试自定义错误页面 - 尝试访问未定义的路由时,服务器都会以 500 错误响应。日志说:

request.CRITICAL:处理异常时抛出异常(Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException:令牌存储不包含身份验证令牌。一个可能的原因是没有为此配置防火墙网址

此异常在 NotFoundException 之后引发,因此出现 500 错误。 因此,我试图弄清楚如何为任何 URL 配置防火墙,尤其是为所有已经被防火墙处理的 URL,以便可以实际找到凭据。我想出了这个 UserBundle/Resources/config/security.yml

security:
encoders:
    FOS\UserBundle\Model\UserInterface: sha512

providers:
    fos_userbundle:
        id: fos_user.user_provider.username

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt))/
        security: false
    public:
        pattern:                    ^/(contact/faq)$
        anonymous:                  true
    secure:
        pattern:                    ^/
        form_login:
            provider:               fos_userbundle
            csrf_token_generator:   security.csrf.token_manager
            login_path:             fos_user_security_login
            check_path:             fos_user_security_check
            use_forward:            false
            failure_path:           null
            default_target_path:    /
            remember_me:            true
        logout:
            path:                   fos_user_security_logout
            target:                 /
        anonymous:                  true
        remember_me:
            secret:                 %secret%
            name:                   whatev
            lifetime:               31536000
            path:                   /
            remember_me_parameter:  _remember_me
            secure:                 true
            always_remember_me:     true
    default:
        anonymous: true

所有内容都导入到我的主安全文件中,其中包括:

imports:
- { resource: "@UserBundle/Resources/config/security.yml" }

security:
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

access_control:
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } # my try to match all routes...
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/administration/, role: ROLE_ADMIN }
    - { path: ^/user$, role: IS_AUTHENTICATED_FULLY }

这是我在 app/Resources/TwigBundle/views/Exception 下的 error.html.twig :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="{{ _charset }}" />
        <title>An Error Occurred: {{ status_text }}</title>
    </head>
    <body>
        <h1>Oops! An Error Occurred</h1>
        <h2>The server returned a "{{ status_code }} {{ status_text }}".</h2>

        <div>
            Something is broken. Please let us know what you were doing when this error occurred.
            We will fix it as soon as possible. Sorry for any inconvenience caused.
        </div>
    </body>
</html>

关于如何进行的任何线索?

非常感谢。

【问题讨论】:

  • 你能给我们看看你的error.twig(或任何你用于404错误的)模板吗?
  • 我知道在视图中使用 is_granted() 时可能会出现问题,但我不是。无论如何,我进行了编辑以向您展示我的观点。
  • 您是否创建了一个使用 AuthorizationChecker::isGranted 的事件侦听器,并在注册防火墙事件之前调度(优先级
  • 哦,很好看!这确实是我的问题。我有一个事件侦听器,它侦听优先级为 0 的 kernel.controller 事件。当我从服务中删除此侦听器时,会捕获 NotFoundException。但是,我尝试将此事件侦听器的优先级设置为大于或小于 8(通过 app/console debug:event-dispatcher 检查),并且在任何一种情况下更新后都会返回 500 错误。我该怎么办?
  • kernel.controller 事件应该没有问题(即使优先级为 0,因为它是在 kernel.request 之后调度的,因此是在防火墙侦听器之后调度的) - 我可以看看那个侦听器?你是如何在容器中注册的?

标签: php symfony security routes firewall


【解决方案1】:

正如 Federico 所指出的,问题来自试图执行的事件侦听器

public function add(Request $request)
{
    if($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
        /* do stuff considering the user is logged in.
        ** This is wrong ; we can end up here while having a logged out user.
        */

当然,三思而后行,似乎很愚蠢。只需确保您确实可以在安全上下文中调用 isGranted() 即可解决整个问题。要检查这一点,您必须验证:

  1. 安全上下文的令牌不为空;
  2. 此令牌的用户是您的用户实体的一个实例(用户实际已登录)。

这会将上述方法更改为:

public function add(Request $request)
{
    if($this->securityContext->getToken() === null)
        return false;

    if(!$this->securityContext->getToken()->getUser() instanceof User)
        return false;

    if($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
        // do stuff considering the user is logged in.

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2016-09-06
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多