Projetando uma configuração total de permissões de melhor desempenho para vários níveis de permissão

5

Temos um sistema global no qual estamos tentando resolver um problema de permissões. Atualmente, nosso sistema atende diversas aplicações diferentes para nossos clientes e cada cliente tem sua própria lista de usuários e usuários para o nosso sistema. No entanto, todas essas coisas podem ser independentes umas das outras. Tal que o Cliente A pode ter acesso ao Aplicativo A e ao Aplicativo B. O Cliente A também pode fornecer diferentes Tipos de Usuários, todos com Usuários diferentes. Cada "nível" de uso adicionaria um novo nível de complexidade a como damos permissões a tudo.

Por exemplo: eu posso ter três permissões, chamadas "Grape", "Purple" e "Car". No nível global (significando todos os aplicativos, clientes, tipos de usuários e usuários), nego a permissão no Grape, mas permito permissão para o Purple e o Car. Isso significa que nenhum aplicativo, nenhum cliente, nenhum tipo de usuário e nenhum usuário pode acessar o Grape, mas eles podem acessar o Purple e o Car. Então, agora, temos dois aplicativos, chamados "Fruit" e "Auto". Atualmente, o Fruit e o Auto analisam as permissões globais criadas para o Grape, o Purple e o Car e as utilizam. Então, é assim que as coisas ficariam:

  • Fruta
    • Uva: negada
    • Roxo: concedido
    • Carro: concedido
  • Auto
    • Uva: negada
    • Roxo: concedido
    • Carro: concedido

Mas, para os aplicativos, isso pode não fazer sentido. Então, eu criaria uma permissão específica do aplicativo para conceder permissões para o Grape e negar permissões para o Car para o aplicativo Fruit. Então, agora, as permissões ficariam assim.

  • Fruta
    • Uva: Concedido (a)
    • Roxo: concedido
    • Carro: negado (a)
  • Auto
    • Uva: negada
    • Roxo: concedido
    • Carro: concedido

Embora eu ainda tenha as permissões globais informando ao Auto quais permissões usar, tenho permissões específicas informando à Fruit que ela precisa conceder e negar permissões diferentes lá. Agora, adicionaríamos outro nível de complexidade e adicionaríamos um cliente. Digamos que eu tenha um cliente chamado "Fox". A Fox usa os dois aplicativos, Fruit e Car. No momento, sem adicionar mais nada, as permissões para os três objetos (Grape, Purple e Car) vêm do nível de permissão do aplicativo. Mas talvez a Fox queira coisas diferentes. Então, ao invés de ter o Purple concedido no aplicativo Fruit, ele nega essa permissão especificamente. Em termos de dados, isso seria um registro específico que você adicionaria apenas para o cliente Fox que substitui as permissões do Purple a serem negadas, independentemente do que o aplicativo ou as permissões globais disseram para o Purple. Então, agora você tem algo parecido com isso.

  • Fruta
    • Fox
      • Uva: Concedido (a)
      • Roxo: negado (c)
      • Carro: negado (a)
  • Auto
    • Fox
      • Uva: negada
      • Roxo: concedido
      • Carro: concedido

Lembre-se também que muito disso pode ser bastante abstraído. Você pode ter clientes que usam apenas um aplicativo, três aplicativos ou todos os aplicativos que você possui em seu sistema. E para esses clientes, você pode ter listas de usuários muito específicas que podem usar apenas o que o cliente pode usar, de modo que elas herdariam as permissões do cliente, a menos que sejam especificamente sobrescritas.

Obviamente, isso pode ficar cada vez mais complexo quando você adiciona um nível para o tipo de usuário e, em seguida, para o usuário. Manter o controle de tudo isso pode ser muito complicado, mas é algo que temos que considerar com base no modelo do nosso sistema. Então, nós criamos uma solução de pontuação para permissões.

Nós consultamos o banco de dados e as tabelas e passamos o aplicativo atual, cliente, tipo de usuário e usuário para o banco de dados para qualquer coisa que tenhamos atual no momento. O banco de dados usaria então uma solução de pontuação para determinar se podemos ver ou não uma permissão específica. Aplicação seria uma pontuação de 1, cliente seria uma pontuação de 2, tipo de usuário seria 4, usuário seria 8, ect. Quanto mais objetos definidos você colocar, maior será a pontuação máxima. Isso nos dá uma definição muito clara de quais permissões estão ativas para um determinado conjunto de objetos.

Nosso verdadeiro problema agora é o desempenho. Agora temos 5 níveis de objetos em nosso sistema e podemos estar adicionando mais, se o design do sistema exigir isso. No entanto, consultar todos esses níveis é um sério impacto no desempenho do SQL. E cada objeto apenas tornará o problema exponencialmente pior. Minha pergunta é a seguinte: como posso obter o mesmo tipo de sistema de herança de permissões aqui e dar a possibilidade de adicionar novos níveis quando necessário, sem aumentar exponencialmente o impacto no desempenho. Tem que haver outras empresas e aplicativos que tenham esse mesmo problema e tenham melhores soluções para ele.

    
por CrystalBlue 13.11.2014 / 17:07
fonte

1 resposta

1

Por favor, dê uma olhada no seguinte tópico .

Grupos geralmente são o caminho mais simples. Note que você não precisa ter o objeto 'Grupo' e vinculá-lo às suas funções / usuários, a abordagem mais simples é a marcação. Ter um conjunto específico de tags nos próprios objetos identifica o conjunto de grupos a que pertence - daí as permissões.

  • Fox [tags: automático, fruta]
  • Auto [tags: roxo, carro]
  • Fruta [tags: uva]

algo nesse sentido ...

    
por 21.11.2014 / 23:07
fonte