当前位置:编程学习 > 网站相关 >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,