trac权限系统核心算法

trac的权限系统设计的非常的巧妙,权限以{username,action}的方式保存在数据库中,真正的"操作权限"必须都是大写字母,比如"WIKI_VIEW"。

 

同时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所对应的权限。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值