百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Django4.1版本中,(单独用户)权限管理和应用

toyiye 2024-09-16 06:09 3 浏览 0 评论

当需要给某个具体用户单独授权时,可以使用Django内置的UserObjectPermission模型,该模型用于管理具有特定对象权限的用户。下面是一个示例代码:

from django.contrib.auth.models import User
from guardian.shortcuts import assign_perm
# 获取要授权的用户
user = User.objects.get(username='tom')
# 获取要授予权限的对象
article = Article.objects.get(id=1)
# 调用assign_perm()函数,将add_article权限授予给用户tom,用于文章1
assign_perm('articles.add_article', user, article)

这样,用户tom就获得了在文章1中添加新文章的权限。

接下来,我们可以在视图函数中使用django.contrib.auth.decorators.user_passes_test装饰器来限制只有授予了添加文章权限的用户才能访问该页面,代码如下:

from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import render, redirect
from articles.forms import ArticleForm
@user_passes_test(lambda user: user.has_perm('articles.add_article'), login_url='/login/')
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save(commit=False)
article.author = request.user
article.save()
return redirect(article.get_absolute_url())
else:
form = ArticleForm()
return render(request, 'article_create.html', {'form': form})

其中,使用了user_passes_test装饰器来限制只有授予了添加文章权限的用户才能访问该页面,如果用户没有该权限,则会重定向到登录页面。如果用户有权限,则可以访问和使用该页面。

这段代码定义了一个名为article_create的视图函数,用于在网站上发布一篇新的文章。具体解释如下:

# 导入必要的模块和模型

from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import render, redirect
from articles.forms import ArticleForm
# 限制只有具备添加文章权限的用户才能访问该视图函数
@user_passes_test(lambda user: user.has_perm('articles.add_article'), login_url='/login/')
def article_create(request):
# 表单提交方式为POST时,表示用户想要添加一篇文章
if request.method == 'POST':
# 创建一个ArticleForm实例
form = ArticleForm(request.POST)
# 验证表单数据是否符合要求
if form.is_valid():
# 创建Article对象并提交到数据库中
article = form.save(commit=False)
article.author = request.user
article.save()
# 重定向到文章详情页面
return redirect(article.get_absolute_url())
# 表单提交方式为GET时,表示用户想要看到添加新文章的页面
else:
form = ArticleForm()
# 渲染article_create.html模板,将ArticleForm实例作为上下文传递给模板
return render(request, 'article_create.html', {'form': form})

这个视图函数主要做了以下几件事:

使用@user_passes_test装饰器来限制只有授予了添加文章权限的用户才能访问该页面,如果用户没有该权限,则会重定向到登录页面。如果用户有权限,则可以访问和使用该页面。

如果表单提交方式为POST,则根据用户提交的数据创建一个新的Article对象,并将这个对象保存到数据库中,同时将新文章的作者字段设置为当前用户。

如果表单提交方式为GET,则表示用户想要看到添加新文章的页面,这时需要创建一个ArticleForm实例,并渲染article_create.html模板,将ArticleForm实例作为上下文传递给模板,以便在模板中显示表单。

最后会返回一个经过渲染后的article_create.html网页,该网页包含了文章发布表单和相应的验证错误信息,如果表单提交成功则会自动重定向到新文章的详情页面。

这个视图函数展现了如何使用装饰器限制只有授予了特定用户权限的用户才能访问某些敏感信息或执行某些敏感操作,将有助于提高网站的安全性和保护用户的隐私。

这段代码使用@user_passes_test装饰器对视图函数进行了装饰,通过给定的用户测试函数对请求用户进行权限检查,只有具备添加文章权限的用户才能访问该视图函数,否则会被重定向到登录页面。

具体解释如下:

lambda user: user.has_perm('articles.add_article') 是一个匿名函数,它返回一个布尔值,用于检查用户是否具有添加文章的权限。user.has_perm()方法用于检查该用户是否具有指定的权限。

@user_passes_test 装饰器会调用上述检查函数,并将检查结果作为参数传递给该装饰器。如果检查函数返回True,则允许用户访问被装饰的函数;否则,该视图将被重定向到指定的登录页面。

login_url='/login/' 表示如果检查结果为False,则会将用户重定向到指定的登录页面。

因此,这段代码主要是为了保护敏感信息,限制只有具备指定权限的用户才能访问相关的页面,以提高网站的安全性和保护用户的隐私。

--------------------------分割线------------查询用户组内容------------

在django4.1框架中,可以使用以下代码来批量查看用户组权限:

from django.contrib.auth.models import Permission, Group
from django.contrib.contenttypes.models import ContentType
def get_group_permissions():
# 获取所有的 content types
content_types = ContentType.objects.all()

# 获取所有的权限
all_permissions = Permission.objects.all()

# 获取所有的用户组
all_groups = Group.objects.all()

# 遍历用户组
for group in all_groups:
# 输出用户组名称
print('Group: {}'.format(group.name))

# 遍历 content types
for content_type in content_types:
# 获取该 content type 下的所有权限
permissions = all_permissions.filter(content_type=content_type)

# 输出权限信息
for permission in permissions:
# 判断用户组是否有该权限
if group.permissions.filter(id=permission.id).count() > 0:
print('\t{}: {}'.format(content_type.model, permission.name))

该代码会输出每个用户组的权限信息,包括哪些 model 下的哪些权限被授予了。需要注意的是,该代码只适用于 django 自带的权限系统,如果使用的是自定义权限系统,则需要根据具体情况进行修改。

在 Django 框架中,权限划分结果一般是通过判断用户是否具有特定权限来得出的。具体来说,可以通过 user 对象的 has_perm() 方法来判断当前用户是否具有特定的权限。在调用该方法时需要传入权限字符串,格式为 "app_label.permission_code",其中 "app_label" 是应用名,"permission_code" 是权限代码。例如,"auth.view_user" 表示 "auth" 应用下的 "view_user" 权限。

另外,如果想要在模板中判断当前用户是否具有特定权限,可以使用模板标签 {% if perms.app_label.perm_code %}。其中 "app_label" 和 "perm_code" 分别表示应用名和权限代码。

需要注意的是,在使用自定义权限系统时,权限划分结果的判断逻辑可能会有所不同,需要根据具体情况进行调整。

假设我们有一个名为 "blog" 的应用,其中定义了一个名为 "publish_post" 的权限,用于控制用户是否可以发布博客文章。现在我们要判断当前登录用户是否具有该权限。

如果是在视图函数中,可以通过 request.user.has_perm('blog.publish_post') 来判断当前用户是否具有 "blog.publish_post" 权限。例如,以下代码将只允许具有 "blog.publish_post" 权限的用户访问 "publish" 视图函数:

from django.contrib.auth.decorators import login_required, permission_required
@permission_required('blog.publish_post')
@login_required
def publish(request):
# ...

如果是在模板中,可以使用 {% if perms.blog.publish_post %} 标签来判断当前用户是否具有 "blog.publish_post" 权限。例如,以下代码将只显示给具有 "blog.publish_post" 权限的用户:

{% if perms.blog.publish_post %}
<a href="{% url 'blog_publish' %}">发表文章</a>
{% endif %}

需要注意的是,权限字符串中的 "blog" 应该是 "blog" 应用的名称,需要根据实际情况调整。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码