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/',
        ]
        #粒度到按钮的控制



posted @ 2020-03-02 13:25  hanfe1  阅读(242)  评论(0编辑  收藏  举报