RBAC权限管理项目 不同用户相对应的角色拥有的权限 和 功能不同
1.RBACDesign.py (python连接数据库工具类)
"""
权限管理系统设计 RBAC
1.后端管理系统
账号密码登陆成功 页面显示
不同用户看到的界面是不同的*可用按钮也是不同的
不同级别会员的可执行的操作也不同
2.重要 ***** 项目主页面 设计理念
不同权限的用户(普通用户*会员)看到的菜单个数和按钮操作是不同的
不同等级的会员(普通会员*超级会员*黄金会员)看到的菜单个数和按钮操作也不同
3.需求描述 :后台管理平台 实现如下功能:
1.输入用户名密码就可以进行登录到主页
2.不同角色用户*普通用户 会员用户*看到的页面和按钮使用不同
3.同一角色的不同级别显示的功能按钮不同
比如*都是客户 vip客户就有批量删除的权利和功能
普通用户没有删除的权力和功能
提示* 核心角色:用户 角色 权限 菜单
注意* 工作中每个项目都需要使用RBAC
"""
import pymysql
class RBACDesign:
def __init__(self,host,port,user,passwd,db,charset="utf8"):
self.host=host
self.port=port
self.user=user
self.passwd=passwd
self.db=db
self.charset=charset
def get_connect(self):
self.conn=pymysql.connect(host=self.host,port=self.port,user=self.user,passwd=self.passwd,db=self.db,charset=self.charset)
self.cur=self.conn.cursor()
def get_close(self):
self.cur.close()
self.conn.close()
def get_execute(self,sql,params):
num=0
self.get_connect()
num=self.cur.execute(sql,params)
return num
def get_one(self,sql,params=()):
result=None
self.get_connect()
self.cur.execute(sql,params)
result=self.cur.fetchone()
return result
def get_all(self,sql,params=()):
result=None
self.get_connect()
self.cur.execute(sql,params)
result=self.cur.fetchall()
return result
2. Modeler.py (模型实体工具类 面向对象的时候实例化对象)
#模型里面包含的菜单
"""
数据模型类也就是菜单类
模型类/实体类:每个模型类和数据库中的表格一一对应
"""
class User:
def __init__(self,u_id,u_name,u_pwd,u_r_id):
self.u_id=u_id
self.u_name=u_name
self.u_pwd=u_pwd
self.u_r_id=u_r_id
class Role:
def __init__(self,r_id,r_name,r_descipe,r_level):
self.r_id=r_id
self.r_name=r_name
self.r_descripe=r_descipe
self.r_level=r_level
class Modules:
def __init__(self,m_id,m_name,m_pid,m_level,m_icon,m_href,m_cengji):
self.m_id=m_id
self.m_name=m_name
self.m_pid=m_pid
self.m_level=m_level
self.m_icon=m_icon
self.m_href=m_href
self.m_cengji=m_cengji
# class R_M:
# def __init__(self,r_id,m_id,quanxian):
# self.r_id=r_id
# self.m_id=m_id
# self.quanxian=quanxian
class R_M():
def __init__(self,r_name,m_name,m_icon,m_href,r_level,quanxian,m_pid):
self.r_name=r_name
self.m_name=m_name
self.m_icon=m_icon
self.m_href=m_href
self.r_level=r_level #菜单级别相当于是菜单顺序
self.rm_quanxian=quanxian
self.m_pid=m_pid #模块中的父编号
3.MyUtils.py (工具类 用户权限)
import itertools
def Change(number):
lists=[1,2,4,8]#权限列表 1.表示增加按钮 2.表示删除按钮 3.表示修改按钮 4.表示查询按钮
try:
base_two=int(str(number),base=2)
except Exception as e:
print(e)
base_two=int(number)
finally:
for fooin range(1,len(lists)+1):
data=list(itertools.combinations(lists,foo))
value=[ifor iin dataif base_two==sum(i)]
if value:
return list(value[0])
print(Change(12))
4.RBACManager.py (连接数据库之后,用户输入)
"""
员工管理的扩展功能*
1.输入用户名密码登录页面
2.显示用户相对应的角色可访问的菜单和菜单中按钮的功能
3.公司管理
4.员工管理
5.菜单管理(增加菜单,删除菜单,修改菜单,查询菜单,菜单顺序调整)
6.角色管理CURD
7.菜单中功能权限管理CURD
完整的RBAC权限设计逻辑
"""
import re
from RBAC权限设计.RBACDesignimport *
from RBAC权限设计.Modelerimport *
from RBAC权限设计.MyUtilsimport *#自己的权限算法工具类
def menu():
print("""
*********************欢迎使用员工管理系统************************
1.登陆系统------>显示菜单
2.显示二级菜单
3.显示菜单中功能按钮
4.角色管理(增删改查)
5.用户管理(增删改查)
6.权限管理(维护用户的操作权限)
""")
option=input("请选择*")
option_str=re.sub("\D","",option)
if option_strin ["1","2","3"]:
option_int=int(option_str)
if option_int==1:
login()
elif option_int==2:
showMenu()
elif option_int==3:
show_btn()
def login():
"""
mysql查询返回的是元组 工作中常用的思想:使用面向对象
所以需要把使用的数据封装为数据
:return:
"""
print("****************登录功能*****************")
u_name=input("请输入登陆名字*")
u_pwd=int(input("请输入登录密码*****"))
db=RBACDesign("39.98.39.173",13306,"root","root","emp")
sql="select * from user where u_name = %s and u_pwd = %s"
#判断一下在控制台输入的名字和数据库中的名字是否一致
params=[u_name,u_pwd]
result=db.get_one(sql,params)
#实例化对象用户类获得用户的属性和值
user=User(result[0],result[1],result[2],result[3])
print(user)
if result:
print("用户名密码输入正确,登陆成功!")
print("是否显示主菜单?")
flag=input("请选择输入(y/n)*")
if flag=="y":
showMenu(user)
else:
print("不显示菜单*****")
else:
print("用户名或者密码错误, 登陆失败!")
"""往数据库中增加数据
sql="insert into user(u_name,u_pwd) values (%s,%s)"
params=[username,password]
num=db.get_execute(sql,params)
if num >= 0:
print("登陆成功*")
else:
print("登陆失败*")"""
def showMenu(user):
print("***展示当前用户的角色以及可访问的菜单功能***")
# if user is None:
# print("首先登录再访问")
# else:
# print("该用户的角色(1.主任角色 2.讲师角色):",user.u_r_id)
#根据用户id来显示当前角色可以访问那些菜单角色和模块的关联表
sql="select r.r_name,m.m_name,m.m_icon,m.m_href,m.m_level,rm.quanxian,m.m_pid from role r,modules m,role_modules rm where rm.r_id=r.r_id and rm.m_id=m.m_id and r.r_id=%s"
params=[user.u_r_id]
db=RBACDesign("39.98.39.173",13306,"root","root","emp")
result=db.get_all(sql,params)
#print(result) #展示的是当前角色和访问的菜单
#('讲师', '订单管理', '4.jpg', '/order', 3, 15, 1)
#('讲师', '管理员管理', '5.jpg', '/admin', 4, 7, 1)
menu_list=[]
for itemin result:
print(item)
rm=R_M(r_name=item[0],m_name=item[1],m_icon=item[2],m_href=item[3],r_level=item[4],quanxian=item[5],m_pid=item[6])
menu_list.append(rm)
print(menu_list)#当前用户可访问的所有模块对象
#查看每个菜单中的功能按钮!
for itemsin menu_list:
print("角色* %s,可访问的菜单路径是* %s,权限代码是* %s" % (items.r_name,items.m_href,Change(items.rm_quanxian)))
#1.表示增加 2.表示删除 4.表示修改 8.表示查询
Change(items.rm_quanxian)
def show_btn():
print("显示菜单中的功能按钮**********")
if __name__ =='__main__':
menu()
二 * ** * 员工数据库设计表
数据库名称为emp 表格内容如下*
项目主要注意功能*
用户模块功能
· 登录
· 注册
· 查询个人信息
· 可以进行修改用户信息
会员管理模块
· 增加会员
· 删除会员
· 修改会员
· 开启或者禁用会员
· 批量查询会员
· 根据时间段查询会员信息
· 根据名称来查询会员信息
重点 :权限控制
扩展:管理员的管理模板
管理员列表
角色管理【添加角色/删除角色/修改角色/批量处理查询】
模块/菜单管理【添加菜单/修改菜单/调整顺序 order by desc】
当前项目的两个角色:角色一* 管理员 角色二* 会员
超级管理员 马云 --------登录后可以看到里面的所有菜单 ------- 也同样能看到所有功能按钮 (增删改批量操作)
普通管理员 admin --------登录后可以看到所有菜单 只能看到增删改3个功能按钮