什么是权限管理

  • 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自

    己被授权的资源
  • 权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个

    系统有多个权限级别就如一间屋有多个门,想要把所有门都打开您必须要取得所有的钥

    匙,就如系统一样。

django权限机制

  • django权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活;用好权限机制,能让系统更加强大和健壮

django权限控制

  • Django用user,group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B的所有实例(objects)。group的权限也是如此,如果为group C 赋予model B的可写权限,则隶属于group C的所有用户,都可以修改model B的所有

    实例。

Django的权限项

  • Django用permission对象存储权限项,每个model默认都有三个permission,即add

    model, change model和delete model

    permission总是与model对应的,如果一个object不是model的实例,我们无法为它创建

    /分配权限

默认权限

  • 在 INSTALLED_APPS 设置中列出django.contrib.auth 后,安装的各个应用中的每个 Django 模

    型默认都有三个权限:添加、修改和删除。每次运行 manage.py migrate 命令创建新模型时都

    会为其赋予这三个权限。

分组

  • django.contrib.auth.models.Group 模型是为用户分类的通用方式,这样便可以为一批用户

    赋予权限或添加其 他标注。用户所属的分组数量不限。一个分组中的用户自动获得赋予那

    个分组的权限。
  • 除了权限之外,分组还是为用户分类的便捷方式,分组后可以给用户添加标签,或者扩展功能

权限应用

  • Permission
  • User Permission
  • Group Permission
  • 权限检查
Permission
  • Django定义每个model后,默认都会添加该model的add, change和delete三个

    permission,自定义的permission可以在我们定义model时手动添加

class Server(models.Model):
...
class Meta:
permissions = (
("view_server", "can view server"),
("change_server_status", "Can change the status of server"),
)
#codename == view_server权限验证项
#name == can view server 可读的名称
  • 每个permission都是django.contrib.auth.Permission类型的实例,该类型包含三个字段

    name, codename 和 content_type

content_type反应了permission属于哪个model,

codename 如上面的view_server,代码逻辑中检查权限时要用,

name是permission的描述,将permission打印到屏幕或页面时默认显示的就是name

User Permission
  • User对象的user_permission字段管理用户的权限
user = User.objects.get(username="rock")
user.user_permissions = [permission_list]
user.user_permissions.add(permission, permission, …) #增加权限
user.user_permissions.remove(permission, permission, …) #删除权限
user.user_permissions.clear() #清空权限
user.get_all_permissions() #列出用户的所有权限
user.get_group_permissions() # 列出用户所属group的权限
  • 练习

In [1]: from django.contrib.auth.models import Group,User,Permission
In [3]: user = User.objects.get(username='rock-1')
In [4]: user.groups.all
Out[4]: <bound method BaseManager.all of <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x7fd86cf49ef0>>
In [5]: user.groups.all()
Out[5]: <QuerySet [<Group: 51reboot>]> In [6]: user.user_permissions.all()
Out[6]: <QuerySet []>
In [7]: per = Permission.objects.get(id=21)
In [8]: per.codename
Out[8]: 'delete_idc' In [9]: user.user_permissions.add(per) In [10]: user.user_permissions.all()
Out[10]: <QuerySet [<Permission: resources | idc | Can delete idc>]> In [11]: user.user_permissions.remove(per) In [12]: user.user_permissions.all()
Out[12]: <QuerySet []> In [13]: user.user_permissions.add(per) In [14]: user.user_permissions.clear() In [15]: user.user_permissions.add(per) In [16]: user.get_all_permissions()
Out[16]:
{'admin.add_logentry',
'admin.change_logentry',
'admin.delete_logentry',
'auth.add_group',
'auth.add_permission',
'auth.add_user',
'auth.change_group',
'auth.change_permission',
'auth.change_user',
'auth.delete_group',
'auth.delete_permission',
'auth.delete_user',
'contenttypes.add_contenttype',
'contenttypes.change_contenttype',
'contenttypes.delete_contenttype',
'resources.add_idc',
'resources.change_idc',
'resources.delete_idc',
'sessions.add_session',
'sessions.change_session',
'sessions.delete_session'} In [17]: user.groups.clear() In [18]: user.get_all_permissions()
Out[18]:
{'admin.add_logentry',
'admin.change_logentry',
'admin.delete_logentry',
'auth.add_group',
'auth.add_permission',
'auth.add_user',
'auth.change_group',
'auth.change_permission',
'auth.change_user',
'auth.delete_group',
'auth.delete_permission',
'auth.delete_user',
'contenttypes.add_contenttype',
'contenttypes.change_contenttype',
'contenttypes.delete_contenttype',
'resources.add_idc',
'resources.change_idc',
'resources.delete_idc',
'sessions.add_session',
'sessions.change_session',
'sessions.delete_session'} In [19]: user.get_group_permissions()
Out[19]:
{'admin.add_logentry',
'admin.change_logentry',
'admin.delete_logentry',
'auth.add_group',
'auth.add_permission',
'auth.add_user',
'auth.change_group',
'auth.change_permission',
'auth.change_user',
'auth.delete_group',
'auth.delete_permission',
'auth.delete_user',
'contenttypes.add_contenttype',
'contenttypes.change_contenttype',
'contenttypes.delete_contenttype',
'resources.add_idc',
'resources.change_idc',
'resources.delete_idc',
'sessions.add_session',
'sessions.change_session',
'sessions.delete_session'} In [20]: user.groups.all()
Out[20]: <QuerySet []>
Group Permission
  • group permission管理逻辑与user permission管理一致,group中使用permissions字段做

    权限管理
