• 权限管理


    https://www.cnblogs.com/alex3714/articles/5535652.html

    想对一个功能实现权限控制,要做到只能过在views方法上加一个装饰器就行了,比如:

    @check_permission
    @login_required
    def customer_detail(request,customer_id):
        customer_obj = models.Customer.objects.get(id=customer_id)
        customer_form = forms.CustomerDetailForm(instance=customer_obj)
     
        if request.method == 'POST':
            customer_form = forms.CustomerDetailForm(request.POST,instance=customer_obj)
            if customer_form.is_valid():
                customer_form.save()
                parent_base_url = '/'.join(request.path.split('/')[:-2])
                print("url:",parent_base_url )
                return  redirect(parent_base_url)
            else:
                print(customer_form.errors)
        return  render(request,'crm/customer_detail.html',{'customer_form':customer_form})
    
    
    # 50行实现细粒度的权限控制
    #_*_coding:utf-8_*_
    __author__ = 'Alex Li'
    from django.core.urlresolvers import resolve  # resolve 可将实际url对应到设置的别名
    from django.shortcuts import render,redirect
    
    perm_dic = {    # 定义权限字典
        'view_customer_list': ['customer_list','GET',[]],  # [url别名,GET|POST , 参数]
        'view_customer_info': ['customer_detail','GET',[]],
        'edit_own_customer_info': ['customer_detail','POST',['test']],
    }
    
    def perm_check(*args,**kwargs):
        request = args[0]
        url_resovle_obj = resolve(request.path_info)
        current_url_namespace = url_resovle_obj.url_name  # 获取url别名(namespace)
        #app_name = url_resovle_obj.app_name #use this name later
        print("url namespace:",current_url_namespace)
        matched_flag = False # find matched perm item  # 初始标志为false
        matched_perm_key = None  
        if current_url_namespace is not None:#if didn't set the url namespace, permission doesn't work
            print("find perm...")
            for perm_key in perm_dic:
                perm_val = perm_dic[perm_key]
                if len(perm_val) == 3:#otherwise invalid perm data format
                    url_namespace,request_method,request_args = perm_val
                    print(url_namespace,current_url_namespace)
                    if url_namespace == current_url_namespace: #matched the url
                        if request.method == request_method:#matched request method
                            if not request_args:#if empty , pass
                                matched_flag = True
                                matched_perm_key = perm_key
                                print('mtched...')
                                break #no need looking for  other perms
                            else:
                                for request_arg in request_args: #might has many args
                                    request_method_func = getattr(request,request_method) #get or post mostly
                                    #print("----->>>",request_method_func.get(request_arg))
                                    if request_method_func.get(request_arg) is not None:
                                        matched_flag = True # the arg in set in perm item must be provided in request data
                                    else:
                                        matched_flag = False
                                        print("request arg [%s] not matched" % request_arg)
                                        break #no need go further
                                if matched_flag == True: # means passed permission check ,no need check others
                                    print("--passed permission check--")
                                    matched_perm_key = perm_key
                                    break
    
        else:#permission doesn't work
            return True
    
        if matched_flag == True:
            #pass permission check
            perm_str = "crm.%s" %(matched_perm_key)
            if request.user.has_perm(perm_str):
                print("33[42;1m--------passed permission check----33[0m")
                return True
            else:
                print("33[41;1m ----- no permission ----33[0m")
                print(request.user,perm_str)
                return False
        else:
            print("33[41;1m ----- no matched permission  ----33[0m")
    


    def check_permission(func):    # 检查权限的装饰器 def wrapper(*args,**kwargs): print("---start check perms",args[0]) if not perm_check(*args,**kwargs): return render(args[0],'crm/403.html')  # args[0],对应的就是request return func(*args,**kwargs) #print("---done check perms") return wrapper
  • 相关阅读:
    使用element-ui是下拉筛选选择
    vue 组件传值
    vue element 地址联动的使用
    vux scroller
    实时监听组件中路由的变化
    vuex的使用
    对移动端滚动高度的获取
    【转】ACM 取石子问题
    【转】ACM博弈知识汇总
    EOJ 2857 编辑距离
  • 原文地址:https://www.cnblogs.com/dangrui0725/p/9657424.html
Copyright © 2020-2023  润新知