设为首页 加入收藏

TOP

Django用户认证系统(三)组与权限(四)
2019-02-12 16:07:55 】 浏览:225
Tags:Django 用户 认证 系统 权限
lly creating permissions

除了可以使用Model meta来创建权限,也可以直接用代码创建。

例如,为myapp应用中的BlogPost模型创建一个can_publish权限:

1
2
3
4
5
6
7
8
from  myapp.models  import  BlogPost
from  django.contrib.auth.models  import  Group, Permission
from  django.contrib.contenttypes.models  import  ContentType
 
content_type  =  ContentType.objects.get_for_model(BlogPost)
permission  =  Permission.objects.create(codename = 'can_publish' ,
                                        name = 'Can Publish Posts' ,
                                        content_type = content_type)

权限可以被赋予一个User对象通过它的user_permissions属性或者赋予一个Group通过它的permissions属性。

权限缓存

User的权限检查时是可以被缓存的,如果一个新权限被赋予一个User,如果再立即检查是不会被检查出来的。最简单的方法是重新fetch User对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from  django.contrib.auth.models  import  Permission, User
from  django.shortcuts  import  get_object_or_404
 
def  user_gains_perms(request, user_id):
     user  =  get_object_or_404(User, pk = user_id)
     #权限检查会缓存现在的权限集
     user.has_perm( 'myapp.change_bar' )
 
     permission  =  Permission.objects.get(codename = 'change_bar' )
     user.user_permissions.add(permission)
 
     # 检查权限缓存集
     user.has_perm( 'myapp.change_bar' )   # False
 
     # 请求新实例
     user  =  get_object_or_404(User, pk = user_id)
 
     # Permission cache is repopulated from the database
     user.has_perm( 'myapp.change_bar' )   # True
 
     ...

权限装饰器

permission_required(perm[, login_url=None, raise_exception=False])

检查用户是否具有某个权限,类似于@login_required()

1
2
3
4
5
from  django.contrib.auth.decorators  import  permission_required
 
@permission_required ( 'polls.can_vote' , login_url = '/loginpage/' )
def  my_view(request):
     ...

模板中的权限

user的的权限保存在模板变量 {{ perms }}中,是django.contrib.auth.context_processors.PermWrapper实例。

1
{{ perms.foo }}

上面的单属性是User.has_module_perms的代理。如果user拥有foo中的任一权限,则为True

1
{{ perms.foo.can_vote }}

上面的两级属性查询是User.has_perm的代理,如果用户拥有foo.can_vote权限则为True。

例如:

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目