受限制的调用方的权限和 Streamlit in Snowflake

默认情况下,所有 Streamlit in Snowflake 应用程序 使用所有者的权限来运行,而不是调用方的权限。Streamlit 应用程序开发者可以定义容器运行时应用程序是使用所有者权限运行,还是使用受限制的调用方权限运行。仓库运行时不支持受限制的调用方权限。

受限制的调用方权限允许 Streamlit 应用程序以调用方的权限运行,但限制应用程序以调用方的哪些权限运行。如果是受限制的调用方权限,则 Streamlit 应用程序不能以特定权限运行,除非管理员明确允许。管理员使用 调用方授权 定义应用程序可以使用哪些调用方授权运行。这样,Streamlit 应用程序就只会访问(代表查看者)它们被授权访问的数据。

有关更多信息,请参阅 受限制的调用方的权限

所需的调用方授权

要代表查看者访问任何表、存储过程或仓库,Streamlit 应用开发者必须拥有已由具有 MANAGE CALLER GRANTS 权限的用户授予的调用方授权。

示例工作流程

  1. 管理员将 MANAGE CALLER GRANTS 权限授予 data_science_manager 角色:

    GRANT MANAGE CALLER GRANTS ON ACCOUNT TO ROLE data_science_manager;
    
  2. 具有以下 data_science_manager 角色的用户将以下权限授予 streamlit_app_developer 角色:

    • streamlit_app_developer 角色授予调用方选择权限,以便拥有该角色的 Streamlit 应用在访问 streamlit_db.streamlit_schema.streamlit_table 表时,可以在该表上以 SELECT 权限运行:

      GRANT CALLER SELECT ON TABLE streamlit_db.streamlit_schema.streamlit_table TO ROLE streamlit_app_developer;
      
    • streamlit_app_developer 角色授予调用方使用权限,以使用 streamlit_wh 仓库:

      GRANT CALLER USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_app_developer;
      

有关调用方授权的更多信息,请参阅 关于调用方授权GRANT CALLER

Streamlit in Snowflake 中受限调用方权限的使用场景

Streamlit in Snowflake 中的受限调用方权限允许您控制以下方面:

  • Streamlit 应用程序的哪些页面可用

  • Streamlit 应用程序中的哪些数据可用

  • CURRENT_ROLE 可以访问哪些具有行访问策略的数据

  • 可以访问哪些仓库

  • Streamlit 应用中可以调用哪些存储过程

容器运行时中的受限调用方权限

在容器运行时中,您可以在同一应用程序中合并所有者权限和受限调用方权限。

  • 要创建使用所有者权限的连接,请使用 st.connection("snowflake")

  • 要创建使用受限调用方权限的连接,请使用 st.connection("snowflake-callers-rights")

有关更多信息,请参阅 Streamlit 文档中的 st.connection (https://docs.streamlit.io/develop/api-reference/connections/st.connection) 和 SnowflakeConnection (https://docs.streamlit.io/develop/api-reference/connections/st.connections.snowflakeconnection)。

以下示例演示如何创建调用方权限连接:

import streamlit as st

conn = st.connection("snowflake-callers-rights")
df = conn.query("SELECT CURRENT_USER()")
st.write(f"Running as: {df[0][0]}")

在容器运行时中使用受限调用方权限的提示和限制

  • Sf-Context-Current-User-Token 中提供的令牌标头仅在两分钟内有效,并在应用程序会话开始时创建。在应用脚本的顶部创建所有调用方权限连接,而不要将其放在 if-else 代码块或页面之后。

  • 受限调用方权限连接使用查看者的默认角色,而非其在 Snowsight 中选择的角色。

  • 您可以通过创建多个连接,在同一应用中使用受限调用方权限连接和常规所有者权限连接。

  • 受限调用方权限连接仅在您的应用使用容器运行时有效。如果您尝试在本地开发环境或数据仓库运行时环境中使用受限调用方权限连接,将会收到错误提示。

  • 受限调用方权限不支持次要角色。

重要

受限调用方权限连接在会话范围内。如果您需要缓存从受限调用方权限连接返回的数据,则必须在缓存装饰器中使用会话作用域。这样可以防止在会话之间共享数据。要将会话范围与缓存结合使用,请在缓存装饰器中设置 scope="session"。有关更多信息,请参阅 Streamlit 文档中的 st.cache_data (https://docs.streamlit.io/develop/api-reference/caching-and-state/st.cache_data)。