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('分组界面')

浙公网安备 33010602011771号