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;
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.
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');
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();
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);
Criar um aplicativo Streamlit.
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;
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)