Django自定义权限控制

最近一直在做自动化发布,通过开发或者测试发起工单到我这边收到工单并一键发布,最终终于完成了这个功能,虽然功能完成了但是目前还不能使用,因为遇到了个问题就是权限问题。如果我把一键发布页面公开的话岂不是任何人都可以发布么。之后想了想弄了一套权限控制,大致的功能就是我可以允许开发到工单页面发起工单,但我不允许开发去一键发布页面发起工单。

所以想到了弄一套权限控制

但是Django默认的权限控制只有三个add, change, delete权限针对数据库操作。可以登录admin后台查看

images

以上我总共创建了4张表分别是delp_result,release_list,user,Users 分别生成了三个默认权限

那我们怎么来定义自己的权限呢?

下面我们来定义自己的权限

首先要说的是,我们必须为url设置name, 因为权限需要和urlname配合使用,urlname就是url(r’’, views.method, name=’urlname’)里的name值。还要建立权限名称和具体操作的映射关系, 即权限名称与(urlname, 请求方法,参数列表)的对应关系,如果用字典表示,就是这样的:

{‘add wls’, ‘get’, []}

第一步,要在models中建立权限的名称和描述信息,这个信息是在django admin中设置权限时显示的信息

第二步,建立一个权限表permission, 将权限的名称,url名称,请求方法(get or post), 参数列表保存进去

第三步, 定义判断权限的方法

下面来实验一下,我们定义一个登录主页的权限

第一步: 在models中建立权限表,我是将映射关系存放在数据库中:

class AccessControl(models.Model):

name = models.CharField(“权限名称”, max_length=64)

url = models.CharField(‘URL名称’, max_length=255)

chioces = ((1, ‘GET’), (2, ‘POST’))

per_method = models.SmallIntegerField(‘请求方法’, choices=chioces, default=1)

argument_list = models.CharField(‘参数列表’, max_length=255, help_text=’多个参数之间用英文半角逗号隔开’, blank=True, null=True)

describe = models.CharField(‘描述’, max_length=255)

class Meta:

permissions = (

(‘access_dashboard’, ‘index’),

(‘access_role_manage’, ‘ecsinfo’),

(‘access_user_manage’, ‘app_con’),

(‘access_delp’,’wwl’),

(‘can_apply_issue’,’release’),

(‘can_author_issue’,”)

)

这里我创建了6个权限分别对应6个urlname

通过python3 manage.py makemigrations,python3 manage.py migrate 我们就可以生成对应的数据表

images

并且我们可以通过auth_permission表查看到我们刚才简历的权限

images

这里注意下auth_user_user_permissions里的是用户对应的权限

auth_permission是所有的权限项

wls_accesscontrol这个是权限列表 之后通过该表去查看对应的权限

之后我们就可以通过后台去插入权限了

images

其中权限名称指的是auth_permission里的codename

url名称指的是urlname 对应的是auth_permission里的name

请求方法2种post和get 因为post有参数的原因所以有个参数列表但是我这里不做限制表示所有的参数都是可以post的

插入完成之后我们就可以到对应的用户去新增权限了如图:

images

之后需要在wls的目录下新增permission.py文件 我们将权限验证方法写在这里面:

from django.shortcuts import render

from . import models

from django.db.models import Q

from django.core.urlresolvers import resolve #此方法可以将url地址转换成url的name

def perm_check(request, *args, **kwargs):

url_obj = resolve(request.path_info)

url_name = url_obj.url_name

perm_name = ”

#权限必须和urlname配合使得

if url_name:

#获取请求方法,和请求参数

url_method, url_args = request.method, request.GET

if url_method == ‘GET’:

url_method=1

elif url_method == ‘POST’:

url_method=2

#操作数据库

get_perm = models.AccessControl.objects.filter(url=url_name,per_method=url_method)

print(get_perm)

if get_perm:

for i in get_perm:

perm_name = i.name

perm_str = ‘wls.%s’ % perm_name

if request.user.has_perm(perm_str):

print(‘====》权限已匹配’)

return True

else:

print(‘—->权限没有匹配’)

return False

else:

return False

else:

return False #没有权限设置,默认不放过

def check_permission(fun): #定义一个装饰器,在views中应用

def wapper(request, *args, **kwargs):

if perm_check(request, *args, **kwargs): #调用上面的权限验证方法

return fun(request, *args, **kwargs)

return render(request, ‘403.html’, locals())

return wapper

到这里自定义权限已经完成了,接下来要做的是在我们自己的页面中使用:

创建views方法:

@permission.check_permission

@login_required

def ecsinfo(request):

***********

这里写了2个装饰器 第一个就是验证权限是否复合 如果不复核跳转到403页面 如果复合就会跳转到login_required装饰器,该装饰器主要是为了验证是否登录 如果没有登录跳转到登录界面 效果:

images

images

PS:super管理员用户 不管有没有设置权限都是可以登录的

之后是页面菜单的权限控制

同时在前端模板页面中也需要进行权限控制,前端要获取request对象的话,后端返回就需要使用render函数

{% if request.user.is_superuser or ‘wls.access_role_manage’ in request.user.get_all_permissions or ‘wls.access_log’ in request.user.get_all_permissions %}

<ul class=”nav navbar-nav”>

<li><a href=”{% url ‘release’ %}”>提交发布</a>

</li>

<li><a href=”{% url ‘disct_list’ %}”>发布列表</a>

</li>

<li><a href=”{% url ‘app_con’ %}”>应用管理</a>

</li>

</ul>

{% endif %}

当我是超级管理员 或者是access_role_manage权限或者是access_log权限我就可以看到以下菜单

当我取消我的普通用户access_role_manage和access_log权限的话就看不到如图:

images

images

当我加入该权限时

images

images

至此权限系统的功能已经完毕,之后就是设置权限了

猜你喜欢

转载自blog.csdn.net/qq_22543991/article/details/82344317