zoukankan      html  css  js  c++  java
  • django通用权限控制框架

    在web项目中根据不同的用户肯定会限制其不同的权限,利用以下模块可以满足日常几乎所有的权限控制

    permission_hook.py  # 自定义权限控制,必须返回True/false  ,True表示允许,false 拒绝

    permission_list.py     #根据url,访问方法及参数控制用户权限

    permissions.py          #先判断用户是否拥有permission_list.py中的权限,如果验证通过最后验证用户自定义权限。

    实例:

    permission_hook.p:

    def check_self_user(request):
        '''
        用户只能筛选自己的客户
    
        '''
        if request.GET.get('consultant') == str(request.user.id):
            return True
        if request.GET.get('consultant'):
            print('禁止查看非自己的客户')
            return False
    
        return True
    View Code

    permission_list.py     #根据url,访问方法及参数控制用户权限

    from kingadmin import permission_hook
    permission_dict={
    
        'crm_table_obj_list':['table_obj_list','GET',[],{},permission_hook.check_self_user],
        'crm_table_obj_view':['table_obj_change','GET',[],{}],
        'crm_table_obj_change':['table_obj_change','POST',[],{}]
    }
    View Code

    permissions.py

    from django.core.urlresolvers import resolve
    from kingadmin.permission_list import permission_dict
    from django.shortcuts import redirect,render,HttpResponse
    from django.utils.safestring import mark_safe
    
    def check_permission(*args,**kwargs):
        request=args[0]
        request_url=resolve(request.path).url_name
        match_key=None
        args_check=None
        kwarg_check=None
        if request.user.is_authenticated() is False:
            return redirect('/login/')
    
        for permission_key,val in permission_dict.items():
            print('执行args 权限检查-------------')
            per_url=val[0]
            per_method=val[1]
            per_args=val[2]
            per_kwargs=val[3]
            per_hook_func=val[4] if len(permission_dict[permission_key]) > 4 else None
    
            if request_url == per_url:
                if request.method == per_method:
                    args_check=False
                    for arg in per_args:
                        request_func=getattr(request,per_method)
                        if request_func.get(arg,None):
                            args_check=True
                            print('存在arg参数')
                        else:
                            print('不存在指定arg参数')
                            args_check=False
                            break
                    else:
                        print('未作权限限制,,默认通过')
                        args_check=True
                    kwarg_check=False
    
                    for arg_name,arg_val in per_kwargs.items():
                        print('执行 kwargs 权限检查-------------')
                        request_func=getattr(request,per_method)
                        if request_func.get(arg_name) == str(arg_val):
                            kwarg_check=True
                        else:
                            kwarg_check=False
                            break
                    else:
                        kwarg_check=True
                        print('未作 kwargs 限制,默认通过')
    
                    per_func=False
                    print('执行用户自定义钩子函数')
                    if per_hook_func:
                        per_func=per_hook_func(request)
                    else:
                        per_func=True
    
                    per_res=[args_check,kwarg_check,per_func]
                    if all(per_res):
                        match_key=permission_key
                        print('权限匹配结果:',per_res)
                        break
    
        if all(per_res):
            appname,*per_name=match_key.split('_')
            per_obj='%s.%s'%(appname,match_key)
    
            if request.user.has_perm(per_obj):
                print('所有权限检查通过')
                return True
            else:
                print('权限检查未通过')
                return False
        else:
            print('未匹配到权限')
            return False
    
    
    
    
    def check_per(func):
        def inner(*args,**kwargs):
            if not check_permission(*args,**kwargs):
                return HttpResponse(mark_safe('<h1>403 你没有相应的权限</h1>'))
            else:
    
                return func(*args,**kwargs)
        return inner
    View Code

    最后只需在views中将要使用权限控制功能的地方加上装饰器即可:

    from kingadmin.permissions import check_per
    
    @check_per
    def table_obj_change(request):
        pass
    View Code

     

  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/dufeixiang/p/10273310.html
Copyright © 2011-2022 走看看