slim/base/permission.py
def can_with_columns(self, user, action, table, columns):
        """
        根据权限进行列过滤
        注意一点，只要有一个条件能够通过权限检测，那么过滤后还会有剩余条件，最终就不会报错。
        如果全部条件都不能过检测，就会爆出权限错误了。

        :param user:
        :param action: 行为
        :param table: 表名
        :param columns: 列名列表
        :return: 可用列的列表
        """
        # TODO: 此过程可以加缓存
        # 全局

        global_data = self.rules.get('*')
        global_actions = self._parse_permission(global_data)
        if global_actions and action in global_actions:
            available = list(columns)
        else:
            available = []

        # table
        table_data = self.rules.get(table)
        table_actions = self._parse_permission(table_data)

        if table_actions and action in table_actions:
            available = list(columns)

        # column
        if type(table_data) == dict:
            # 这意味着有详细的列权限设定，不然类型是 list
            for column in columns:
                column_actions = self._parse_permission(table_data.get(column))
                if column_actions is not None:
                    if action in column_actions:
                        # 有权限，试图加入列表
                        if column not in available:
                            available.append(column)
                    else:
                        # 无权限，从列表剔除
                        if column in available:
                            available.remove(column)

        for check in self.common_checks:
            if check[0] == table and action in check[1]:
                ret = check[-1](self, user, action, available)
                if isinstance(ret, (tuple, set, list)):
                    # 返回列表则进行值覆盖
                    available = list(ret)
                elif ret == '*':
                    # 返回 * 加上所有可用列
                    available = list(columns)
                elif ret is False:
                    # 返回 false 清空
                    available = []
                if not available: break

        return available
def can_with_columns(self, user, action, table, columns):
        """
        根据权限进行列过滤
        注意一点，只要有一个条件能够通过权限检测，那么过滤后还会有剩余条件，最终就不会报错。
        如果全部条件都不能过检测，就会爆出权限错误了。

        :param user:
        :param action: 行为
        :param table: 表名
        :param columns: 列名列表
        :return: 可用列的列表
        """
        # TODO: 此过程可以加缓存
        # 全局

        global_data = self.rules.get('*')
        global_actions = self._parse_permission(global_data)
        if global_actions and action in global_actions:
            available = list(columns)
        else:
            available = []

        # table
        table_data = self.rules.get(table)
        table_actions = self._parse_permission(table_data)

        if table_actions and action in table_actions:
            available = list(columns)

        # column
        if type(table_data) == dict:
            # 这意味着有详细的列权限设定，不然类型是 list
            for column in columns:
                column_actions = self._parse_permission(table_data.get(column))
                if column_actions is not None:
                    if action in column_actions:
                        # 有权限，试图加入列表
                        if column not in available:
                            available.append(column)
                    else:
                        # 无权限，从列表剔除
                        if column in available:
                            available.remove(column)

        for check in self.common_checks:
            if check[0] == table and action in check[1]:
                ret = check[-1](self, user, action, available)
                if isinstance(ret, (tuple, set, list)):
                    # 返回列表则进行值覆盖
                    available = list(ret)
                elif ret == '*':
                    # 返回 * 加上所有可用列
                    available = list(columns)
                elif ret is False:
                    # 返回 false 清空
                    available = []
                if not available: break

        return available
根据权限进行列过滤
        注意一点，只要有一个条件能够通过权限检测，那么过滤后还会有剩余条件，最终就不会报错。
        如果全部条件都不能过检测，就会爆出权限错误了。

        :param user:
        :param action: 行为
        :param table: 表名
        :param columns: 列名列表
        :return: 可用列的列表