一.8.django权限管理/drf权限管理
1.什么是权限管理:
.权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源
.权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系统有多个权限级别就如一间屋有多个门,想要把所有门都打开您必须要取得所有的钥匙,就如系统一样。
2.django权限机制:
django权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活;用好权限机制,能让系统更加强大和健壮
3.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的所有实例。
4.Django的权限项:
Django用permission对象存储权限项,每个model默认都有三个permission,即add model, change model和delete model
permission总是与model对应的,如果一个object不是model的实例,我们无法为它创建/分配权限
5.默认权限:
在 INSTALLED_APPS 设置中列出 django.contrib.auth 后,安装的各个应用中的每个 Django 模型默认都有三个权限:添加、修改和删除。每次运行 manage.py migrate 命令 创建新模型时都会为其赋予这三个权限。
6.分组:
django.contrib.auth.models.Group 模型是为用户分类的通用方式,这样便可以为一批用户赋予权限或添加其 他标注。用户所属的分组数量不限。一个分组中的用户自动获得赋予那个分组的权限。
除了权限之外,分组还是为用户分类的便捷方式,分组后可以给用户添加标签,或者扩展功能
7.权限应用:
Permission
User Permission
Group Permission
8.权限检查
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"),
)
.每个permission都是django.contrib.auth.Permission类型的实例,该类型包含三个字段name, codename 和 content_type,
content_type反应了permission属于哪个model,
codename 如上面的view_server,代码逻辑中检查权限时要用,
name是permission的描述,将permission打印到屏幕或页面时默认显示的就是name
9.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的权限
10.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()
11.权限验证-普通视图:
在视图中验证权限—— 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):
...
12.权限验证-类视图:
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):
...
13.权限验证-view代码中验证:
if not request.user.has_perm(’dashboard.view_server')
return HttpResponse('Forbidden')
14.权限验证-模板中验证:
验证是否有登陆
{% 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 %}
15.自定义PermissionRequiredMixin:
创建仅限
.在模型的 Meta 类中定制权限
class Meta:
permissions = (
("modify_user_status", "修改用户状态"),
("modify_user_passwd", "修改用户密码"),
)
一.drf权限管理
1.简单权限应用---只有登录过的用户才能访问
(1).apps/users/views.py:
from django.shortcuts import render
from rest_framework import viewsets
from django.contrib.auth import get_user_model
from .serializers import UserSerializer
from .filters import UserFilter
from rest_framework.permissions import IsAuthenticated User = get_user_model()
class UserViewset(viewsets.ReadOnlyModelViewSet):
'''
这个用户资源的viewset会给外面暴露两个接口retrieve和list
retrieve:返回指定用户信息对象--单个对象的字段是在用户序列化类serializers.py中定义
list:返回用户列表--列表的字段的字段是在用户序列化类serializers.py中定义
'''
#1.指定queryset
queryset = User.objects.all()
#2.指定序列化类
serializer_class = UserSerializer
#(2)按哪个字段搜索:
filter_fields = ('username',"email")
#(3)使用哪个filter类
filter_class = UserFilter
#权限为必须得登录才能认证:
permission_classes = (IsAuthenticated,)
效果如下图:
那怎么认证?--得用drf的认证
drf提供了一套基于原始的认证即session认证,它的认证是只需配一登录页面即可。
(2)devops/urls.py中添加一路由:
urlpatterns = [
url(r'^', include(route.urls)),
url(r'^aip-auth', include("rest_framework.urls",namespace="reset_framework")),
url(r'^docs/', include_docs_urls("lizhihua运维平台接口文档"))
]
(python36env) [vagrant@CentOS7 devops]$ python manage.py createsuperuser
Username (leave blank to use 'vagrant'): admin
Email address: admin@51reboot.com
Password: 123456
这样就可访问了!
2.全局权限应用--模型权限(必须跟模型关联):
查看权限源码文件如下图中可知它已对内置很很多权限,那这样我就可自定义权限继承其中任何一权限类即可:
但是阅读源码发现它的模型权限中没有添加get认证/权限验证,只有如下方法有权限验证:
class DjangoModelPermissions(BasePermission):
perms_map = {
'GET': [], ----空/没有
'OPTIONS': [],
'HEAD': [],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}
........
(1)settins.py:配置全局模型权限
查看参考源码配置如下图:但是allowany所有人均可访问不是我要的,所以我覆盖它默认配置--改为django的模型权限,这样就全局生效,好处是不用在每个app的视图中都写,但不好的是如果你一但写一个filter,没有queryset就会出错--解决:就是在app中自定不使用全局的,使用自己独立的即可,这里先使用全局的即可,只做如下配置,app的views.py中不作任何配置。
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
'PAGE_SIZE':10,
'DEFAULT_PAGINATION_CLASS':'users.pagination.Pagination',
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissions',
],
}
创建普通用户
(python36env) [vagrant@CentOS7 devops]$ python manage.py shell
n [1]: from django.contrib.auth.models import User In [2]: User.objects.create_user("rock","rock@51reboot.com","")
登录后效果如下:--所有的测试页面都只有看的权限
3.drf自定义get权限
因为django默认支持的模型权限中没有get的,所以我可直接自定并覆盖它默认的,
(1)devops/permissions.py中:
from rest_framework.permissions import DjangoModelPermissions class Permissions(DjangoModelPermissions):
#
def get_custom_perms(self, view, method):
if hasattr(view, "extra_perm_map"):
if isinstance(view.extra_perm_map, dict):
return view.extra_perm_map.get(method,[])
return [] #这个方法必须写,我是直接把django模型权限中的必备的has_permission方法拷过来
def has_permission(self, request, view):
if getattr(view, '_ignore_model_permissions', False):
return True
if not request.user or (
not request.user.is_authenticated and self.authenticated_users_only):
return False
queryset = self._queryset(view)
perms = self.get_required_permissions(request.method, queryset.model)
perms.extend(self.get_custom_perms(view, request.method))
return request.user.has_perms(perms)
(2)全局配置替换掉:
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
'PAGE_SIZE':10,
'DEFAULT_PAGINATION_CLASS':'users.pagination.Pagination',
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissions',
'devops.permissions.Permissions',
]
}
4.不使用queryset即模型的权限---viewset权限
class DashboardStatusViewset(viewsets.ViewSet):
"""
list:
获取dashboard状态数据
"""
permission_classes = (permissions.IsAuthenticated,)
def list(self, request, *args, **kwargs):
data = self.get_content_data()
return response.Response(data) def get_content_data(self):
return {
"aa": 11,
"bb": 22
}
一.8.django权限管理/drf权限管理的更多相关文章
- python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)
一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...
- Django【进阶】权限管理
一.权限 RBAC:role basic access control 1.什么是权限: 一个权限就是一个url,不同个权限对应不同的url,拥有权限即可以访问这个url. 2.权限划分: 如 ...
- rbac(基于角色权限控制)-------权限管理
权限管理 创建一个rbac和app的应用,这个rbac主要是用来存放权限的,全称叫做基于角色权限控制 一.先看配置文件合适不,给创建的rbac在配置文件里面设置一下 找到INSTALLED_APPS= ...
- linux 用户创建、管理、权限分配
(1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证: sudo: sudo扮 ...
- Oracle 用户管理与权限控制
Oracle 用户管理与权限控制 oracle数据库的权限系统分为系统权限与对象权限.系统权限( database system privilege )可以让用户执行特定的命令集.例如,create ...
- CentOS学习笔记--账号管理与权限配置
Linux 的账号管理与权限配置 管理员的工作中,相当重要的一环就是『管理账号』啦! 使用者标识符: UID 与 GID 虽然我们登陆 Linux 主机的时候,输入的是我们的账号,但是其实 Linux ...
- 用户管理_组管理_设置主机名_UGO_文件高级权限_ACL权限
用户管理: 添加用户:useradd tom 设置密码:passwd tom 切换账户: su - tom (不加-也能切换,但是 -会有两点不同 1.有-会切换到该用户的主目录 2.会切换到该用户 ...
- Easyui后台管理角色权限控制
最近需要做一个粗略的后台管理的权限,根据用户的等级来加载相应的菜单,控制到子菜单.使用的是Easyui这个框架. 1.我使用的mysql数据库.在这里我就建立四张表,角色表(tb_users),菜单表 ...
- SQL 序列-DML-DML-数据类型-用户管理、权限-事务-视图
--DML--insert关键字--作用:往表中插入一条(多条)记录 --元祖(tuple)值式的插入(一次插入一条记录)--语法1:insert into tablename(column1,col ...
随机推荐
- Java实现 蓝桥杯 算法训练 字符串合并
试题 算法训练 字符串合并 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入两个字符串,将其合并为一个字符串后输出. 输入格式 输入两个字符串 输出格式 输出合并后的字符串 样例 ...
- 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)
作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...
- Hadoop之hadoop fs和hdfs dfs、hdfs fs三者区别
适用范围 案例 备注 小记 hadoop fs 使用范围最广,对象:可任何对象 hadoop dfs 只HDFS文件系统相关 hdfs fs 只HDFS文件系统相关(包括与 ...
- 温故知新-多线程-深入刨析volatile关键词
文章目录 摘要 volatile的作用 volatile如何解决线程可见? CPU Cache CPU Cache & 主内存 缓存一致性协议 volatile如何解决指令重排序? volat ...
- 温故知新-java多线程&深入理解线程池
文章目录 摘要 java中的线程 java中的线程池 线程池技术 线程池的实现原理 简述 ThreadPoolExecutor是如何运行的? 线程池运行的状态和线程数量 任务执行机制 队列缓存 Wor ...
- Android开发之StrictMode
StrictMode简介 Android开发者官网对StrictMode的介绍 StrictMode类是Android 2.3(API 9)引入的一个工具类 用来帮助开发者发现代码中一些不规范的问题, ...
- .Net Core实战之基于角色的访问控制的设计
前言 上个月,我写了两篇微服务的文章:<.Net微服务实战之技术架构分层篇>与<.Net微服务实战之技术选型篇>,微服务系列原有三篇,当我憋第三篇的内容时候一直没有灵感,因此先 ...
- Debian安装NVIDIA显卡驱动
1. sudo apt-get install nvidia-detect nvidia-detect 输出信息: Detected NVIDIA GPUs: 01:00.0 VGA compatib ...
- WAMP3.1 安装php_redis.dll扩展并配置php.ini
一. 下载对应版本的php_redis.dll 下载地址:http://windows.php.net/downloads/pecl/releases/redis 注:php7目录下有php7.dll ...
- PHP 直接插入排序
php数组下标从0开始,所以第一步就是数组长度加1,数组元素全部后移一位,把下标0对应值设置为哨兵.结果顺序排序完成后,删除哨兵. function insert_sort($arr) { //这里可 ...