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/',
            ]
            #粒度到按钮的控制
    
    
    
    
  • 相关阅读:
    document.getElementById("mytxt").style.left=""style.left在IE的FF中注意
    asp.net 用户控件中 使用相对路径的解决方法 图片路径问题(用户控件、图片路径) ,ResolveUrl
    探索 Block (一) (手把手讲解Block 底层实现原理)
    iOS 多线程开发 (概念与API简介)
    iOS 性能小点
    iOS runtime (二)(runtime学习之AutoCoding源码分析)
    探索 NSRunLoop (二)(NSRunLoop 自己动手实现SimpleRunLoop)
    iOS NSNotificationCenter (自己实现一个通知中心XMCNotificationCenter)
    iOS runtime (三)(runtime学习之YYModel源码分析)
    iOS runtime(一)(runtime 分析理解)
  • 原文地址:https://www.cnblogs.com/hanfe1/p/12395170.html
Copyright © 2011-2022 走看看