【问题标题】:How to create multiple users in Django without letting them access each other's data如何在 Django 中创建多个用户而不让他们访问彼此的数据
【发布时间】:2019-11-27 09:42:46
【问题描述】:

我不太确定我用于问题的标题是否正确。如果之前已经回答过这个问题,请有人指点我,因为我已经尝试了很多方法来找出答案,但它是徒劳的。

我目前正在开发一个可供不同公司使用的基本 HR 系统。以更清晰的方式,我如何创建一个在线系统,使多个公司可以在线管理他们的员工,而无需访问彼此的数据?甚至不知道他们使用相同的系统?这种系统的一个完美例子就是“Zoho People”。

【问题讨论】:

  • 您可以创建 2 个模型。一个用于公司,第二个用于通过 ForiegnKey 与公司模型相关联的员工。
  • 您是否需要用户也登录您的系统?
  • 是的@ThunderHorn,我也需要员工登录系统。
  • @phagyrhe 然后看看我的回答,你可以给用户分配角色,这样你就知道哪个是 HR 或 Employee,并将他们都与 FK 公司联系起来,你必须扩展 django用户模型并添加字段

标签: django python-3.x django-models django-views


【解决方案1】:

你应该创建类似的模型

如果你想让他们都登录你的系统

from django.db import models
from django.contrib.auth.models import AbstractUser

ROLES =(
    ('hr', 'HR'),
    ('employee', 'Employee'),
    ('master', 'Master')
)

class Company(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False)
    [...] # your other fields    

class User(AbstractUser):
    company = models.ForeignKey(on_delete=models.PROTECT, null=False, blank=False)
    role = models.CharField(max_length=10, choices=ROLES, blank=False, null=False)
    [...] #your other fields

您可以为每个用户分配角色和公司。

然后过滤查询集

User.objects.filter(company=request.user.company)

另一种方法如果您只想列出/编辑公司的员工,您可以创建一个员工类如果您不需要它,请从用户中删除角色和将公司添加到员工类

class Employee(models.Model):
    company = models.ForeignKey(Company, on_delete=models.PROTECT, null=False, blank=False)
    first_name  = models.CharField(max_length=30, blank=False, null=False)
    last_name = models.CharField(max_length=30, blank=False, null=False)
    [...] #aditional fields

【讨论】:

  • 感谢您的宝贵时间。如果我做对了,我需要做的第一件事就是创建一个公司帐户,两个用户帐户,即 HR 和员工,并使用外键将它们连接到公司帐户,这是正确的吗?如果是,我会为所有决定使用该平台的公司这样做吗?没有一种方法可以自动执行此操作,即在创建公司帐户时,会自动创建 HR 登录详细信息。然后拥有这些详细信息的人可以决定使用他们的登录详细信息创建他们的员工。
  • @phagyrhe 如果您添加一个主角色,这将是可能的。好吧,是的,当您注册公司时,您将获得一个主帐户,然后您可以根据需要注册任意数量的 HR 和员工
  • 非常感谢您的详细解释。我将暂时保持打开状态,以便我可以处理您解释的过程,然后恢复。如果需要我提出任何进一步的问题,我会这样做,否则,我将关闭它。
【解决方案2】:

实现目标的更有机方法是使用会话并为视图定义装饰器。例如,我想确保一个用户不应该能够访问另一个用户的数据。所以我定义了一个装饰器来做这个检查。

在我的用例中,不允许匿名会话。为了确保用户只能访问他们的仪表板,我定义了一个 UserSession 模型并在用户登录时填充 UserSession。

我定义了一个装饰器来检查会话是否存在于 Usersession 中。如果存在,则进行检查以确保 UserSession 中的用户和请求中的用户相同。如果它们匹配,则调用视图。如果不是,则发送错误响应。我正在使用 JsonResponse。您可以根据您的用例发送适当的响应。

对于每个视图,我都使用这个装饰器。根据您的用例创建尽可能多的装饰器并用它们装饰您的视图。

  1. 对于我的用例,我在 models.py 中定义了一个 UserSession,如下所示:

     from django.contrib.sessions.models import Session
     from django.contrib.auth import get_user_model
     class UserSession(models.Model):
         user = models.ForeignKey(get_user_model(), on_delete = models.CASCADE)
         session = models.ForeignKey(Session, on_delete = models.CASCADE)
    
  2. 我在我的应用目录中创建了一个 decorators.py 并定义了 is_user_logged_in 方法

     from functools import wraps
     from your_app.models import UserSession
     from django.contrib.sessions.models import Session
     from django.http import JsonResponse
    
     def is_user_logged_in(function):
         @wraps(function)
         def wrapper(request, *args, **kwargs):
             response_data={}
             try:
                 userSession=UserSession.objects.get(
                     session__session_key=request.session.session_key
                 )
             except UserSession.DoesNotExist:
                 response_data['status'] = 'token_invalid'
                 return JsonResponse(response_data)
             if userSession.user == request.user:
                 return function(request, *args, **kwargs)
             else:
                 response_data['status'] = 'token_user_invalid'
                 return JsonResponse(response_data)
         return wrapper
    
  3. 我用 is_user_logged_in 装饰器装饰了我的视图,如下所示:

     my_decorators = [is_user_logged_in, any_other_decorator]
     @method_decorator(my_decorators, name='dispatch')
     class ProfileView(View):
         def get(self, request):
             #Do your thing
         def post(self, request):
             #Do your thing
    

参考资料:

Sessions

Decorators

Decorating Class Based Views

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2014-12-18
    • 2021-04-14
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多