security - Symfony2-特定于URL的安全HTTP方法

标签 security api rest symfony

因此,我正在尝试在Symfony2中制作一个RESTful API,但是我在安全性方面遇到了问题。

例如,假设我想使用我的API创建一个新用户。我将执行以下请求:
POST /api/v1/users.json HTTP/1.1
所有客户端都应可以访问此URL,因此不需要身份验证。但是,假设我要请求所有用户的列表。根据REST的想法,我应该发出GET请求:
GET /api/v1/users.json HTTP/1.1
当然,我不希望每个人都可以访问此列表,因此我必须在Symfony2中对其进行保护。当然,以下代码将无法正常工作,因为它可以保护整个URL模式,而不是HTTP方法的安全性:

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:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }

    firewalls:
        secured_area:
            pattern:    ^/
            anonymous: ~
            http_basic:
                realm: "Social Portal API"

    access_control:
        - { path: /api/v1/users.json, roles: ROLE_ADMIN }

那么,access_control指令是否有用于保护HTTP方法的 secret 参数?还是有其他方法吗?我尝试使用JMSSecurityExtraBundle:
/**
 * @Secure(roles="ROLE_ADMIN")
 */
public function listAction()
{
    return new Response('Cubilon\\SocialPortal\\APIBundle\\Controller\\UserController', 200);
}

哪个应该保护此方法,但是它不起作用...

如何结合URL模式来保护某个HTTP方法?

编辑:

因此,正如我在下面的答案中所述,我已经使用JMSSecurityExtraBundle对其进行了修复。我已经在Resources/config/services.xml中定义了要保护的服务:
# Resources/config/services.xml
<?xml version="1.0" encoding="utf-8"?>
<services>
    <service id="user_controller" class="Cubilon\SocialPortal\APIBundle\Controller\UserController">
        <tag name="security.secure_service" />
    </service>
</services>

然后,我在UserController中相应地保护了每个 Action :
# Controller/UserController.php
<?php
namespace Cubilon\SocialPortal\APIBundle\Controller\UserController;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use JMS\SecurityExtraBundle\Annotation\Secure;

class UserController extends Controller
{
    public function createAction($_format)
    {
        // ...
    }

    /**
     * @Secure(roles="ROLE_USER, ROLE_ADMIN")
     */
    public function readAction($username, $_format)
    {
        // ...
    }

    /**
     * @Secure(roles="ROLE_USER, ROLE_ADMIN")
     */
    public function updateAction($username, $_format)
    {
        // ...
    }

    /**
     * @Secure(roles="ROLE_USER, ROLE_ADMIN")
     */
    public function deleteAction($username, $_format)
    {
        // ...
    }
}

在每个 protected 操作中,我都会检查 protected 用户的凭据(通过身份验证的用户名是否与请求的用户名相同)。

最佳答案

我知道已经晚了,但是如果有人偶然发现了这个问题,那么这里是如何确保每个HTTP方法的请求的安全性(请参阅Symfony security documentation):

# app/config/security.yml
security:
    # ...
    access_control:
        - { path: ^/api/v1/users.json, roles: ROLE_ADMIN, methods: [POST, PUT] }
        - { path: /api/v1/users.json, roles: ROLE_ADMIN }

注意设置规则的顺序很重要。

关于security - Symfony2-特定于URL的安全HTTP方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004836/

相关文章:

.net - 使用 .NET 安全存储身份验证 token

Javascript Angular 6 通过浏览器开发工具改变安全性

api - Piwik API如何获得7天的每日访问量

c# - 使用 REST API 列出 Dropbox 文件

linux - 将 Linux 配置文件保存在 SVN 中(Subversion)

api - 考虑 Policy.getPolicy() 的原因是什么,因为它将保留对上下文的静态引用并可能导致内存泄漏

api - 使用 Symfony2 和 FOSRESTBundle 通过 API 上传图像文件

java - REST 将 ManyToMany 发送回服务器

rest - 使用 REST 将数据保存到 Firebase

security - 如何检测CSRF漏洞