group.permissions.set([permission_list])#设置权限
group.permissions.add(permission, permission, …)#添加权限
group.permissions.remove(permission, permission, …)#删除权限
group.permissions.clear()#情况权限
  • 练习

In [40]: group = Group.objects.get(name='51reboot')#取出一个组
In [41]: group.permissions.all()#列出组所有权限
Out[41]: <QuerySet [<Permission: admin | log entry | Can add log entry>, <Permission: admin | log entry | Can change log entry>, <Permission: admin | log entry | Can delete log entry>, <Permission: auth | group | Can add group>, <Permission: auth | group | Can change group>, <Permission: auth | group | Can delete group>, <Permission: auth | permission | Can add permission>, <Permission: auth | permission | Can change permission>, <Permission: auth | permission | Can delete permission>, <Permission: auth | user | Can add user>, <Permission: auth | user | Can change user>, <Permission: auth | user | Can delete user>, <Permission: contenttypes | content type | Can add content type>, <Permission: contenttypes | content type | Can change content type>, <Permission: contenttypes | content type | Can delete content type>, <Permission: resources | idc | Can add idc>, <Permission: resources | idc | Can change idc>, <Permission: resources | idc | Can delete idc>, <Permission: sessions | session | Can add session>, <Permission: sessions | session | Can change session>, '...(remaining elements truncated)...']> In [42]: permission = Permission.objects.get(id=20)#先取出一个权限(Can change idc) In [43]: group.permissions.remove(permission)#从组里删除这个权限 In [44]: group.permissions.all()#再次查看权限
Out[44]: <QuerySet [<Permission: admin | log entry | Can add log entry>, <Permission: admin | log entry | Can change log entry>, <Permission: admin | log entry | Can delete log entry>, <Permission: auth | group | Can add group>, <Permission: auth | group | Can change group>, <Permission: auth | group | Can delete group>, <Permission: auth | permission | Can add permission>, <Permission: auth | permission | Can change permission>, <Permission: auth | permission | Can delete permission>, <Permission: auth | user | Can add user>, <Permission: auth | user | Can change user>, <Permission: auth | user | Can delete user>, <Permission: contenttypes | content type | Can add content type>, <Permission: contenttypes | content type | Can change content type>, <Permission: contenttypes | content type | Can delete content type>, <Permission: resources | idc | Can add idc>, <Permission: resources | idc | Can delete idc>, <Permission: sessions | session | Can add session>, <Permission: sessions | session | Can change session>, <Permission: sessions | session | Can delete session>]> In [45]: group.permissions.add(permission)添加权限 In [46]: group.permissions.all()#再次查看权限
Out[46]: <QuerySet [<Permission: admin | log entry | Can add log entry>, <Permission: admin | log entry | Can change log entry>, <Permission: admin | log entry | Can delete log entry>, <Permission: auth | group | Can add group>, <Permission: auth | group | Can change group>, <Permission: auth | group | Can delete group>, <Permission: auth | permission | Can add permission>, <Permission: auth | permission | Can change permission>, <Permission: auth | permission | Can delete permission>, <Permission: auth | user | Can add user>, <Permission: auth | user | Can change user>, <Permission: auth | user | Can delete user>, <Permission: contenttypes | content type | Can add content type>, <Permission: contenttypes | content type | Can change content type>, <Permission: contenttypes | content type | Can delete content type>, <Permission: resources | idc | Can add idc>, <Permission: resources | idc | Can change idc>, <Permission: resources | idc | Can delete idc>, <Permission: sessions | session | Can add session>, <Permission: sessions | session | Can change session>, '...(remaining elements truncated)...']> In [48]: group.permissions.set([permission])#设置权限,会清空之前的所有权限,传入一个权限列表 In [49]: group.permissions.all()#再次查看权限
Out[49]: <QuerySet [<Permission: resources | idc | Can change idc>]> In [50]: group.permissions.clear()#清空所有权限 In [51]: group.permissions.all()#再次查看权限
Out[51]: <QuerySet []>
权限验证-普通视图
  • 在视图中验证权限—— permission_required,
  • 当业务逻辑中涉及到权限检查时,decorator能够分离权限验证和核心的业务逻辑,使代码更

    简洁,逻辑更清晰。permission的decorator为permission_required
