如何在Django中处理多种用户类型
我正在尝试制作一个小网站,这个网站有三种用户类型:["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自带的 Group
和 Permissions
模型。不过,由于 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'