2015-10-15 23 views
1

我有一個Symfony應用程序,並需要限制對指定的一組ips的路徑列表的訪問。symfony安全限制訪問到指定的ips集合的路由列表

這是一個仍在開發中的站點所需要的,但將會分階段進行。任何人都可以訪問完成的路徑。

只能從指定的一組IP地址訪問其他路徑。 否則應該顯示一個簡單的403。

路徑不共享相同的前綴。 我也不想暫時改變實際路徑。

什麼是最好的方法來做到這一點? 在access_control中添加大量項目並不是一個好主意。

我可以添加防火牆偵聽程序或可以檢查ip和請求路徑的東西嗎?我可以從那裏拋出一個簡單的AccessDenied異常嗎?

回答

0

你想要的是配置在您security.yml下ACCESS_CONTROL

# app/config/security.yml 
security: 
    # ... 
    providers: 
     in_memory: 
      memory: 
       users: 
        ryan: 
         password: ryanpass 
         roles: 'ROLE_USER' 
        admin: 
         password: kitten 
         roles: 'ROLE_ADMIN'  

    access_control: 
     - { path: ^/admin, roles: ROLE_USER, ip: 127.0.0.1 } 
     - { path: ^/admin, roles: ROLE_USER, host: symfony\.com$ } 
     - { path: ^/admin, roles: ROLE_ADMIN, methods: [POST, PUT] } 
     - { path: ^/admin, roles: ROLE_USER } 

,而不是IP,你可以用也ips: [1.2.3.4, 5.6.7.8]

角色從您的供應商獲得,例如在它上面添加右鍵在配置裏面。

所有關於它是在這裏:http://symfony.com/doc/current/cookbook/security/access_control.html

這將是很好的閱讀整個安全部分還: http://symfony.com/doc/current/book/security.html http://symfony.com/doc/current/book/security.html#roles

+0

是ROLE_USER_IP在symfony中保留的角色?或者只是一個例子。它不適合我..... 我似乎有它使用以下規則爲1路徑: - {路徑:^ /示例,角色:[IS_AUTHENTICATED_ANONYMOUSLY,ROLE_USER],ips:%ips_testing%} - {path:^/example,roles:ROLE_ACCESS_DENIED} 第二條規則會在第一條規則不匹配的情況下踢出訪客。 – DoppyNL

+0

@DoppyNL不保留ROLE_USER_IP僅僅是一個例子......你可以在同一個配置中自己創建角色名稱。 ..規則是他們需要從ROLE_開始......我將更新我的anwer – nakashu

+0

當OR規則完全匹配或者用戶沒有指定ROLE時,安全組件將停止檢查規則。當ip不匹配時,它會嘗試下一個規則。這就是爲什麼你需要爲同一條路徑添加另一條規則,但是使用不存在的ROLE來實際拒絕訪問。看到答案中使用的食譜鏈接,它在那裏解釋得非常詳細。 – DoppyNL