Платформа Eve: ограниченный доступ пользователей к ресурсам

Я использую платформу Eve и пытаюсь использовать доступ к ресурсам, ограниченный пользователем, как описано в: http://python-eve.org/authentication.html#user-restricted-resource-access

Я делаю что-то вроде:

class CustomAuth(TokenAuth):
    def check_auth(self, token, allowed_roles, resource, method):
        # Get user as an instance of UserResource.
        if user and hasattr(user, 'id'):
            self.set_request_auth_value(user['id'])
        request.authenticated_user = user
        ...

Итак, есть несколько вопросов с моей стороны:

  • Достаточно ли этого для использования ограниченного пользователем доступа к ресурсам?
  • Как это поле добавляет в созданные пользователем объекты?
  • Это дополнительное поле называется id в моих объектах, созданных пользователем? Можно ли его переименовать?
  • Насколько я понимаю, он должен называться так же, как он называется в пользовательском ресурсе. Это правда?
  • Применяется ли это поле (свойство) только для вновь созданных объектов? Можно ли таким образом получить ранее созданные объекты текущим пользователем?

Ну, я хочу знать ответы на свои вопросы + уточнить, как это можно использовать.

Это ожидаемый способ как-то извлечь его в мои крючки?

user_id = current_app.auth.get_request_auth_value()
current_app.data.driver.session.query(resource).find({'id': user_id})

Ожидается ли этот блок кода от хука? Как он ведет себя, если у моего запрошенного ресурса есть собственное поле id?

P.S. Я читал сообщение: https://stackoverflow.com/a/35654252/7335432


person smart    schedule 09.05.2017    source источник
comment
Ребята, есть мысли?   -  person smart    schedule 15.05.2017


Ответы (1)


Функция ограниченного доступа пользователей не позволяет пользователям получать доступ к записям, которые они не создавали. Метод set_request_auth_value() делает:

1) При выполнении запроса POST для создания записи он автоматически добавляет поле, указанное как AUTH_FIELD (или auth_field, если вы хотите сделать это только для определенного ресурса). Так, например, если вы объявите в settings.py

AUTH_FIELD = "my_auth_field"

а затем добавить

set_request_auth_value(user['id'])

к вашему методу аутентификации, это означает, что ваше приложение создает поле "my_auth_field", значение которого равно любому пользователю ["id"]. Поэтому, если вы зайдете в Mongo Compass или какую-либо другую СУБД и вручную проверите свои записи, вы увидите там поле «my_auth_field».

2) В запросах GET, когда вы обращаетесь к этим записям, Eve проверяет значение «my_auth_field» на соответствие любому пользователю [«id»] и отображает только те записи, где «my_auth_field» равно пользователю [«id»]. Поскольку это поле добавляется автоматически при создании записи с помощью Eve, оно эффективно отфильтровывает все, что не создал конкретный пользователь.

Так что да, это относится только к вновь созданным объектам. Я не совсем уверен, что вы подразумеваете под «достаточно ли», но не похоже, что «пользователь» объявлен где-либо в вашем классе аутентификации. Вы можете ознакомиться с этим руководством, в котором они включают ограниченный доступ пользователя к аутентификации по токену.

person user2757964    schedule 25.06.2017