Как расширить модель пользователя Django для управления разрешениями

Я работаю над веб-приложением, используя Django 1.3 и Python2.6. Мне нужно расширить модель пользователя Django, чтобы было три типа пользователей и управлять разрешениями для каждого типа.

Для пояснения предположим, что существует три типа пользователей: преподаватели, ассистенты и студенты. TA смогут создать новое «Задание», преподаватели смогут «просмотреть» и подтвердить его, студенты «отправить» решения, которые преподаватели должны будут «просмотреть», а ассистенты, наконец, смогут проверить эти «просмотренные» решения. Теперь существует три типа пользователей: TA, которые могут создавать Задания и оценивать Решения, Faculty, которые могут просматривать Задания и Решения, чтобы подтвердить их, и Students, которые могут отправлять Решения.

Теперь я понимаю, что есть два способа расширить модель пользователя. Я могу создать профиль пользователя и добавить поле с именем «user_type». Другой способ - создать подкласс модели User. Я думаю, что подклассы — лучший подход, потому что есть поля, которые различаются для разных типов пользователей.

У меня будет одна форма входа, но могут быть разные регистрационные формы для разных типов пользователей. Почему вы выбрали любой из подходов?

Я понимаю, что лучший способ управлять разрешениями для разных типов пользователей — использовать группы пользователей. Как создавать группы, проверять, входит ли пользователь в группу? Влияет ли выбор способа расширения модели User на то, как я управляю разрешениями?


person pcx    schedule 01.11.2011    source источник


Ответы (1)


Если вы создадите подкласс, основной класс будет создан автоматически, так что это более удобно. Если вы создаете класс профиля, вам нужно вручную создать экземпляры обоих классов.

В простых случаях вам может потребоваться просто проверить тип пользователя, прежде чем разрешать действия. Вы можете использовать встроенные разрешения Django.

Независимо от того, создаете ли вы подкласс или создаете класс профиля, это не сильно влияет на рабочий процесс группы. Между группами и пользователями всегда будет отношение ManyToMany. Но лучше сделать это между классами User и Group, чем, скажем, между UserProfile и Group.

Если вы планируете более крупный проект, я могу дать краткое описание того, что должна определять структура разрешений:

  • субъект (пользователь или группа, пытающиеся создать, получить доступ или отредактировать что-либо)
  • объект (цель действия)
  • владелец (владелец объекта)
  • роль (отношения между субъектом и объектом или владельцем объекта)
  • разрешение (правило, определяющее, каким ролям разрешено выполнять какие действия)
person culebrón    schedule 01.11.2011