Django 权限认证(根据不同的用户,设置不同的显示和访问权限)

yizhihongxing

为了实现 Django 权限认证,我们需要做以下几个步骤:

  1. 开启认证系统

在 Django 项目中,我们需要启用认证系统,以便实现权限认证。在 settings.py 文件中,需添加以下代码:

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]

此外,我们还需在项目路由中引入 auth 的 URLconf,并保证登录和注销链接都能正确调用。

  1. 定义用户类型

我们需要根据用户类型来设置用户的访问和显示权限。在 Django 认证系统中,用户类型通常是指用户的权限级别,其中超级管理员具有最高权限级别。

models.py 中,我们可以定义 UserType 模型,以保存不同用户类型:

class UserType(models.Model):
    name = models.CharField(max_length=32, verbose_name='用户类型名称')
    is_admin = models.BooleanField(default=False, verbose_name='是否为管理员')

    class Meta:
        verbose_name = '用户类型'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

以上代码定义的 UserType 模型包含两个字段:name 和 is_admin。is_admin 字段表示当前用户是否为管理员。我们可以将 is_admin 设为布尔类型,以便后续验证用户是否为管理员。

  1. 自定义认证后端

根据 Django 原生认证系统的思路,我们需要自定义认证后端,以便在用户登录时验证用户是否为管理员,并根据用户类型设置用户的访问和显示权限。

backend.py 中,我们需要实现一下方法:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q

User = get_user_model()

class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(Q(username=username) | Q(email=username))
            if user.is_active and user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

    def has_perm(self, user_obj, perm, obj=None):
        if user_obj.is_superuser:
            return True

        if user_obj.user_type.is_admin == True:
            return True

        return False

    def has_module_perms(self, user_obj, app_label):
        if user_obj.is_superuser:
            return True

        if user_obj.user_type.is_admin == True:
            return True

        return False

以上代码的功能如下:

  • authenticate 方法用于验证用户是否存在,用户名和密码是否正确。
  • get_user 方法用于获取用户对象。
  • has_perm 方法用于验证用户是否具有访问权限,其中 user_obj 为用户对象,perm 表示权限名称,obj 表示权限作用的模型对象。
  • has_module_perms 方法用于验证用户是否具有访问指定模块的权限,其中 app_label 表示应用程序名称。

  • 编写视图函数

根据用户类型,我们需要控制不同用户的访问和显示权限。因此,我们需要编写视图函数来处理这些问题。

views.py 中,我们需要定义不同用户类别的视图函数:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def index(request):
    user = request.user
    if user.is_superuser:
        return render(request, 'admin.html')
    elif user.user_type.is_admin == True:
        return render(request, 'admin.html')
    else:
        return render(request, 'user.html')

以上代码中的 index 视图函数分为三部分:

  • login_required 用于保护当前视图,如果用户未登录,则会自动跳转到登录页面。
  • 然后获取当前用户对象,并使用 if 语句对该用户特征进行认证。
  • 最后根据用户特征挑选不同的模板进行渲染。

  • 定义 URLconf

最后,我们需要定义 URLconf,以在项目中设置 URL 映射路由。

urls.py 中,我们可以按照以下方式设置路径映射:

from django.conf.urls import url
from django.contrib import admin
from django.contrib.auth.views import LoginView, LogoutView
from .views import *

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', index, name='index'),
    url(r'^login/$', LoginView.as_view(template_name='login.html'), name='login'),
    url(r'^logout/$', LogoutView.as_view(next_page='/'), name='logout'),
]

以上代码中,^$ 引用 index 视图函数,即为我们刚刚编写的 index 函数。login 和 logout 则引用 Django 原生的 LoginView 和 LogoutView 视图函数。

示例一:

例如我们现在想要控制首页的访问权限,只有管理员和超级管理员才能访问,我们可以根据以下方法实现:

  1. models.py 中定义用户类型模型,具体代码如下:
class UserType(models.Model):
    name = models.CharField(max_length=32, verbose_name='用户类型名称')
    is_admin = models.BooleanField(default=False, verbose_name='是否为管理员')

    class Meta:
        verbose_name = '用户类型'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name
  1. backend.py 中自定义认证后端,并重载 has_perm 方法。具体代码如下:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q

User = get_user_model()

class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(Q(username=username) | Q(email=username))
            if user.is_active and user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

    def has_perm(self, user_obj, perm, obj=None):
        if user_obj.is_superuser:
            return True

        if user_obj.user_type.is_admin == True:
            return True

        return False

    def has_module_perms(self, user_obj, app_label):
        if user_obj.is_superuser:
            return True

        if user_obj.user_type.is_admin == True:
            return True

        return False
  1. views.py 中,我们需要定义不同用户类别的视图函数,代码如下:
from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def index(request):
    user = request.user
    if user.is_superuser:
        return render(request, 'admin.html')
    elif user.user_type.is_admin == True:
        return render(request, 'admin.html')
    else:
        return render(request, 'user.html')
  1. urls.py 中,我们需要定义首页路由和登录、注销路由,具体代码如下:
