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

时间:2014-06-20 04:29:15

标签: python django python-2.7 django-sessions

我试图建立一个拥有三种用户["client" , "volunteer" , "coordinator"]的小型网站。每种类型的用户都限制了它可以访问的视图。这三个用户都有不同的登录页面。

方法1:为实现这一目标,我已在会话category中添加了一个密钥,在登录期间分配了上述给定的userType之一,并且每当调用一个视图时,检查该用户是否可以访问该视图。

的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)

方法2:我认为我可以创建自定义User类,而不是仅使用Django提供的默认User,并在登录期间将CustomUser分配给request.user。然后在调用视图时,我检查is_Client或is_Volunteer。

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 个答案:

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