权限系统

什么是权限?
    同一套系统不同的用户可以有不同的权限
为什么需要权限?
    不用岗位的人能做的事情不一样的
如何实现权限控制?
    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
代码

 

posted @ 2018-11-26 20:17  .why  阅读(277)  评论(0)    收藏  举报
Live2D