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

     

  • 相关阅读:
    通过使用精简客户端,且不需要安装的客户端,配合PLSQL连接oracle数据库
    JDBC连接
    多线程TCP的socket通信
    基于UDP协议的socket通信
    基于TCP协议的socket通信
    设计模式之单例模式
    设计模式之代理模式
    设计模式之策略模式
    >hibernate-session中的方法
    >hibernate的四种状态
  • 原文地址:https://www.cnblogs.com/dufeixiang/p/10273310.html
Copyright © 2011-2022 走看看