Políticas de acesso a linhas no Streamlit in Snowflake

This topic describes using context functions and row access policies in Streamlit in Snowflake warehouse runtimes.

Em tempos de execução de contêiner, as funções de contexto sempre retornam valores do contexto da função de proprietário e, portanto, não são apropriadas para políticas de acesso a linhas direcionadas ao usuário.

Funções de contexto e políticas de acesso a linhas no Streamlit in Snowflake

Para usar funções de contexto, como CURRENT_USER e dados de tabelas com políticas de acesso a linhas em um aplicativo Streamlit in Snowflake, um usuário com a função ACCOUNTADMIN deve conceder o privilégio global READ SESSION à função de proprietário do aplicativo Streamlit, conforme mostrado no exemplo a seguir:

USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
Copy

Nota

Em um aplicativo Streamlit in Snowflake, é possível usar políticas de acesso a linhas que usam CURRENT_ROLE. Os aplicativos Streamlit in Snowflake são executados com direitos de proprietário, portanto, usar CURRENT_ROLE dentro de um aplicativo Streamlit sempre retorna a função de proprietário do aplicativo. Para obter mais informações, consulte Noções básicas sobre os direitos do proprietário e aplicativos Streamlit in Snowflake.

Exemplo: Como acessar dados em uma tabela com a política de acesso a linhas usando CURRENT_USER

É possível usar um aplicativo Streamlit in Snowflake para controlar o acesso a linhas em uma tabela protegida por uma política de acesso a linhas. Especifique a função CURRENT_USER no corpo da política de acesso a linhas e adicione a política de acesso a linhas à tabela.

O exemplo a seguir demonstra como controlar o acesso a uma tabela protegida por uma política de acesso a linhas em um aplicativo Streamlit in Snowflake.

  1. Criar uma tabela e inserir dados:

    CREATE TABLE row_access_policy_test_table (
        id INT,
        some_data VARCHAR(100),
        the_owner VARCHAR(50)
    );
    
    INSERT INTO row_access_policy_test_table (id, some_data, the_owner)
    VALUES
        (4, 'Some information 4', 'ALICE'),
        (5, 'Some information 5', 'FRANK'),
        (6, 'Some information 6', 'ALICE');
    
    Copy
  2. Crie uma política de acesso a linhas:

    CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy
    AS (the_owner VARCHAR) RETURNS BOOLEAN ->
        the_owner = CURRENT_USER();
    
    Copy
  3. Adicione a política de acesso a linhas à tabela:

    ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
    
    Copy
  4. Criar um aplicativo Streamlit.

  5. Conceda o privilégio global READ SESSION à função de proprietário do aplicativo Streamlit:

    GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
    
    Copy
  6. Adicione o seguinte código ao seu aplicativo Streamlit:

    # Import Python packages
    import streamlit as st
    from snowflake.snowpark.context import get_active_session
    
    st.title("CURRENT_USER() + Row Access Policy in SiS Demo :balloon:")
    st.write(
            """You can access `CURRENT_USER()` and data from tables with row access policies
            in Streamlit in Snowflake apps
            """)
    
    # Get the current credentials
    session = get_active_session()
    
    st.header('Demo')
    
    st.subheader('Credentials')
    sql = "SELECT CURRENT_USER();"
    df = session.sql(sql).collect()
    st.write(df)
    
    st.subheader('Row Access on a Table')
    sql = "SELECT * FROM st_db.st_schema.row_access_policy_test_table;"
    df = session.sql(sql).collect()
    
    st.write(df)
    
    Copy