Django:使用django.contrib.auth进行SAAS(用户,权限等)

时间:2010-02-19 03:42:52

标签: python django

我正在制作一个SAAS,我一直在询问有关内置Auth系统的一系列问题。我无法理解“为什么”和“如何”。主要是我不明白它如何适应我的SAAS。

我(做)知道以下内容:

  1. 您可以执行此操作:http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
  2. 使用内置身份验证系统(如安全性)而不是滚动自己的
  3. 有很多原因

    我(不)知道以下内容:

    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,其表单要求输入密码,用户名,电子邮件等,然后在我的视图中创建2个不同的对象(MyUserProfile和User),其中包含不同的部分表格数据。我的意思是我不应该有用户表格吗?就像我说的那样,我觉得我要么跳过一步,要么就是错误的范式。我不是Django的新手,但由于某种原因,我对我没有构建的东西有困难(我认为这可能是一个真正的心理问题)。

    也许有一个很好的例子就是在某个开源项目上做了这样的事情。

    更新:哎呀,忘了提到在上面的代码中我试图使用来自django-annoying的AutoOneToOneField,但我不知道所有用户的属性设置在哪里或如何决定要附加到哪个User对象。这件事让我发疯。

    另外,我是否需要使用sites应用程序来执行此操作,最后“超级用户”拥有对所有内容的所有权限(我不希望帐户“Acme”中的人员访问帐户“微轴”物体)?或者他们只拥有所有观点的所有权限?

1 个答案:

答案 0 :(得分:3)

  

有人进入某个页面并使用用户名和密码等创建UserProfile

UserProfile没有用户名或密码字段。所以它应该是某人进入页面并创建User 。然后,它会创建与新创建的UserProfile相关联的User

问题是,您希望如何以及何时创建此UserProfile实例?

  1. 自动创建新的User时:使用信号,如in the docs所述
  2. 每当从用户实例访问个人资料时自动:使用AutoOneToOneField,并使用user.userprofile代替user.get_profile()
  3. 访问个人资料
  4. 手动。但请不要忘记用户可能尚未关联UserProfile,因此user.get_profile()可能会引发DoesNotExist例外。
  5.   

    当他们这样做时,相关用户在哪里创建?

    没有。你必须明确地创建它。

      

    这个想法让某人注册一个帐户,然后创建一个MyUserProfile,其表单要求输入密码,用户名,电子邮件等,然后在我的视图中创建2个不同的对象(MyUserProfile和User)与表单数据的不同部分。我的意思是我不应该有用户表格吗?

    为什么不呢?你想在这里一次创建一个User及其相关的个人资料,对吧?您最终可以直接使用POST数据,或使用Form来访问字段,甚至更好地使用2 ModelForm(一个用于User,一个用于{ {1}})您将在同一视图中处理(也许this question可以提供帮助吗?)

      

    也许有一个很好的例子就是在某个开源项目上做了这样的事情。

    我建议您查看django-registrationdjango-profiles

    注意

    您可以通过扩展模型来向UserProfile对象添加信息。它允许您将额外的字段直接放在用户模型中,并且可能更容易理解和使用。

    我不会在此处深入了解详细信息,请查看that tutorial了解更多信息。

    其他问题

      

    我尝试使用django-annoying中的AutoOneToOneField,但我不知道所有用户属性的设置位置或如何决定要附加到哪个User对象。这件事让我发疯了

    见上文关于如何使用它。如果您对此感到不舒服,最好遵循the documentation,建议在用户个人资料中使用User ForeignKey

      

    另外,我是否需要使用网站应用来执行此操作

    来自site framework docs如果您的单个Django安装支持多个站点,则需要使用它,您需要以某种方式区分这些站点。

      

    最后“超级用户”拥有对所有内容的所有权限(我不希望帐户“Acme”中的人访问帐户“Microshaft”对象)?

    同样,来自docs指定此用户拥有所有权限而未明确指定。这意味着无论Django使用built-in permission system(例如默认管理页面),都会授权超级用户。

    观看中,您自己写作,或者如果您调整了一些unique=True,则由您来决定如何检查权限。