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