Python eve — функция доступа к ресурсам с ограниченным доступом пользователей с ID_FIELD элемента как AUTH_FIELD

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

Это моя тестовая модель, я добавил PUT, потому что у пользователя есть собственный идентификатор, и его следует использовать в качестве поля id_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 после аутентификации.


person e-nouri    schedule 17.02.2016    source источник


Ответы (1)


Вы можете сделать это отношение 1:1, используя перед вставкой обработчика событий, если вы используете ограниченный пользователем доступ к ресурсам, как вы упомянули. Потому что тогда у вас будет поле auth_field в документах. В моем примере поле авторизации 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.')

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

Кстати, я не понимаю, почему вы меняете поле ID в тестах на test_id вместо того, чтобы использовать значение по умолчанию _id.

person gcw    schedule 26.02.2016