from django.contrib.auth.decorators import login_required, permission_required
@login_required
@permission_required(’dashboard.view_server')
def my_view(request,*args,**kwargs):
权限验证-类视图
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ServerView(TemplateView):
@method_decorator(login_required)
@method_decorator(permission_required(“dashboard.view_server”)
def get(self, request, *args, **kwargs):
...
权限验证-view代码中验证
if not request.user.has_perm(’dashboard.view_server')
return HttpResponse('Forbidden')
权限验证-模板中验证
  • 验证是否有登陆
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
  • 验证是否有权限
{% if perms.dashboard.view_server %}
有权限
{% endif %}
PermissionRequiredMixin
from django.contrib.auth.mixins import PermissionRequiredMixin
class IndexView(LoginRequiredMixin,PermissionRequiredMixin,TemplateView):
template_name = 'index.html'
自定义PermissionRequiredMixin
创建仅限
  • 在模型的 Meta 类中定制权限
class Meta:
permissions = (
("modify_user_status", "修改用户状态"),
("modify_user_passwd", "修改用户密码"),
)
  • 直接创建权限
from resources.models import Idc
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(Idc)
permission = Permission.objects.create(codename='can_view',
name='Can view Idc',
content_type=content_type)

django权限管理(Permission)的更多相关文章

  1. [Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 一.主要内容 1.什么是权限管理? 2.Web 权限 3.Django 权限机制 ...

  2. Django权限机制的实现

    Django权限机制的实现 1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发 ...

  3. django(权限、认证)系统—— Permissions和Group

    接着上面的3篇讨论文章,我们阐述了Django中如何使用Authentication系统进行,用户的创建,登陆,登出,完成了用户的认证.接下来,我们要看另外一个议题,那就是Authorization授 ...

  4. django权限管理

    当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ...

  5. Django - 权限(2)- 动态显示单级权限菜单

    一.权限组件 1.上篇随笔中,我们只是设计好了权限控制的表结构,有三个模型,五张表,两个多对多关系,并且简单实现了对用户的权限控制,我们会发现那样写有一个问题,就是权限控制写死在了项目中,并且没有实现 ...

  6. Django - 权限(1)

    一.权限表结构设计 1.认识权限 生活中处处有权限,比如,腾讯视频开会员才有观看某个最新电影的权限,你有房间钥匙就有了进入这个房间的权限,等等.同样,程序开发过程中也有权限,我们今天说的权限指的是we ...

  7. Django - 权限(3)- 动态显示二级菜单

    一.动态显示二级菜单 上篇随笔中,我们实现了动态显示一级菜单,现在考虑这样一种情况,用户的菜单权限比较多,这个时候全部并列展现在左侧菜单就不合适了,所以,现在有这样一个需求,即把用户的菜单权限分类,划 ...

  8. Django权限管理系统设计分析

    权限管理顾名思义,其实就是角色控制权限的系统,每个用户对应一个角色,每个角色有对应的权限,比如公司会有CEO,总监,销售经理,销售员,每个人的权限都不一样,那我们给他展示的url也都不同 一.首先创建 ...

  9. django权限之二级菜单

    遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None   反向查询,起名用的 ...

随机推荐

  1. ProxyHandler处理器(代理设置)

    很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问的次数多得不像正常人,它会禁止这个IP的访问. 所以我们可以设置一些代理服务器,每个一段时间换一个代理,就算IP被禁止, ...

  2. 中间件之Kafka

    (一)kafka简介 Kafka/Jafka 高性能跨语言的分布式发布/订阅消息系统,数据持久化,全分布式,同时支持在线和离线处理. 1.1 kafka设计目标 高吞吐率 在廉价的商用机器上单机可支持 ...

  3. easyui 改变单元格背景颜色

    另外一种方法:https://www.cnblogs.com/raitorei/p/9989649.html easyui的datagrid改变整行颜色:https://www.cnblogs.com ...

  4. js数组去除重复数据

    一个有重复数据的数组,准备一个空数组,遍历有重复数据的数组同时用indexOf对比那个空数组判断是否有一样的,不一样的push进去空数组 let arr = dataInfo.map(item =&g ...

  5. 新建一个项目,如何使用abp用户登录系统

    1.首先参考Framework.Web里的packages.config,把相关的包都安装好. 2.App_Start文件夹下的xxxModule.cs和Startup.cs拷过来,修改下命名空间. ...

  6. Scanner 随机数

    import java.util.Scanner;                                               import java.util.Scanner; Sc ...

  7. Java SSM 框架相关基础面试题

    一.Spring 面试题 1. Spring 在 SSM 中起什么作用? Spring 是轻量级框架,作用是作为 Bean 工厂,用来管理 Bean 的声明周期和框架集成. Spring 的两大核心: ...

  8. 归并排序(递归排序and外排排序)

    分析: /** * 归并排序 (先将数组利用归并排序排成 有序的左边数组和右边数组,再比较左边数组和右边数组的数值大小进行排序) * */ public class MergeSort { publi ...

  9. ABP框架系列之四十五:(Quartz-Integration-Quartz-集成)

    Introduction Quartz is a is a full-featured, open source job scheduling system that can be used from ...

  10. C++ MFC棋牌类小游戏day3

    今天开始设计小人棋子. 画法跟画虎一样,唯一不一样的是小人在刚开始会有重叠的情况,所以画起来可能比虎的棋子能够难一点. 我打算用Location结构体中的num来标记每个棋盘坐标存在棋子的个数,isH ...