Django2.0-验证和授权(4)-权限
2018-11-18 17:49
387 查看
版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc666666_6/article/details/84202657
权限
Django中内置了权限的功能。
- 都是针对表(模型级别)的。比如对某个模型上的数据是否可以进行增删改查操作。
- 不能针对数据级别的,比如对某个表中的某条数据能否进行增删改查操作(如果要实现数据级别的,考虑使用
django-guardian
)。
创建完一个模型后,针对这个模型默认就有三种权限,分别是增/删/改。
在执行完
migrate命令后,查看数据库中的
auth_permission表中的所有权限。
其中的
codename表示的是权限的名字。
name表示的是这个权限的作用。
content_type_id指向
django_content_type表,该表示表示models对应的app
添加权限
通过定义模型添加权限
如果想要增加新的权限,比如查看某个模型的权限,那么可以在定义模型的时候在
Meta中定义好。
class DemoModel(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=20, validators=[validators.MinLengthValidator(6)]) class Meta: permissions = { ("search_demo", "can search demo"), }
通过代码添加权限
权限都是
django.contrib.auth.Permission的实例。
这个模型包含三个字段,
name、
codename以及
content_type,其中的
content_type表示这个
permission是属于哪个
app下的哪个
models。
from django.contrib.auth.models import Permission, ContentType from .models import DemoModel def create_permission(request): content_type = ContentType.objects.get_for_model(DemoModel) permission = Permission.objects.create(codename='edit_demo', name='can edit demo', content_type=content_type) return HttpResponse("create_permission successful")
用户与权限管理
权限本身只是一个数据,必须和用户进行绑定,才能起到作用。
User模型和权限之间的管理,可以通过以下几种方式来管理(
MyUser指的是默认有的
User模型或者是自定义的模型):
MyUser.user_permissions.set(permission_list)
:直接给定一个权限的列表。MyUser.user_permissions.add(permission,permission,...)
:一个个添加权限。MyUser.user_permissions.remove(permission,permission,...)
:一个个删除权限。MyUser.user_permissions.clear()
:清除权限。MyUser.has_perm('<app_name>.<codename>')
:判断是否拥有某个权限。权限参数是一个字符串,格式是app_name.codename
。判断user.permissions下有没有这个权限:有, 返回True;没有 判断所属组下有没有这个权限.MyUser.get_all_permissons()
:获取所有的权限。
def operate_permission(request): content_type = ContentType.objects.get_for_model(DemoModel) permissions = Permission.objects.filter(content_type=content_type) for permission in permissions: print(permission) user = InheritTwo.objects.filter().first() # user.user_permissions.set(permissions) # user.user_permissions.clear() # user.user_permissions.add(permissions[0]) # user.user_permissions.add(*permissions) # user.user_permissions.remove(permissions[1]) # user.user_permissions.remove(*permissions) if user.has_perm('front.search_demo'): # 如果是user.has_perms,则参数是一个列表 print("yes") else: print("no") return HttpResponse("successful")
权限限定装饰器
使用
django.contrib.auth.decorators.permission_required可以非常方便的检查用户是否拥有这个权限,
- 如果拥有,那么就可以进入到指定的视图函数中,
- 如果不拥有,那么就会报一个
403
错误。
from django.contrib.auth.decorators import permission_required #@permission_required(["front.search_demo",]) # @permission_required("front.search_demo") # 默认访问http://127.0.0.1:8000/accounts/login/?next=/search/ # @permission_required("front.search_demo", login_url='/login/') #如果验证失败,则跳转login_url指定的url路径 @ permission_required("front.search_demo", login_url='/login/', raise_exception=True) # 即使验证成功后,如果没有权限,则跳转403 def search_demo(request): # 类似以下操作 # if request.user.is_authenticated: # print("已经登陆") # if request.user.has_perm('front.search_demo'): # return HttpResponse("这是查询demo的界面") # else: # return HttpResponse("你没有权限访问该页面的权限") # else: # return redirect(reverse('login')) return HttpResponse("这是查询demo的界面") # 如果验证成功且有权限阅读更多
相关文章推荐
- Django2.0-验证和授权(4)-Group 分组
- WCF权限 - 验证与授权
- [.NET 基于角色安全性验证] 之四:ASP.NET 2.0 成员资格和角色管理授权
- SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权
- ASP.NET Internet安全Forms身份验证及授权[1.1,2.0对比]
- Django1.5内置的用户认证系统介绍(之三)权限与授权--by hillfree
- 四【用django2.0来开发】后台会员管理(二) ModelForm表单的使用方法以及数据验证
- .NET Core 2.0 Cookie中间件 权限验证
- [.NET 基于角色安全性验证] 之四:ASP.NET 2.0 成员资格和角色管理授权
- Django-CBV中的用户登录权限验证
- 介绍ASP.NET 2.0 新特性(expressionBuilder)对用户界面小粒度权限验证的支持
- Django REST FrameWork中文教程4:验证和权限
- SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权
- django入门笔记9 - auth用户验证&权限
- SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权
- Django view 权限验证
- Exchange2007用户-用户全部访问权限授权命令及验证脚本
- Django2.0官方文档学习-用户权限控制
- shiro第二天——角色和权限验证(编程式授权)
- Django-Rest-Framework 教程: 4. 验证和权限