如何在Django中处理多种用户类型

1 投票
1 回答
2407 浏览
提问于 2025-04-18 10:27

我正在尝试制作一个小网站,这个网站有三种用户类型:["client" , "volunteer" , "coordinator"]。每种用户都有不同的权限,能访问不同的页面。而且这三种用户都有各自不同的登录页面。

方法一:为了实现这个功能,我在会话中添加了一个键category,在用户登录时根据他们的类型分配一个值。然后每次调用页面时,我会检查这个用户是否有权限访问该页面。

登录页面代码(login.html):

{% extends "base.html" %}
{% block content %}

{% if form.errors %}
    <p class="error"> Sorry , invalid</p>
{% endif %}

    <form action="/login_volunteer/authenticate/" method="post">{% csrf_token %}
    <label for="username"> Username : </label>
    <input type="text" name="username" value="" id="username">
    <label for="password"> Password : </label>
    <input type="password" name="password" value="" id="password">
    <input type="hidden" name="category" value="volunteer" id="category">
    <input type="submit" value="login" />
    </form>

{% endblock %}

视图代码(view.py):

def hello(request):
    name = "abhishek"
    if request.session.session_key is None:
        html = '<html><body>Session is expired</body></html>'
        return HttpResponse(html)
    try:
        if not request.POST.get('category') == 'volunteer
            html = '<html><body>You are Not allowed here</body></html>'
            return HttpResponse(html)
    except :
        print "error"
    html = '<html><body>Hi this is awesome</body></html>' 
    return HttpResponse(html)

方法二:我想我可以创建一个自定义的用户类,而不是直接使用Django提供的默认User。在用户登录时,我将这个自定义用户分配给request.user。然后在调用页面时,我检查用户是否是客户端或志愿者。

自定义用户类代码(customUser.py):

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

class VolunteerUser(AbstractBaseUser):
    """
    Custom user class.
    """
    email = models.EmailField('email address', unique=True, db_index=True)
    joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_volunteer = models.BooleanField(default=False)

class ClientUser(AbstractBaseUser):
    """
    Custom user class.
    """
    email = models.EmailField('email address', unique=True, db_index=True)
    joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_Client = models.BooleanField(default=False)

所以我的问题是,这两种方法哪种更好呢?有没有其他的解决办法?

我也很关心安全性,感觉第一种方法比第二种更不安全。

1 个回答

3

为了满足你的需求,最好的方法是使用Django自带的 GroupPermissions 模型。不过,由于 Permissions 可能有点复杂,另一种方法是创建一个 UserProfile 模型,像下面这样:

from django.contrib.auth.models import User
class UserProfile(models.Model):
    user = models.ForeignKey(User)
    type = models.CharField(max_length=15)

然后可以使用 @user_passes_test 装饰器来控制对视图的访问,像这样:

from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.get_profile().type == 'client')
def view_for_client(request):         
    ...

UserProfile 模型还可以用来保存用户的所有偏好设置。此外,你还需要设置以下内容:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'

撰写回答