Row Level Security (RLS)

Introdução

A funcionalidade de Row Level Security (RLS) permite definir regras de segurança no nível de linha, garantindo que os usuários tenham acesso apenas aos dados apropriados. O security_rule é uma função que facilita a implementação do RLS no seu sistema, permitindo definir regras de acesso baseadas nas permissões do usuário.

Dica: Se você precisa de uma introdução sobre autenticação, autorização e lógicas de permissionamento, confira a página Autenticação, Autorização, e lógicas de Permissionamento.

Como funciona

A função security_rule determina os valores da atributo que um usuário pode acessar. Os acessos são caracterizados por três saídas possíveis:

  • Acesso Total: Retorna uma lista vazia.

  • Sem Acesso: Retorna None.

  • Acesso Parcial: Retorna (1) uma lista de valores, (2) um DataFrame ou (3) um lq.ObjTable.

Parâmetros

  • user (drp.User): Representação de um usuário com os seguintes atributos:

    • user.id (int): ID do usuário.

    • user.login (str): Nome de login do usuário.

    • user.group_id (int): ID do grupo do usuário.

    • user.sso_attributes (dict): Atributos de Single Sign-On do usuário.

Os valores da propriedade sso_attributes são obtidos a partir dos valores informados nos claims de forwardedClaim. Para mais informações, veja a seção forwardedClaim.

Retorno

  • list ou pd.DataFrame ou lq.ObjTable: Representa os registros de acesso permitidos para o usuário.

Exemplos

Usando um dicionário para permissões:

def security_rule(user: drp.User) -> list or pd.DataFrame or lq.ObjTable:
    sec_table = {
        "John": ["PA", "SP"],
        "Smith": ["SP"],
        "Jane": ["PA, RJ"],
        "Robert": [],  # Acesso total
        "Stranger": None  # Sem acesso
        # Qualquer usuário não existente não terá acesso
    }
    return sec_table.get(user.login)

Usando uma consulta para permissões:

def security_rule(user: drp.User) -> list or pd.DataFrame or lq.ObjTable:
    query = f"SELECT * FROM sec_table WHERE login = '{user.login}'"
    return lq.sql_execute("connection_name", query)

Modelos de Tabela de Segurança

Tabela de Relação de Usuário e Loja

Descrição: Tabela que vincula usuários a lojas específicas. Pode ser usada para determinar a quais lojas um usuário tem acesso.

user_login
store_id

John

101

John

102

Jane

103

Robert

Stranger

null

O usuário "John" está presente em 2 linhas da tabela de segurança, informando assim que ele tem acesso tanto à loja 101 quanto à 102.

O usuário "Robert" tem acesso a todas as lojas.

O usuário "Stranger", assim como qualquer outro usuário não encontrado na tabela, não tem acesso a nenhuma loja.

Tabela de Regras de Usuário

Descrição: Essa tabela contém o login de cada usuário e as respectivas permissões associadas a ele. As permissões podem ser estados, lojas ou qualquer outro atributo que defina o acesso.

login
permissions

John

PA, SP

Smith

SP

Jane

PA, RJ

Observe que no exemplo acima, é possível retornar uma lista de permissões caso o campo "permissions" contenha valores separado por vírgulas.


Conclusão: A implementação de RLS através da função security_rule permite flexibilidade e segurança na definição de permissões de acesso aos dados. Pode-se utilizar tanto dicionários para mapear as permissões diretamente, como também consultas SQL para determinar os níveis de acesso com base em tabelas específicas.

Last updated

Was this helpful?