最近在写发布系统,涉及到权限的控制

参考 黄小墨同学的博客实现了

如下

1;定义一张权限控制的表

 [root@localhost app01]# tailf -25 models.py

 class Permission(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) def __str__(self):
return self.name class Meta:
verbose_name = '权限表'
verbose_name_plural = verbose_name
#权限信息,这里定义的权限的名字,后面是描述信息,描述信息是在django admin中显示权限用的
permissions = (
('views_svns_list', '查看svn版本库信息表'),
('views_onlinecode_info', '查看推送代码详细信息表'),
('views_assets_info', '查看资产详细信息表'),
)

2:定义权限文件

[root@localhost app01]# cat permission.py
#!/usr/bin/env python
#_*_coding:utf-8_*_
from django.shortcuts import render
from app01 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
url_args_list = []
#将各个参数的值用逗号隔开组成字符串,因为数据库中是这样存的
for i in url_args:
url_args_list.append(str(url_args[i]))
url_args_list = ','.join(url_args_list)
#操作数据库
get_perm = models.Permission.objects.filter(Q(url=url_name) and Q(per_method=url_method) and Q(argument_list=url_args_list))
if get_perm:
for i in get_perm:
perm_name = i.name
perm_str = 'app01.%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

3:定义views.py

from app01.permission import  check_permission

@login_required(login_url='/login/')
@check_permission
def svnupdate(request,svn_id,u_type):
pass

20170426
添加权限控制,具体使用方式登录admin,然后在权限表里操作。
权限名称 就是models中定义的权限
URL名称 就是具体访问的某个url 就是在urls.py里的name字段
以上两个字段必须和models中和url中的一致。
添加这个为拒绝的权限,如果普通用户需要访问,需要单独对普通用户授权。
点击admin 的User选项,具体的赋权操作

以上权限控制对应的是单个页面的,根据自己业务的不同,发布系统需要按项目实现对用户的控制,比如:A项目user1有发布的权限。B项目user2 有发布的权限,user3 有AB两个项目的所有权限。这样上面的权限管理就无法满足需求。于是参照上面的例子,自己改了改。大致的方式就是 加一个表存储 用户和发布项目的对应关系,然后在比较request.user.username和数据库里的这个表,如果存在,就返回True,然后获取项目id,比较这个用户在数据库里的的项目是否存在。

代码为:

models.py  并没有用多对多的关系,当时选择多对多的关系好多问题,于是干脆搞成这样了

 class svn_permission(models.Model):
permission_info = models.CharField(max_length=100,blank=True,null=True)
web_users = models.CharField(max_length=100)
svn_projects = models.TextField() def __unicode__(self):
return self.permission_info
class Meta:
verbose_name = 'SVN权限表'
verbose_name_plural = verbose_name class online_permission(models.Model):
permission_info = models.CharField(max_length=100,blank=True,null=True)
web_users = models.CharField(max_length=100)
src_dir = models.TextField() def __unicode__(self):
return self.permission_info
class Meta:
verbose_name = '上线代码权限表'
verbose_name_plural = verbose_name

权限py文件

cat svnprojectpermission.py

#!/usr/bin/env python
#_*_ coding:utf-8_*_ from django.shortcuts import render
from app01 import models
from django.db.models import Q
from django.core.urlresolvers import resolve def perm_svnproject_check(request,**kwargs):
url_obj = resolve(request.path_info)
print("urlobj",url_obj)
print"webusername",request.user.username
url_name = url_obj.url_name
print "---->urlname:",url_name
kw = url_obj.kwargs
print("kwargs",kw) for k,v in kw.items():
if k=='svn_id':
print'v',v
adf = str(models.svns.objects.get(id=v))
print("web submit svnproject",adf)
all_list = []
sql_infos = models.svn_permission.objects.all()
for info in sql_infos:
users = info.web_users
all_list.append(users)
svn_pro = str(info.svn_projects).split(',')
all_list.append(svn_pro)
print("user,svn_pro",users,svn_pro)
print("all_list",all_list)
webuser = str(request.user.username)
if webuser in all_list:
num = all_list.index(webuser)
print"user success"
print("num",num)
webdir = str(adf)
if adf in all_list[num+1]:
print("--success--")
return True
else:
print("fail")
return False
else:
print("---no include user---fail--- ")
return False def check_svnproject_permission(fun):
def wapper(request, *args, **kwargs):
if perm_svnproject_check(request, **kwargs):
return fun(request, *args, **kwargs)
return render(request, 'forbiden.html', locals())
return wapper

