code: def can_with_columns(self, user, action, table, columns):
          
          # 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
docs: 根据权限进行列过滤
          注意一点，只要有一个条件能够通过权限检测，那么过滤后还会有剩余条件，最终就不会报错。
          如果全部条件都不能过检测，就会爆出权限错误了。
  
          :param user:
          :param action: 行为
          :param table: 表名
          :param columns: 列名列表
          :return: 可用列的列表