4

Symfony2 bookで説明されているように、Symfony2 の特定のルートに IP 制限を適用しようとしています。ユーザー認証はありません。サービスが特定の 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

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 に答える