二进制权限模型
class BinAuth:
#初始化
def __init__(self):
#导入mysql类
self.mydb = MysqlDb()
#判断用户对于单节点是否有权限
def auth_node(self,uid,nodeid):
# 查询节点功能的二进制码
node = self.mydb.read(" select byte from node where id = %s " % nodeid)
#关联查询
role = self.mydb.read(" select b.byte from user a left join role b on a.type = b.id where a.id = %s " % uid)
#位与运算
res = node["byte"] & role["byte"]
return res
#获取用户权限(多对多)
def get_usernode_m2m(self,uid):
# user a
# user_role b
# role c
#查询角色
roles = self.mydb.reads(" select c.byte,c.id,c.name from user a left join user_role b on a.id = b.uid left join role c on b.roleid = c.id where a.id = %s " % uid)
#查所有节点
nodes = self.mydb.reads(" select * from node")
nlist = []
#遍历功能节点
for x in nodes:
for i in roles:
#位与操作
if int(x["byte"]) & int(i["byte"]):
nlist.append(x)
break
return nlist
#授权
def set_node(self,roleid,nodeid):
#查询节点功能的二进制码
node = self.mydb.read(" select byte from node where id = %s " % nodeid)
#查询角色 的二进制码
role = self.mydb.read(" select byte from role where id = %s " % roleid)
#进行授权 位或运算
byte = role["byte"] | node["byte"]
#修改数据库
self.mydb.update(" update role set byte = '%s' where id = %s " % (byte,roleid))
#获取用户权限(一对多)
def get_usernode(self,uid):
#查询角色的二级制码
role = self.mydb.read(" select b.byte from user a left join role b on a.type = b.id where a.id = %s " % uid)
#查询所有节点
nodes = self.mydb.reads(" select * from node ")
# print(nodes)
#遍历容器
nlist = []
#遍历功能节点
try:
#循环node表 将node表byte与role表中byte来比较 如果位与 就添加 否则返回空
for x in nodes:
#位与操作
res = role["byte"] & x["byte"]
if res:
n = nlist.append(x)
# print(n)
except Exception as e:
return []
return nlist
#取消授权
def del_auth(self,roleid,nodeid):
# 查询节点功能的二进制码
node = self.mydb.read(" select byte from node where id = %s " % nodeid)
# 查询角色 的二进制码
role = self.mydb.read(" select byte from role where id = %s " % roleid)
#位与
res = role["byte"] & node["byte"]
if res:
#位异运算
byte = role["byte"] ^ node["byte"]
#写到用户的库里
self.mydb.update(" update role set byte = %s where id = %s" % (byte,roleid))
# binauth = BinAuth()
# print(binauth.get_usernode_m2m(1))
# print(binauth.auth_node(1,2))
# binauth.del_auth(1,3)
# binauth.set_node(1,2)
# binauth.set_node(1,1)
# binauth.set_node(1,3)
# print(binauth.get_usernode(1))
# acl = ACL()
# print(acl.get_nodeuser(3,1))
二进制权限模型的应用
最新推荐文章于 2023-04-11 11:31:10 发布