zoukankan      html  css  js  c++  java
  • CRM【第一篇】rbac组件应用之主机管理系统【auto_luffy.zip】

    源码示例下载rbac组件应用之主机管理系统【auto_luffy.zip】

    
    RBAC组件的使用文档
    
    1.将rbac组件拷贝到项目
    2.将rbac/migrations目录下的数据库的迁移记录删除(除了__init__.py)
    3.业务系统中用户表结构的设计
        业务表结构中的用户表需要和rbac中的用户表有继承关系。如:
         - rbac中的models.py
           
                class Userinfo(models.Model):
                    name = models.CharField(verbose_name='用户名',max_length=32)
                    password = models.CharField(verbose_name='密码',max_length=64)
                    email = models.CharField(verbose_name='邮箱',max_length=32)
                    roles = models.ManyToManyField(verbose_name='拥有的所有角色',to='Role',blank=True)
                
                    def __str__(self):
                        return self.name
                
                    class Meta:
                        #加上abstract=True,django以后再做数据库迁移就不会为UserInfo类创建相关的表以及表结构了
                        #注意:此类可以当做父类,可以被继承(可以把字段加到继承他的类中)
                        abstract=True
           
           
           - 业务中的models.py
           
                class UserInfo(RbacUserInfo): #继承了RbacUserInfo中的字段
                    user = models.OneToOneField(to=RbacUserInfo,verbose_name='用户',on_delete=models.CASCADE)
                    phone = models.CharField(verbose_name='联系方式',max_length=32)
                
                    level_choices=(
                        (1,'T1'),
                        (2,'T2'),
                        (3,'T3'),
                    )
                    level = models.IntegerField(verbose_name='级别',choices=level_choices)
                    depart= models.ForeignKey(verbose_name='部门',to='Department',on_delete=models.CASCADE)
                
                    def __str__(self):
                        return self.user.name
        
    4.将业务系统中的用户表的路径写到配置文件中
     --settings.py中
        RBAC_USER_MODEL_CLASS = 'app01.models.UserInfo' #业务中的用户表
    用于在rbac分配权限时,读取业务表中的用户信息
    
    5.业务逻辑开发
        - 将所有的路由都设置一个name,如:
            urlpatterns = [
            re_path('^admin/$', admin.site.urls),
            re_path(r'^login/$', account.login,name='login'),
            re_path(r'^logout/$', account.logout,name='logout'),
            re_path(r'^index/$', account.index,name='index'),
            #用户相关功能
            re_path(r'^user/list/$', user.user_list,name='user_list'),
            re_path(r'^user/add/$', user.user_add, name='user_add'),
            re_path(r'^user/edit/(?P<edit_id>d+)/$', user.user_edit, name='user_edit'),
            re_path(r'^user/del/(?P<del_id>d+)/$', user.user_del, name='user_del'),
            re_path(r'^user/reset_pwd/(?P<reset_id>d+)/$', user.user_reset_pwd, name='user_reset_pwd'),
            #主机功能
            re_path(r'^host/list/$', host.host_list, name='host_list'),
            re_path(r'^host/add/$', host.host_add, name='host_add'),
            re_path(r'^host/edit/(?P<edit_id>d+)/$', host.host_edit, name='host_edit'),
            re_path(r'^host/del/(?P<del_id>d+)/$', host.host_del, name='host_del'),
            
             re_path(r'^rbac/', include(('rbac.urls', 'rbac'), namespace='rbac')),
        ]
        用于反向生成url,以及粒度控制到按钮
        
    6.权限信息的录入
        -url 中添加rbac的路由分发,注意必须写namespace
            urlpatterns = [
                re_path(r'^rbac/', include(('rbac.urls', 'rbac'), namespace='rbac')),
            ]
        - rbac提供的地址进行操作配置
            - http://127.0.0.1:8000/rbac/menu/list/ 菜单列表
            - http://127.0.0.1:8000/rbac/role/list/ 角色列表
            - http://127.0.0.1:8000/rbac/distribute/permissions/ 权限分配
        相关配置:
            #批量操作中,自动发现url,应该排除的url
            AUTO_DISCOVER_EXCLUDE = [
                '/admin/.*',
                '/login/',
                '/logout/',
                '/index/',
            ]
    7.编写用户登录的逻辑 (权限的初始化==>>init_permission(request,user_obj))
         def login(request):
            if request.method == 'GET':
                return render(request,'login.html')
        
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            print(user,pwd)
            user_obj = models.UserInfo.objects.filter(name=user,password=pwd).first()
            if not user_obj:
                return render(request,'login.html',{'error':'用户名或密码错误'})
        
            init_permission(request,user_obj)
        
            return redirect('/index/')
    
        相关的配置:权限和菜单的seeion key:
            - settings.py
                PERMISSION_SESSION_KEY = 'luffy_permissions_url_list'
                MENU_SESSION_KEY = 'luffy_menu_list'
    8.编写一个首页的逻辑
        def index(request):
            return  render(request,'index.html')    
        
        相关的配置:
            #无需校验,但需登录成功后的
            NO_PERMISSIONS_LIST=[
                '/logout/',
                '/index/',
            ]
    
    9.权限的校验(中间件)
            MIDDLEWARE = [
            'django.middleware.security.SecurityMiddleware',
            'django.contrib.sessions.middleware.SessionMiddleware',
            'django.middleware.common.CommonMiddleware',
            'django.middleware.csrf.CsrfViewMiddleware',
            'django.contrib.auth.middleware.AuthenticationMiddleware',
            'django.contrib.messages.middleware.MessageMiddleware',
            'django.middleware.clickjacking.XFrameOptionsMiddleware',
            'rbac.middleware.rbac.RbacMiddleware',
            ]
            
            #白名单
            WHITE_LIST = [
                '/login/',
                '/admin/.*',
            ]
    
    10.粒度到按钮级别的控制 
        {% load rbac %}
        {% if request|has_permission:'host_add' %}
            ...
        {% endif %}
    
    ***总结***:目的时希望在任意系统中应用权限系统。
        - 用户登录+用户首页+用户注销+业务逻辑
        - 项目业务逻辑开发
            注意:开发时要灵活运用laout.html中的两个inclusion.tag
                <div class="pg-body">
                    <div class="left-menu">
                        <div class="menu-body">
                            {% multi_menu request %} #开发时去掉,上线时取回
                
                        </div>
                    </div>
                    <div class="right-body">
                        {% nav_menu request %} #开发时去掉,上线时取回
                        {% block content %} {% endblock %}
                    </div>
                </div>
                
        - 权限信息的录入
        - 配置文件 
            #注册app
            INSTALLED_APPS = [
                ...
                'app01.apps.App01Config',
                'rbac.apps.RbacConfig',
            ]
            #应用中间件
            MIDDLEWARE = [
                ...
                'rbac.middleware.rbac.RbacMiddleware',
            ]
            RBAC_USER_MODEL_CLASS = 'app01.models.UserInfo' #业务中的用户表
    
            #白名单
            WHITE_LIST = [
                '/login/',
                '/admin/.*',
            ]
            
            #无需校验,但需登录成功后的
            NO_PERMISSIONS_LIST=[
                '/logout/',
                '/index/',
            ]
            #登录成功后,权限初始化SESSION_KEY
            PERMISSION_SESSION_KEY = 'luffy_permissions_url_list'
            MENU_SESSION_KEY = 'luffy_menu_list'
            
            ####################自动找到所有url功能(白名单)####################
            #自动发现url,应该排除的url
            AUTO_DISCOVER_EXCLUDE = [
                '/admin/.*',
                '/login/',
                '/logout/',
                '/index/',
            ]
            #粒度到按钮的控制
    
    
    
    
  • 相关阅读:
    JS进阶篇2---函数防抖(debounce)
    vue 的"响应式"是什么意思/ Object.freeze( ) 阻止数据响应
    try{...}catch(){...}语句的使用
    总结一下ES6的promise
    《ES6标准入门》(六)之Promise对象2——then()和catch()方法
    大白话讲解Promise(一)
    解决VSCode单击文件会替换已经打开文件的问题
    通俗理解“回调函数”
    vue中的时间格式处理
    vue之项目踩坑笔记
  • 原文地址:https://www.cnblogs.com/hanfe1/p/12395170.html
Copyright © 2011-2022 走看看