用户后台权限控制
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':'验证码不正确'})