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

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

如下

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. vue的param和query两种传参方式及URL的显示

    路由配置: // 首页 { path: '/home', name:'home', component:Home }, // 行情 { path: '/markets', name:'market', ...

  2. 头条面试竟然问我maven

    maven package和maven install 有什么区别? 你常用的maven命令有哪些? <dependencyManagement> 是干什么的? 还有用过其它构建工具吗? ...

  3. cogs 1001. [WZOI2011 S3] 消息传递 Tarjan

    1001. [WZOI2011 S3] 消息传递 ★★   输入文件:messagew.in   输出文件:messagew.out   简单对比时间限制:1 s   内存限制:128 MB Prob ...

  4. Eclipse常用快捷键【转】

    Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键.1. [ALT+/]此快捷键为用户编辑的好帮手,能为用户提供内容的 ...

  5. electron教程(番外篇二): 使用TypeScript版本的electron, VSCode调试TypeScript, TS版本的ESLint

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...

  6. 头条一面竟然问我Maven?

    maven package和maven install 有什么区别? 你常用的maven命令有哪些? <dependencyManagement> 是干什么的? 还有用过其它构建工具吗? ...

  7. python类型-字典

    字典是python语言中唯一的映射类型,映射对象里哈希值(键,key)和指向的对象(值,value)是一对多的关系.一个字典对象是可变的,是一个容器类型,可存储任意个数的python对象,其中也可以包 ...

  8. 网络io模型总结

    操作系统基本概念 首先来来说下操作系统,嗯,操作系统是计算机硬件的管理软件,是对计算机硬件的抽象,操作系统将应用程序分为用户态和内核态,例如驱动程序就位于内核态,而我们写的一般程序都是用户态,包括we ...

  9. [ Python入门教程 ] Python中日期时间datetime模块使用实例

    Python中datetime模块提供强大易用的日期处理功能,用于记录程序操作或修改时间.时间计算.日志时间显示等功能.datatime模块重新封装了time模块,提供的类包括date.time.da ...

  10. [集训]Trominoes,钩子公式运用

    题意 用这四种骨牌密铺n*m的正方形矩阵,可以不选,求方案数.n*m<=1E8.多组询问. 思考 用如上的表达难以进行计算,尝试转化为一种新的组合解释. 若从右上角开始填起,我们强制要求里面的轮 ...