Pytho Trac的权限控制的核心代码讲解
trac的权限系统设计的非常的巧妙,权限以username,action的方式保存在数据库中,真正的操作必须都是大写字母。同时trac提供了一个巧妙的用户组的实现方式,如果一个用户所对应的action值为小写字母,那么这个action其实就是一个user group,用户所拥有的权限即为这个user group所对应的权限。
trac的权限控制的核心代码为perm.py 中DefaultPermissionStore的get_user_permissions函数
这个函数中包含了权限的扩展实现还有权限算法的实现。
def get_user_permissions(self, username):
subjects = set([username])
for provider in self.group_providers:
subjects.update(provider.get_permission_groups(username))
actions = set([])
db = self.env.get_db_cnx()
cursor = db.cursor()
cursor.execute("SELECT username,action FROM permission")
rows = cursor.fetchall()
while True:
num_users = len(subjects)
num_actions = len(actions)
for user, action in rows:
if user in subjects:
if action.isupper() and action not in actions:
actions.add(action)
if not action.isupper() and action not in subjects:
# action is actually the name of the permission group
# here
subjects.add(action)
if num_users == len(subjects) and num_actions == len(actions):
break
return list(actions)
这里有两个集合,subjects和actions
subjects中装的是username和其所对应的groupname等等
actions中存放的是subjects拥有的所有的操作
一开始,将当前username加入subjects集合
然后便是便利扩展的 组策略, 看当前的用户是否属于某个扩展的组,如果存在则将对应的group name加入subjects中
接着将actions设置为空的集合
下面便是对所有的权限表的记录进行循环,根据subjects中的去找出对应的action,
如果action都是大写字母,且当前actions中没有,则加入actions,
如果action为小写,则说明其为一个group,若subjects没有当前找个group,则将其加入action中,
这样一直循环下去,直到某轮循环下来发现subjects和actions都没有变化,说明处理已经结束。
然后找个时候actions中的所有记录就为当前user所对应的权限。
补充:Web开发 , Python ,