用户后台权限控制

1、每个用户未登录的时候,限制用户查看的版块(页面)

在django中可以直接在中间件中过滤,这样就不必在每个views.py 的函数里都加一个装饰器。 在用户未登录时候直接限制未登录用户的权限 :

中间件代码示例:  #与Project下创建一个middleware目录,直接创建一个middleware.py :

class M1(MiddlewareMixin):
    def process_request(self,request,*args,**kwargs):

        valid=['login/','index'] #未登录用户只能输入这两个URL

        models.User.objects.filter(username=request.session.get('username'))

        if request.path_info not in valid:

            action=request.GET.get('md')

            user_permission_dict=request.session.get('user_permission_dict')

            if not user_permission_dict:

                return HttpResponse('无权限')

            flag=False

            for k,v in user_permission_dict.items():

                if re.match(k,request.path_info):
                    if action in v:

                        flag=True
                        break

            if not flag:
                return HttpResponse('无权限')

views.py 登录成功后用户权限设置:

def login(request):
    """
    用户登录,登录完成后将这个用户的session 传给index
    :param session:用户的登录名,用于查询发布的文章
    :return:
    """
    print('request loai')
    if request.method == 'GET':
        obj = LoginForm()

        return render(request, 'login.html', {'obj': obj})

    else:
        session_code = request.session.get('code')

        input_code = request.POST.get('check_code')

        obj = LoginForm(request.POST)

        if input_code.upper() == session_code.upper():

            # print(obj.errors, obj.cleaned_data)

            print(obj.is_valid())

            print('check exec')

            if obj.is_valid():
                print('hello databases')

                user_result = models.UserInfo.objects.filter(**obj.cleaned_data)
                if user_result:
                    print('user_result true')

                    request.session['username']=obj.cleaned_data.get('username')

                    # 后台管理权限设置 -------------------------------------------------------------------------
                    user_obj=usermanager.User.objects.filter(username=obj.cleaned_data.get('username')).first()

                    # print(user_obj.id)

                    role_obj=usermanager.Role.objects.filter(users__user_id=user_obj.id).values('id')
                    print(role_obj)
                    # x = usermanager.User2Role.objects.filter(user__id=user_obj.id) #
                    # x拿到的是<QuerySet [<User2Role: tony-市场部>, <User2Role: tony-售后>]>
                    # role_obj <QuerySet [<Role: 市场部>, <Role: 售后>]>

                    #经过上两个步骤 这个时候可以拿到这个用户的 权限-操作-角色 三个表关联对对象,通过这个对象可以拿到这个用户可以有什么权限、有什么
                    # permission_list=usermanager.Permission2Action2Role.objects.filter(role_id__in=role_obj.id).annotate(ct=Count('id'))
                    # print(permission_list)

                    permission_list=usermanager.Permission2Action2Role.objects.filter(role_id__in=role_obj).annotate(ct=Count('id')).values('role_id','permission_id','permission__url','action__code').distinct()
                    # print(permission_list)
                    # {'permission_id': 1, 'role_id': 1, 'permission__url': '/user.html', 'action__code': 'post'}
# {'permission_id': 3, 'role_id': 4, 'permission__url': '/blogs.html', 'action__code': 'post'}
                    user_permission_dict={}

                    for k in permission_list:
                        user_permission_dict[k['permission__url']]=[k['action__code']]
                    print(user_permission_dict)
                    request.session['user_permission_dict']=user_permission_dict
                    # 后台管理权限设置 -------------------------------------------------------------------------

                    return index(request)
                else:
                    return render(request, 'login.html', {'obj': obj, 'msg': '用户名或密码错误'})
            else:
                return render(request, 'login.html', {'obj': obj})
        else:
            print('i"exc ')
            return render(request,'login.html', {'obj': obj,'checkcode':'验证码不正确'})

 

posted @ 2017-07-20 20:04  tonycloud  阅读(965)  评论(0)    收藏  举报