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