Politiques d’accès aux lignes dans Streamlit in Snowflake

Cette rubrique décrit l’utilisation des fonctions de contexte et des politiques d’accès aux lignes dans Streamlit in Snowflake.

Fonctions de contexte et politiques d’accès aux lignes dans Streamlit in Snowflake

Pour utiliser des fonctions contextuelles, telles que CURRENT_USER, et les données des tables avec des politiques d’accès aux lignes dans une application Streamlit in Snowflake, un utilisateur avec le rôle ACCOUNTADMIN doit accorder le privilège global READ SESSION au rôle de propriétaire de l’application Streamlit, comme indiqué dans l’exemple suivant :

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

Note

Dans une application Streamlit in Snowflake, vous ne pouvez pas utiliser de politiques d’accès aux lignes qui utilisent CURRENT_ROLE. Les applications Streamlit in Snowflake fonctionnent avec les droits du propriétaire, donc l’utilisation de CURRENT_ROLE à l’intérieur d’une application Streamlit renvoie toujours le rôle de propriétaire de l’application. Pour plus d’informations, voir Comprendre les droits du propriétaire et les applications Streamlit in Snowflake.

Exemple : accéder aux données d’une table avec une politique d’accès aux lignes à l’aide de CURRENT_USER

Vous pouvez utiliser une application Streamlit in Snowflake permettant de gérer l’accès aux lignes d’une table protégée par une politique d’accès aux lignes. Précisez la fonction CURRENT_USER dans le corps de la politique d’accès aux lignes et ajoutez la politique d’accès aux lignes à la table.

L’exemple suivant montre comment gérer l’accès à une table protégée par une politique d’accès aux lignes dans une application Streamlit in Snowflake.

  1. Créer une table et insérer des données :

    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. Créez une politique d’accès aux lignes :

    CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy
    AS (the_owner VARCHAR) RETURNS BOOLEAN ->
        the_owner = CURRENT_USER();
    
    Copy
  3. Ajoutez la politique d’accès aux lignes à la table :

    ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
    
    Copy
  4. Créez une application Streamlit.

  5. Accordez le privilège READ SESSION global au rôle de propriétaire de l’application Streamlit :

    GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
    
    Copy
  6. Ajoutez le code suivant à votre application 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