2016-01-25 2 views
0

Я реализую функциональные возможности разрешений в моем webapp. Требования, указанные клиентом, заключаются в том, что пользователи могут выполнять некоторые действия на основе того, какой пользователь они представляют. Тип пользователя определяется на основе комбинации user_type:user_role. Это модель:Django: получить разрешения от user_type

class User(AbstractUser): 

    usertype = models.IntegerField(choices=UserType.CHOICES, default=UserType.BUYER_USER) 
    role = models.IntegerField(choices=UserRole.CHOICES, default=UserRole.NORMAL_USER) 

Например, мы можем иметь:

  • adviser:regular: может manager_orders
  • adviser:admin: может сделать какая adviser:regular делает, а также manage_advisers (это не Джанго admin, но администратор для консультантов!)

(более user_type:user_role)

Это, кажется, конфликтовать с django permission system, который основан на , что разрешение пользователь имеет, вместо , какой пользователь оно.

Т.е. при использовании системы разрешений django мне нужно определить все возможные разрешения и назначить эти разрешения для затронутого пользователя. Вместо этого, с подходом, который я планирую, мне нужно будет получить разрешение от user_type:user_role.

Имеет ли смысл использовать систему разрешения django в этом контексте? Как я могу получить разрешение от user_type:user_role

+2

Ну, если это возможно, почему бы не использовать start, используя концепцию dzhango 'groups'? Вы можете создать одну группу и назначить определенное разрешение этой группе, тогда все пользователи в группе наследуют это разрешение. В этом случае на вопрос «какой пользователь это» можно ответить, проверив группу, к которой он принадлежит. –

+0

@ShangWang: спасибо, но все еще неясно. Я бы все же имел (возможно) противоречивую информацию: с одной стороны, user_type: user_role, с другой стороны, к группе, к которой принадлежит пользователь. Поскольку группа является решающим параметром, user_type: user_role не имеет значения.Это именно то, чего я хочу избежать: я хочу получить разрешения непосредственно из user_type: user_role, а не из других параметров (разрешения или группы) – dangonfast

+0

Что я предлагаю на самом деле не применять к вашей модели, это альтернативный подход который больше подходит для django, чем ваш оригинальный дизайн. Я действительно не знаю, как вы могли применить свой подход к системе разрешений (но определенно что-то настроенное), но вам может быть проще использовать группу для представления 'usertype' и' role'. –

ответ

1

Если вы не хотите придерживаться подхода @ShangWangs в комментариях, я бы рекомендовал взглянуть на Django Object Based Permissions. При этом вы можете предоставлять разрешения для пользователей для объектов, которые производятся из супер модели, к которой вы хотите применить разрешения.

1

Per Документов Django, вы можете сделать это с помощью внутреннего интерфейса пользовательской аутентификации:
https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#handling-authorization-in-custom-backends

В любое время Джанго нужно проверить, если пользователь имеет особое разрешение будет делегировать на Идент бэкэндом, передавая ток пользовательский объект в качестве аргумента. На этом этапе вы можете проверить поля usertype и role и вернуть соответствующее логическое значение.

пример из документации:

class SettingsBackend(object): 
    ... 
    def has_perm(self, user_obj, perm, obj=None): 
     if user_obj.username == settings.ADMIN_LOGIN: 
      return True 
     else: 
      return False 

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

+0

Спасибо, интересно. Но после комментариев от @ShangWang у меня сложилось впечатление, что определение моих «user_types» как групп довольно просто. Мне даже не нужно определять user_type, так как это подразумевается в группе. – dangonfast

Смежные вопросы