【问题标题】:How to handle multiple user type in Django如何在 Django 中处理多个用户类型
【发布时间】:2014-08-10 18:44:30
【问题描述】:

我正在尝试制作一个包含三种用户["client" , "volunteer" , "coordinator"] 的小型网站。每种类型的用户对其可以访问的视图都有限制。所有三个用户都有不同的登录页面。

方法 1: 为了实现这一点,我向会话 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)

方法 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)

所以我的问题是,这些方法中哪一种是完成手头任务的最佳方式?有没有其他方法可以解决这个问题?

我也担心安全问题,感觉第一种方法比第二种更不安全。

【问题讨论】:

标签: python django python-2.7 django-sessions


【解决方案1】:

实现您的要求的更好方法是使用 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'

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多