zoukankan      html  css  js  c++  java
  • Django【进阶】权限管理

    一、权限
    RBAC:role basic access control
     
    1、什么是权限:
    一个权限就是一个url,不同个权限对应不同的url,拥有权限即可以访问这个url。
     
    2、权限划分:
    如果以每个人来划分权限,分配的时候回非常麻烦,特别是权限和人都非常多的时候
    以角色来划分权限
     
    二、做一个简单权限管理系统

    创建数据模型
     
     
    ############# 重点:我们做一个用于权限管理的app,可移植到其他项目 ###############
     
    添加app,rbac是除了app01另外创建的应用,专用于权限管理,后面可以移植到其他项目
    python manage.py startapp rbac
    

     

    然后在settings的INSTALLED_APPS配置中加入‘rbac'
     
     
    将表注册到admin,当然是’rbac'的admin中
     
    创建管理员python manage.py createsuperuser
     
     
    admin后台添加菜单,以及其他数据
    127.0.0.1:8000/admin
     
    urls
     
    views(app01/views,调用rbac应用来实现权限功能)
     
     
    ##################### 这里给rbac写一个配套的初始化权限的服务 ###################
     
    写一个专门用于获取用户权限的初始化服务
    from django.conf import settings
    from .. import models
    
    def init_permission(request,user_obj):
        """
        初始化用户权限
        :param request: 
        :param user_obj: 
        :return: 
        """
    
        # distinct()去掉重复,values可以取roles对应的多对多的表的字段
        permission_item_list = user_obj.roles.values('permissions__title','permissions__url',
                                                     'permissions__menu_id').distinct()
    
        # 保存当前用户有权访问的URL
        permission_url_list = []
    
        # 保存当前用户有权访问的URL且需要在菜单上显示
        permission_menu_list = []
    
        for item in permission_item_list:
            """
            循环这个query_set集合,取需要的数据
            """
            permission_url_list.append(item['permissions__url'])
    
            if item['permissions__menu_id']:
                temp = {'title':item['permissions__title'],'url':item['permissions__url'],
                        'menu_id':item['permissions__menu_id']}
                permission_menu_list.append(temp)
    
        # 所有菜单
        menu_lsit = list(models.Menu.objects.values('caption','parent_id'))
    
        request.session[settings.SESSION_PERMISSION_URL_KEY] = permission_url_list
        request.session[settings.SESSION_PERMISSION_MENU_URL_KEY] = {
            settings.PERMISSION_URL_KEY:permission_menu_list,
            settings.ALL_MENU_KEY: menu_lsit, }
    

      

     
     
    ################ 为了写入session方便,我们在settings配置session键 ########################
    #########################################################
                        # rbac 权限相关配置 #
    #########################################################
    
    # 保存用户权限的session key
    SESSION_PERMISSION_URL_KEY = "sanhdfiuhasakdjflkajsf"
    SESSION_PERMISSION_MENU_URL_KEY = "sjdiuwekljdsksdfjlskdsd"
    ALL_MENU_KEY = "k1"
    PERMISSION_URL_KEY = "k2"
    

      

     
     
    中间件应用
    对请求进行判断,无权限直接退出,登录页面除外
    作业以上
  • 相关阅读:
    Kettle 实现mysql数据库不同表之间数据同步——实验过程
    Kettle ETL 来进行mysql 数据同步——试验环境搭建(表中无索引,无约束,无外键连接的情况)
    并查集知识总结
    c# 线程同步问题(about volatile)
    c# 线程的等待(堵塞)
    net中多线程返回值
    c# 中的 lock monitor mutex Semaphore 的比较
    c#两种同步结构
    links-some-blog
    T-SQL中的APPLY用法
  • 原文地址:https://www.cnblogs.com/lucaq/p/7575585.html
Copyright © 2011-2022 走看看