zoukankan      html  css  js  c++  java
  • rbac设计

    1.创建表关系
    2.基于admin录入数据
    3.校验权限(中间件的应用)
     
     
    1.创建表关系
    from django.db import models
     
    # Create your models here.
     
    class User(models.Model):
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        roles = models.ManyToManyField(to='Role')
     
        def __str__(self):
            return self.name
     
    class Role(models.Model):
        title = models.CharField(max_length=32)
        permissions = models.ManyToManyField(to='Permission')
     
        def __str__(self):
            return self.title
     
    class Permission(models.Model):
        title = models.CharField(max_length=32)
        urls = models.CharField(max_length=32)
     
        def __str__(self):
            return self.title
        
    2.基于admin录入数据
    from django.shortcuts import render, HttpResponse
     
    # Create your views here.
    from rbac import models
     
     
    def user(request):
        ret = models.User.objects.all()
     
        return render(request, 'user.html'locals())
     
    import re
    def user_add(request):
        permission_list = request.session['permission_list']  # ['/user/add', '/user/', '/role/', '/user/delete/(\d+)', '/user/edit/(\d+)']
        current_path = request.path_info
     
        flag = False
     
        for permission in permission_list:
            permission = '^{}$'.format(permission)
     
            ret = re.match(permission, current_path)
            if ret:
                flag = True
                break
     
        if not flag:
            return HttpResponse('没有权限')
     
        return HttpResponse('add_user')
     
     
    def role(request):
        return HttpResponse('add_user')
     
    from rbac.service.permission import *
     
    def login(request):
     
        if request.method == 'POST':
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            user = models.User.objects.filter(name=user, password=pwd).first()
            if user:
                # 在session中注册用户id
                request.session['user_id'= user.pk
                initial_session(user, request)
                return HttpResponse('登陆成功')
    # rbac role-based access control
        return render(request, 'login.html')
     
    3.校验权限(中间件的应用)
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse, redirect
    import re
     
     
    class ValidPermission(MiddlewareMixin):
     
        def process_request(self, request):
            current_path = request.path_info
            # 检查是否在白名单
            valid_url_list = ['/login/''/reg/''/admin/.*']
            for valid_url in valid_url_list:
                ret = re.match(valid_url, current_path)
                if ret:
                    return None
     
            # 校验是否登陆
            user_id = request.session.get('user_id')
            if not user_id:
                return redirect('/login/')
     
            # 权限校验
            permission_list = request.session[
                'permission_list']  # ['/user/add', '/user/', '/role/', '/user/delete/(\d+)', '/user/edit/(\d+)']
            current_path = request.path_info
     
            flag = False
            for permission in permission_list:
                permission = '^{}$'.format(permission)
                ret = re.match(permission, current_path)
                if ret:
                    flag = True
                    break
            if not flag:
                return HttpResponse('没有权限')
     
            return None
     
     
     
  • 相关阅读:
    Java 泛型学习四 自动擦除
    Java 泛型学习三 通配符
    ava的动态性支持学习七 方法句柄调用的性能对比
    Java 泛型学习一 泛型概念
    Java中正则Matcher类的matches()、lookAt()和find()的区别
    Java 泛型学习五 泛型擦除带来的不自然
    Java I/O 流的简单介绍及示例
    Java 泛型学习二 泛型的限制
    Java 泛型学习六 泛型类型系统
    字节存储机制:bigedian 和 littleendian
  • 原文地址:https://www.cnblogs.com/changwoo/p/9665614.html
Copyright © 2011-2022 走看看