from django.conf.urls import url
from django.contrib import admin
from django.contrib.auth.views import LoginView, LogoutView
from .views import *

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', index, name='index'),
    url(r'^login/$', LoginView.as_view(template_name='login.html'), name='login'),
    url(r'^logout/$', LogoutView.as_view(next_page='/'), name='logout'),
]

以上操作完成后,只有管理员和超级管理员才可以访问首页。如果不是管理员或超级管理员,则会跳转到登录页面。

示例二:

如果我们现在想要控制某些页面的显示权限,可以使用 Django 模板中的宏。例如,我们现在想在管理员页面中添加一个新功能,在超级管理员页面中隐藏该功能,具体方式如下:

views.py 中,我们需要定义不同用户类别的视图函数,代码如下:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def index(request):
    user = request.user
    if user.is_superuser:
        return render(request, 'admin.html', {'is_superuser': True})
    elif user.user_type.is_admin == True:
        return render(request, 'admin.html', {'is_superuser': False})
    else:
        return render(request, 'user.html')

在模板文件 admin.html 中,我们将新功能放在一个名为 new_feature 的 div 中,并使用宏控制该 div 是否显示。

{% if is_superuser %}
<div id="new_feature">
    <!-- 新功能代码 -->
</div>
{% endif %}

以上代码实现了当用户类型为超级管理员时,新功能的 div 显示,而其他用户则看不到该 div。

最后,在 urls.py 中添加相应的路由即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 权限认证(根据不同的用户,设置不同的显示和访问权限) - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django教程如何自学

    当想要自学Django教程时,可以遵循以下步骤: 1. 学习前的准备 在开始学习Django之前,建议先掌握Python基础并了解Web开发的相关概念。以下是一些学习资源: Python 官方文档 Python 基础教程 Django 官方文档 Django 教程 2. 安装 Django 在开始学习Django之前,需要先安装Django。可以通过以下步骤…

    Django 2023年5月16日
    00
  • Django中图片不显示

    很多教程没教对,导致Django中的图片不能正确的显示出来,经过多次踩坑,发现如下方法可以解决该问题。 1.setting.py中添加: STATIC_URL = ‘/static/’ STATICFILES_DIRS=[ os.path.join(BASE_DIR,’static’).replace(‘\\’,’/’) ] 注意在这里BASE_DIR在se…

    Django 2023年4月12日
    00
  • 动手实践记录(利用django创建一个博客系统)

    1.添加一个分类的标签,和主表的关系是 外键 class Category(models.Model): “”” 分类 “”” name = models.CharField(‘名称’, max_length=16) def __unicode__(self):# 在Python3中用 __str__ 代替 __unicode__ return self.n…

    Django 2023年4月13日
    00
  • Django框架文件保存的流程(以及自定义FDFS)

    Django框架文件保存的流程 自定义文件存储类过程说明 from django.core.files.storage import Storage from django.conf import settings from fdfs_client.client import Fdfs_client from rest_framework.exception…

    Django 2023年4月13日
    00
  • 搭建Python的Django框架环境并建立和运行第一个App的教程

    下面是详细的攻略: 搭建Python的Django框架环境 1. 安装Python 首先,需要在你的电脑上安装Python,可以到官网下载对应的版本,建议安装最新版本。 2. 安装虚拟环境 为了隔离项目所需的包和全局Python环境,我们可以使用虚拟环境。使用以下命令安装virtualenv模块: pip install virtualenv 3. 创建虚拟…

    Django 2023年5月16日
    00
  • Django如何简单快速实现PUT、DELETE方法

    要在Django中实现PUT和DELETE方法,需要进行如下步骤: 安装django-cors-headers Django默认不支持跨域请求,因此需要安装django-cors-headers才能使用PUT和DELETE方法。可以通过pip命令进行安装: pip install django-cors-headers 修改settings.py 在INST…

    Django 2023年5月16日
    00
  • Python学习之Django的管理界面代码示例

    我来为您详细讲解一下“Python学习之Django的管理界面代码示例”的完整攻略。 Django管理界面简介 Django框架提供了一个强大的默认后台管理系统,开发者可以通过该系统轻松地管理自己的应用程序数据,包括创建、查看、修改和删除数据库中的数据。 示例一:创建Django后台管理账户 在Django的管理界面中,管理员账户是必不可少的,因此我们需要先…

    Django 2023年5月16日
    00
  • 给Python的Django框架下搭建的BLOG添加RSS功能的教程

    给Python的Django框架下搭建的BLOG添加RSS功能的教程如下: 1. 安装Django开发环境 在开始添加RSS功能之前,你需要先安装Django开发环境。你可以使用pip命令来安装: pip install django 如果你已经安装了Django,你可以使用下面的命令来检查版本号: python -m django –version 2.…

    Django 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部