您的位置:首页 > 编程语言 > Go语言

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
模型或者是自定义的模型):

  1. MyUser.user_permissions.set(permission_list)
    :直接给定一个权限的列表。
  2. MyUser.user_permissions.add(permission,permission,...)
    :一个个添加权限。
  3. MyUser.user_permissions.remove(permission,permission,...)
    :一个个删除权限。
  4. MyUser.user_permissions.clear()
    :清除权限。
  5. MyUser.has_perm('<app_name>.<codename>')
    :判断是否拥有某个权限。权限参数是一个字符串,格式是
    app_name.codename
    。判断user.permissions下有没有这个权限:有, 返回True;没有 判断所属组下有没有这个权限.
  6. 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
可以非常方便的检查用户是否拥有这个权限,

  1. 如果拥有,那么就可以进入到指定的视图函数中,
  2. 如果不拥有,那么就会报一个
    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的界面")  # 如果验证成功且有权限
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: