Канун Python - функция ограниченного доступа к ресурсам с ID_FIELD элемента в качестве AUTH_FIELD

python eve

514 просмотра

1 ответ

1912 Репутация автора

У меня есть коллекция пользователей, которую я оставил открытой без аутентификации для POST, чтобы пользователь мог создавать учетные записи, теперь я хочу ограничить доступ, скажем, для сбора тестов, пользователь может создать только один тестовый документ, я добавил поле auth_field в user_id и я хочу добавить документы с user_id в качестве field_id, и в то же время использовать его как auth_field, для ограничения чтения / записи.

Это моя тестовая модель, я добавил PUT, потому что у пользователя есть свой собственный идентификатор, и он должен использоваться как id_field test_item.

Когда я пытаюсь запустить Eve с этим, у меня есть исключение, есть ли способ сделать это правильно, чтобы каждый запрос пользователя, который был правильно аутентифицирован и для поля auth_field которого было задано значение user_id, работал бы прозрачно?

Спасибо за вашу помощь.

tests = {
    'resource_methods': ['GET'],
    'upsert_on_put': True,
    'id_field': 'test_id'
    'item_title': 'test',
    'auth_field': 'test_id',
    'item_methods': ['GET', 'PATCH', 'PUT'],
    'schema': {
        'test_field': {
            'type': 'string',
            'required': True
        }
    }
}

Исключение:

eve.exceptions.ConfigException: "tests": auth_field cannot be set to id_field (test_id)

TL; DR

Отношение один к одному от пользователей и сбор тестов, каждый пользователь имеет один тест, работает прозрачно через поле auth_field после аутентификации.

Автор: e-nouri Источник Размещён: 17.02.2016 01:15

Ответы (1)


1 плюс

1144 Репутация автора

Решение

Вы можете сделать это соотношение 1: 1, используя обработчик событий перед вставкой , если вы используете ограниченный пользователем доступ к ресурсам, как вы упомянули. Потому что тогда у вас будет поле auth_field для документов. В моем примере поле auth есть user_id.

Ваш on_insert_testsкрючок будет таким

from flask import current_app, abort

def check_inserted(documents):
    # get ID for current user
    user_id = current_app.auth.get_request_auth_value()
    # find tests for the current user
    collection = current_app.data.driver.db['tests']
    tests = collection.find({'user_id': user_id})

    if tests.count() > 0:
        abort(409, 'Test already present for this account. Only one allowed.')

Поэтому при вставке второго теста для текущего пользователя он будет прерван.

Кстати, я не понимаю, почему вы меняете поле идентификатора в тестах test_idвместо использования по умолчанию _id.

Автор: gcw Размещён: 26.02.2016 02:26
Вопросы из категории :
32x32