Как расширить модель Django User для управления разрешениями - PullRequest
2 голосов
/ 01 ноября 2011

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

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

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

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

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

1 Ответ

1 голос
/ 01 ноября 2011

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

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

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

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

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