具体的方式参考发布系统里的代码

django的自定义权限的更多相关文章

  1. Django之自定义权限

    官方解释 Custom permissions¶ To create custom permissions for a given model object, use the permissions  ...

  2. django 增加自定义权限的一个博客,讲的很详细

    来自  https://www.cnblogs.com/huangxm/p/5770735.html

  3. Django(63)drf权限源码分析与自定义权限

    前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...

  4. django rest framework权限和认证

    Django rest framework之权限 一.Authentication用户认证配置 1.四种验证及官网描述: BasicAuthentication 此身份验证方案使用HTTP基本身份验证 ...

  5. django自带权限机制

    1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是 ...

  6. Django REST framework - 权限和限制

    目录 Django REST framework 权限和限制 (你能干什么) 设置权限的方法 案例 第一步: 定义一个权限类 第二步: 使用 视图级别 全局级别设置 --- 限制 (你一分钟能干多少次 ...

  7. django 用户与权限管理

    django中使用content_type表进行存储app与model的关系.在permission表中设立了name(权限的名字,中英文均可)content_type_id(与content_typ ...

  8. Django REST framework —— 权限组件源码分析

    在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 class ShoppingCarView(ViewSetMix ...

  9. DRF认证、自定义认证和权限、自定义权限

    源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...

随机推荐

  1. Ubuntu18.04 一次性升级Python所有库

    pip是什么 pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 升级pip版本 默认Ubuntu自带的pip (pip 9.0.1)是基于Pytho ...

  2. 【Linux】---Linux系统下各种常用命令总结

    在Linux系统下,“万物皆文件”,之所以强调在强调这个概念,是因为很多人已经习惯了win系统下找找点点得那种方式和思维,因此总是会觉得linux系统下很多指令既复杂又难记.其实都是一样得东西,只是w ...

  3. javascript DOM练习

    一.定时器 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...

  4. VSCODE更改文件时,提示EACCES permission denied的解决办法(mac电脑系统)

    permission denied:权限问题 具体解决办法: 1.在项目文件夹右键-显示简介-点击右下角解锁 2.权限全部设置为读与写 3.最关键一步:点击"应用到包含的项目",这 ...

  5. Web容器、Servlet容器、Spring容器、SpringMVC容器之间的关系

    以下内容为个人理解,如有误还请留言指出,不胜感激! Web容器 web容器(web服务器)主要有:Apache.IIS.Tomcat.Jetty.JBoss.webLogic等,而Tomcat.Jet ...

  6. 第一章001-003课程介绍、计算机网络概述、Internet概述

    计算机网络概述 课程安排: 第一章:概述 第二章:物理层 第三章:数据链路层 第四章:网络层 第五章:运输层 第六章:应用层 第七章:网络安全 第八章:因特网上的音频/视频服务 第九章:无线网络 第十 ...

  7. Docker底层架构之控制组

    概述 控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离.限制.审计 等. 只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争. 控制组技术最早 ...

  8. AcWing 785.快速排序

    AcWing 785.快速排序题解 题目描述 给定你一个长度为n的整数数列. 请你使用快速排序对这个数列按照从小到大进行排序. 并将排好序的数列按顺序输出. 输入格式 输入共两行,第一行包含整数 n. ...

  9. LeetCode 380. Insert Delete GetRandom O(1) 常数时间插入、删除和获取随机元素(C++/Java)

    题目: Design a data structure that supports all following operations in averageO(1) time. insert(val): ...

  10. Python多重继承之菱形继承

    继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能.在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance ). 语法 ...