Django:在SAAS中使用django.contrib.auth(用户、权限等)

2 投票
1 回答
617 浏览
提问于 2025-04-15 19:28

我正在做一个软件即服务(SAAS)项目,最近在这里问了很多关于内置认证系统的问题。我对这个系统的“为什么”和“怎么做”有些困惑。主要是我不明白它是如何与我的SAAS结合在一起的。

我知道以下几点:

  1. 你可以这样做:http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
  2. 使用内置的认证系统有很多好处,比如安全性,而不是自己重新做一个。

我不知道以下几点:

class MyUserProfile(models.Model):
    """
    Administrator for an Account. Can edit tickets and other stuff.
    """
    user = AutoOneToOneField(User, primary_key=True)
    account = models.ForeignKey(Account)
    dogs_name = models.CharField(max_length=255)

在之前的例子中,account 就是你想的那样;一个为使用我的软件付费的实体。user 是我主要关心的对象。有人访问一个页面,创建一个带有用户名和密码等信息的 UserProfile。那么,当他们这样做时,相关的用户是在哪里创建的呢?我需要根据 request.POST['username'] 等信息在我的视图中手动创建它吗,然后再做

myuserprof = MyUserProfile.create(user=foo_user_just_created, account=foo_account, dogs_name='Spot')

我不知道为什么,但我感觉自己好像漏掉了什么。这个让人注册账户的想法,然后用一个表单创建一个 MyUserProfile,表单里要填写密码、用户名、邮箱等等,然后在我的视图中用表单数据的不同部分创建两个不同的对象(MyUserProfile 和 User)。我觉得我不应该有一个单独的用户表单,对吧?就像我说的,我觉得自己要么跳过了某个步骤,要么走错了方向。我对 Django 不是很陌生,但不知为什么我对那些我没有自己构建的东西感到困惑(我觉得这可能真的是心理问题)。

也许在某个开源项目中有个很好的例子可以参考。

更新:哎呀,忘了提的是,在上面的代码中我尝试使用 django-annoying 的 AutoOneToOneField,但我不知道用户的所有属性是在哪里设置的,或者如何决定将哪个用户对象附加到它上面。这些东西让我抓狂。

另外,我需要使用 sites 应用来处理这些事情吗?最后,“超级用户”是否拥有所有权限(我不想让“Acme”账户的人访问“Microshaft”账户的对象)?还是说他们只是对所有视图都有权限?

1 个回答

3

有人访问一个页面,创建了一个 UserProfile,里面有用户名和密码等信息。

但是 UserProfile 里并没有用户名和密码的字段。所以应该是 有人访问一个页面,创建一个 User。然后,再创建一个与这个新创建的 User 关联的 UserProfile

问题是,你希望这个 UserProfile 实例在什么情况下、如何被创建呢?

  1. 自动创建:每当新建一个 User 时就自动创建,可以使用信号,具体可以参考 文档
  2. 自动创建:每当从用户实例访问个人资料时自动创建,可以使用 AutoOneToOneField,并通过 user.userprofile 来访问个人资料,而不是 user.get_profile()
  3. 手动创建。但要记住,用户可能还没有关联的 UserProfile,所以 user.get_profile() 可能会抛出 DoesNotExist 异常。

那么,当他们这样做时,相关的用户是在哪里创建的呢?

并没有。你需要明确地创建它。

这个想法是让某人注册一个账户,然后用一个表单创建一个 MyUserProfile,表单里要填写密码、用户名、邮箱等信息。我的意思是,我不应该有一个用户表单,对吧?

为什么不呢?你想要一次性创建一个 User 和他的关联个人资料,对吧?你可以直接使用 POST 数据,或者用一个 Form 来访问字段,甚至更好的是,使用两个 ModelForm(一个用于 User,一个用于 UserProfile),在同一个视图中处理它们(也许 这个问题能帮到你?)

也许在某个开源项目中有一个很好的例子。

我建议你查看一下 django-registrationdjango-profiles

注意

你还有另一种方法可以向 User 对象添加信息,那就是扩展模型本身。这将允许你直接在用户模型中放置额外字段,可能会更容易理解和使用。

我这里不深入细节,可以看看 那个教程获取更多信息。

其他问题

我尝试使用 django-annoying 的 AutoOneToOneField,但我不知道所有用户的属性在哪里设置,或者如何决定将哪个用户对象附加到它上面。这让我很困惑。

请参考上面的内容,看看如何使用它。如果你觉得不舒服,最好还是遵循 文档,推荐在用户个人资料中使用带有 unique=TrueForeignKey

另外,我需要使用站点应用来做这些事情吗?

根据 站点框架文档如果你的单个 Django 安装支持多个站点,并且你需要以某种方式区分这些站点,就使用它。

最后,“超级用户”是否拥有所有权限(我不希望“Acme”账户的人访问“Microshaft”的对象)?

再次引用 文档指定该用户拥有所有权限,而无需明确分配。这意味着在 Django 使用的 内置权限系统(例如默认的管理页面)中,超级用户将被授权。

在你自己编写的 视图 中,或者如果你调整了一些 ModelAdmin,你可以决定如何检查权限。

撰写回答