Веб-сервер: Правильно ли проверять права пользователей в методах получения / установки (или свойствах)? - PullRequest
0 голосов
/ 10 августа 2011

Я занимаюсь разработкой простого веб-сервера, который обрабатывает связь с браузером через XML.

Чтобы убедиться, что тип переменных правильный, я обертываю (большинство) атрибутов в моих классах через методы получения / установки.Что-то вроде:

class Animal(object):
    def __init__(self):
        super(Animal, self).__init__()
        self.age = None

    def setAge(self, age):
        try:
            self._age = int(age)
        except TypeError:
            self._age = None

    def getAge(self):
        return self._age

    age = property(getAge, setAge)

На сервере также есть система аутентификации и разрешений (типичный логин / пароль ...).

Допустим, зарегистрированный пользователь не имеет разрешения наустановить возраст животных на сервере, но он пытается (немного хакер, у нас здесь, потому что javascript должен был отключить ввод текста возраста, но это другая проблема) ... Назад кpoint!:

Прямо сейчас, когда я получаю POST, я открываю содержащийся в нем XML и проверяю, пытается ли кто-то установить что-то, на что у него нет разрешения.Что-то вроде:

def receivePOST(request):
    xmlTree = Utilities.getXMLTree(request.body)
    loggedUser = Utilities.getLoggedUser()

    if xmlTree.findtext("age") and not loggedUser.hasPermission("setAge"):
        raise Exception("User %s was trying to change the age!!" % loggedUser.userName)

(конечно, на «реальном» сервере гораздо больше, если ... elif ... потому что есть гораздо больше разрешений для проверки)

IМне было интересно, стоит ли ставить такую ​​проверку разрешений в методах получения / установки (ну ... в основном в установщике).Это должно быть что-то вроде этого:

class Animal(object):
    def __init__(self):
        super(Animal, self).__init__()
        self.age = None

    def setAge(self, age):
        if age is not None:
            loggedUser = Utilities.getLoggedUser()
            if loggedUser.hasPermission("setAge"):
                try:
                    self._age = int(age)
                except TypeError:
                    self._age = None
            else:
                raise Exception("User %s was trying to change the age!!" % loggedUser.userName)
        else:
            self._age = None

С одной стороны, это довольно естественное место, чтобы проверить разрешение, когда вы действительно собираетесь что-то делать.Это также «защитит» все классы на моем сервере гораздо более эффективным способом (что если каким-то образом установить «возраст» без прохождения метода «receivePOST»? ... Не будет проверки прав доступа).тот случай).С другой стороны, это означает, что я могу использовать только свой класс Animal в среде сервера (где у меня есть «loggedUser»).

Кроме того, я прочитал, что свойства должны (в идеале) быть простымии это не очень хорошая практика - начинать загружать получатели / установщики с кодом, который может вызвать много побочных эффектов (некоторые люди говорят, что трудно отследить ошибки, когда код только читает: myDuck.age = 512)

Я не знаю ... Что вы думаете?

Спасибо!

Связанный:

Когда и как использовать свойство встроенной функции() в python

Python @property против производительности метода - какой использовать?

...