权限系统
什么是权限? 同一套系统不同的用户可以有不同的权限 为什么需要权限? 不用岗位的人能做的事情不一样的 如何实现权限控制? RBAC:基于角色的权限访问控制(Role-Based Access Control) RBAC:基于角色的权限访问控制,在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。RBAC支持三个著名的安全原则:最小权限原则,责任分离原则和数据抽象原则。
步骤 1. 建表 录入信息 安装xlrd模块,专门用来操作excel文件(python操作excel文件的模块) 2. 如何在Django项目实现权限控制 访问某个URL的时候,要判断这个URL在不在我的权限列表里面 在中间件的process_request方法中对请求做权限判断 先拿到访问的URL --> request.path_info 获取当前用户的权限有哪些 必须登录 --> 登录之后才能拿到用户,有了用户才能查询该用户的权限有哪些 把当前登录的用户的权限信息保存到session数据中 每次请求来 从当前请求的session数据中拿到该用户的权限信息 中间件中判断是否有权限 不能简单的用in操作 给权限判断设置白名单
# 中间件 from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse from django.conf import settings import re class RBACMiddleware(MiddlewareMixin): def process_request(self, request): # 1. 获取当前请求的URL current_url = request.path_info # 2. 判断当前访问的URL在不在白名单中 for url in getattr(settings, 'WHITE_URLS', []): if re.match(r'^{}$'.format(url), current_url): # 如果是白名单的URL直接放行 return # 判断当前这次请求的URL在不在权限列表里面 # 3. 当前登陆的这个人他的权限列表是什么 key = getattr(settings, 'PERMISSION_SESSION_KEY', 'permission_list') permission_list = request.session.get(key, []) print(current_url, permission_list) print('*' * 120) # 4. 因为Django URL存在模糊匹配,所以校验权限的时候也要用正则去匹配 for pattern in permission_list: if re.match('^{}$'.format(pattern), current_url): # 有权限 return None else: return HttpResponse('没有权限') ####### 写完中间件要注册 # view from django.shortcuts import render, redirect, HttpResponse from rbac.models import UserInfo from django.conf import settings # Create your views here. def login(request): error_msg = '' if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('password') user_obj = UserInfo.objects.filter(username=username, password=pwd).first() if user_obj: # 登陆成功 # 1. 将当前登录用户的权限信息查询出来 # user_obj.roles.all() # QuerySet permission_queryset = user_obj.roles.all().filter(permissions__isnull=False).values_list('permissions__url') print(permission_queryset) print('-' * 120) permission_list = [i[0] for i in permission_queryset] print(permission_list) # 2. 将权限信息保存到session数据中 key = getattr(settings, 'PERMISSION_SESSION_KEY', 'permission_list') request.session[key] = permission_list return redirect('/customer/list/') else: error_msg = '用户名或密码错误' return render(request, 'login.html', {'error_msg': error_msg}) def logout(request): request.session.flush() return redirect('/login/') # models(建的表) from django.db import models # Create your models here. # 权限表 class Permission(models.Model): title = models.CharField(max_length=32) url = models.CharField(max_length=32) def __str__(self): return self.title class Meta: verbose_name = '权限' verbose_name_plural = verbose_name # 用户表 class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) roles = models.ManyToManyField(to='Role') class Meta: verbose_name = '用户' verbose_name_plural = verbose_name def __str__(self): return self.username # 角色表 class Role(models.Model): title = models.CharField(max_length=32) permissions = models.ManyToManyField(to='Permission', null=True, blank=True) class Meta: verbose_name = '角色' verbose_name_plural = verbose_name def __str__(self): return self.title
清风深知杨柳意,啤酒龙虾难相聚。

浙公网安备 33010602011771号