Symfony2对所有人的IP限制

时间:2012-12-14 13:49:05

标签: symfony ip

我正在尝试对Symfony2中的特定路由应用IP限制,如Symfony2 book所述。我没有用户身份验证,我只希望我的服务能够回答来自特定IP的请求。

但我没有成功应用限制(我总是在测试期间通过)。

这是我的security.yml

jms_security_extra:
    secure_all_services: false
    expressions: true

security:
    encoders:
            Symfony\Component\Security\Core\User\User: plaintext

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        in_memory:
            memory:
                users:
                   user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                   admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }

    firewalls:
        secured_area:
            pattern: ^/wsoa/tests
            anonymous: ~
            # http_basic:
                # realm: "Secured Demo Area"

    access_control:
        #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
        #- { path: ^/_internal/secure, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }
        # THE RESTRICTION I'D LIKE (FOR EXEMPLE 127.0.0.1)
        - { path: ^/wsoa_products_tests, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

以下是来自routing.yml的路线:

wsoa_products_tests:
    pattern:  /wsoa/tests
    defaults: { _controller: WsoaProductsBundle:Test:display }

任何人都知道如何使其有效? 我是否应该忘记在Symfony2中执行此操作并使用htaccess执行此操作?

3 个答案:

答案 0 :(得分:5)

要将路径限制为仅限特定IP,您可以将以下内容添加到security.yml access_control:

- { path: ^/yourpath, roles: IS_AUTHENTICATED_ANONYMOUSLY, ips: [1.1.1.1, 2.2.2.2, ...]  }
- { path: ^/yourpath, roles: ROLE_NO_ACCESS }

如果您想限制为全范围的IP,请使用IP网络掩码,如下所示:

- { path: ^/yourpath, roles: IS_AUTHENTICATED_ANONYMOUSLY, ips: [1.1.1.0/24]  }
- { path: ^/yourpath, roles: ROLE_NO_ACCESS }

注意:我放在这里的IP地址需要替换为您想要限制的IP地址。同时将^/yourpath替换为您的实际路径或子路径。

答案 1 :(得分:1)

我认为您不能在access_control配置中使用路由。相反,尝试保护子路径IE:

- { path: ^/wsoa, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

然后应该保护的路由使用前缀。

wsoa_products_tests:
    pattern:  /wsoa/tests
    defaults: { _controller: WsoaProductsBundle:Test:display }

编辑:

您可以尝试实施自定义选民..(http://symfony.com/doc/2.0/cookbook/security/voters.html

使用该文档中建议的类,然后您可以使用以下内容覆盖投票方法:

function vote(TokenInterface $token, $object, array $attributes)
{
    $request = $this->container->get('request');

    $route = $request->get('_route');

    // I suggest passing the allowed routes in the service definition instead of
    // hardcoding here, but for example sake:

    if (in_array($route, array('wsoa_product_tests'))) {
        if (in_array($request->getClientIp(), $this->blacklistedIp)) {
            return VoterInterface::ACCESS_DENIED;
        }
    }

    return VoterInterface::ACCESS_ABSTAIN;
}

答案 2 :(得分:0)

您可以使用我的bundle =>轻松阻止IP和IP范围https://github.com/Spomky/SpomkyIpFilterBundle