4

我正在尝试对 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 执行此操作吗?

4

3 回答 3

5

要将路径限制为仅特定 IP,您可以将以下内容添加到您的security.ymlaccess_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为您的实际路径或子路径。

于 2015-06-05T16:08:17.167 回答
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;
}
于 2012-12-14T14:23:52.557 回答
0

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

于 2014-01-08T10:17:46.650 回答