如何在Django中创建多个用户而不让他们访问彼此的数据

时间:2019-11-27 09:42:46

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

我不太确定我在提问中使用的标题是否正确。如果以前已经回答过这个问题,那么应该有人指出我,因为我已经做了很多尝试来找出它,但是没有用。

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

2 个答案:

答案 0 :(得分: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)
    pass

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

然后过滤查询集

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

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

class Employee(models.Model):
    company = models.ForeignKey(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

enter image description here

答案 1 :(得分:0)

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

在我的用例中,不允许匿名会话。为了确保用户只能访问他们的仪表板,我定义了一个 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