2012-12-14 68 views
4

我想一個IP限制適用於Symfony2的具體路線,作爲Symfony2 book描述。我沒有用戶身份驗證,我只是希望我的服務能夠響應來自特定IP的請求。Symfony2的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執行此操作嗎?

回答

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; 
} 
+0

檢查我的編輯。希望這有效! – Mike

4

要限制只有特定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替換爲您的實際路徑或子路徑。