DjangoLearning_charter11权限

 权限

django内置权限系统介绍

  • 权限都是针对表或者是模型级别的,比如对某个模型上的数据是否可以进行增删改查操作。但是不能针对数据级别,比如对某个表的某条数据进行增删改查
  • 如果是实现数据级别的,考虑用django-guradian。
  • 创建完一个模型后, 对模型的权限是增/删/改。
  • 可以在执行完migrate后查看数据库 auth_permission表中的所有权限

 

 

 

这些权限都是django.contrib.auth.Permission的实例。

其中codename代表权限名, name代表权限作用, content_type_id是django_content_type表的外键,指向某个app的某个模型


 

添加新权限

1、通过创建模型添加

此处存疑:老师的版本是view_article, 但是现在会报与模型的权限冲突的错误

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    auhor = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

    class Meta:
        permissions = [
            ('see_article', '查看文章的权限'),
        ]

2、通过代码添加

 

 

 

 

from django.contrib.auth.models import Permission, ContentType
from .models import Article


def permission_view(request):
    content_type = ContentType.objects.get_for_model(Article)
    Permission.objects.create(name='编辑文章', codename='edit_article', content_type=content_type)
    return HttpResponse('添加权限成功')

 

 

 


 

用户与权限管理

权限本身也是数据,必须与用户进行绑定才能起作用。User模型和权限之间的管理, 通过以下的方式

  • user.user_permissions.set(permission_list):直接给定一个权限列表
def permission_view(request):

    # 用户与权限管理
    user = User.objects.first()
    content_type = ContentType.objects.get_for_model(Article)
    permissions = Permission.objects.filter(content_type=content_type)
    user.user_permissions.set(permissions)

    return HttpResponse('权限页面')

user.user_permissions.add(permission1, permission2...):一个一个添加权限

def permission_view(request):

    # 用户与权限管理
    user = User.objects.first()
    content_type = ContentType.objects.get_for_model(Article)
    permissions = Permission.objects.filter(content_type=content_type)
    user.user_permissions.add(*permissions)

    return HttpResponse('权限页面')

user.user_permissions.remove(permission1, permission2...):一个一个移除权限

def permission_view(request):

    # 用户与权限管理
    user = User.objects.first()
    content_type = ContentType.objects.get_for_model(Article)
    permissions = Permission.objects.filter(content_type=content_type)
    user.user_permissions.remove(*permissions)
    return HttpResponse('权限页面')

user.user_permissions.clear():清除权限

def permission_view(request):


    # 用户与权限管理
    user = User.objects.first()
    content_type = ContentType.objects.get_for_model(Article)
    permissions = Permission.objects.filter(content_type=content_type)
    user.user_permissions.clear()

    return HttpResponse('权限页面')

user.has_perm('appname.codename'):判断用户是否拥有某个权限, appname.codename

def permission_view(request):
    # 用户与权限管理
    user = User.objects.first()
    content_type = ContentType.objects.get_for_model(Article)
    permissions = Permission.objects.filter(content_type=content_type)
    print(user.has_perm('article.edit_article'))

    return HttpResponse('权限页面')

>> True

user.get_all_permissions():获取所有权限

def permission_view(request):
    # 用户与权限管理
    user = User.objects.first()
    content_type = ContentType.objects.get_for_model(Article)
    permissions = Permission.objects.filter(content_type=content_type)
    print(user.get_all_permissions())

    return HttpResponse('权限页面')

>> {'admin.view_logentry', 'auth.view_permission', 'auth.delete_group', 'front.change_user', ...

 

权限验证装饰器

用函数进行验证:

def add_article(request):
    if request.user.is_authenticated:
        print('已登录')
        if request.user.has_perm('front.add_article'):
            return HttpResponse('这里是添加文章的界面')
        else:
            return redirect(reverse('login'))
    else:
        return redirect(reverse('login'))

 

用装饰器验证:

首先验证当前用户是否登录, 如否,跳转到登陆页面, 然后判断当前用户有无权限,如无,跳转到登陆页面(http://127.0.0.1:8000/accounts/login/?next=/article/)需要进行定义

raise_exception=True: 当用户无权限时,跳转到默认的403Forbidden界面,也可自己定义403界面

from django.contrib.auth.decorators import permission_required
@ permission_required('front.add_article', login_url='/login/', raise_exception=True)
def add_article(request):
return HttpResponse('这里是添加文章的界面')

 

分组-group、permission、user的操作

Group.objects.create(name=''):创建分组

group.permissions:某个分组上的权限,多对多关系

  • group.permissions.add():添加权限
def create_group(request):
    group = Group.objects.filter(name='运营').first()
    content_type = ContentType.objects.get_for_model(Article)
    permissions = Permission.objects.filter(content_type=content_type)
    group.permissions.add(*permissions)
   
    return HttpResponse('分组界面')
  • group.permissions.remove():移除权限
  • group.permissions.clear():清除所有权限
  • group.get_group_permissions():获取用户所属组的权限

user.groups:某个用户上的所有分组,多对多关系

  • user.groups.add(group):用户添加分组
def create_group(request):
    
    group = Group.objects.filter(name='运营').first()
    user = User.objects.first()
    user.groups.add(group)
    user.save()
    return HttpResponse('分组界面')
  • user.get_group_permissions():获取用户所属组的权限
def create_group(request):

    user = User.objects.first()
    print(user.get_group_permissions())
    return HttpResponse('分组界面')

 

posted @ 2020-03-29 20:01  扛大炮的  阅读(156)  评论(0)    收藏  举报