Pergunta

Qual seria a estrutura ideal para usuários> permissões de objetos.

Eu já vi muitas postagens relacionadas para permissões gerais, ou quais seções um usuário pode acessar, que consiste em um users, userGroups e userGroupRelations ou algo dessa natureza.

No meu sistema, existem muitos objetos diferentes que podem ser criados, e cada um deve poder ser ativado ou desativado. Por exemplo, pegue um gerenciador de senhas que tenha grupos e sub -grupos.

Group 1
    Group 2
    Group 3
    Group 4
Group 5
   Group 6
Group 7
   Group 8
       Group 9
       Group 10

Cada grupo pode conter um conjunto de senhas. Um usuário pode ser fornecido, escreva, edite e exclua permissões para qualquer grupo. Mais grupos podem ser criados a qualquer momento.

Se alguém tiver permissão para um grupo, eu poderá fazê -lo ter permissões para todos os sub -grupos ou restringi -lo apenas a esse grupo.

Meu pensamento atual é ter uma tabela de usuários e, em seguida, uma tabela de permissões com colunas como:

permission_id (int) PRIMARY_KEY
user_id (int) INDEX
object_id (int) INDEX
type (varchar) INDEX
admin (bool)
read (bool)
write (bool)
edit (bool)
delete (bool)

Isso funcionou no passado, mas o novo sistema que estou construindo precisa ser capaz de escalar rapidamente, e não tenho certeza se essa é a melhor estrutura. Também torna mais difícil a idéia de ter alguém com todas as permissões de subgrupos de um grupo.

Haverá uma tabela separada para funções de usuários/administradores, o que significa que eles podem alterar as permissões dos usuários abaixo dos grupos que podem controlar.

Então, como uma pergunta, devo usar a estrutura acima? Ou alguém pode me apontar na direção de um melhor?


EDITAR

A alternativa é criar uma tabela de permissão para todo tipo de objeto.

Foi útil?

Solução

Sugiro que você adicione um registro de data e hora "last_update" e uma coluna "last_updated_by_user", para ter alguma esperança de rastrear as alterações nesta tabela no seu sistema em execução.

Você pode considerar adicionar uma permissão - Grant. Um usuário com a permissão de concessão para um objeto seria capaz de conceder acesso a outros usuários ao objeto em questão.

Tenha cuidado com "precisa escalar rapidamente". É difícil adivinhar sem a experiência de produção do mundo real o que um sistema de ampliação realmente precisa.

Além disso, tenha cuidado para não complicar demais um sistema de permissões, porque um sistema excessivamente complexo será difícil de verificar e, portanto, mais fácil de quebrar. Um sistema simples será muito mais fácil de refatorar para escala do que um mais complexo.

Seu esquema parece relacionar os usuários com objetos. Deseja que sua chave primária e seu índice exclusivo seja (user_id, object_id)? Ou seja, você deseja que cada usuário tenha uma entrada de zero ou uma permissão para cada objeto? Nesse caso, use a chave primária para aplicar isso, em vez de usar a tecla Substituto Permission_ID que você propõe.

Para seus objetos que existem nas hierarquias, você deve fazer uma das duas escolhas em todo o sistema:

  1. Uma concessão a um objeto com subobjetos concede implicitamente acesso apenas ao objeto, ou ...

  2. Também concede acesso a todos os subobjetos.

A segunda escolha reduz o ônus da concessão de permissão explícita quando novos subobjetos são criados. A primeira opção é mais segura.

A segunda opção torna mais difícil determinar se um usuário tem acesso a um objeto específico, porque você precisa acompanhar a hierarquia do objeto em direção à raiz da árvore em busca de subsídios de acesso aos objetos pais ao verificar se um usuário tem acesso. Esse problema de desempenho deve dominar sua tomada de decisão. Seus usuários criarão alguns objetos e os acessam com frequência? Ou eles criarão muitos objetos e subobjetos e os acessam raramente? Se o acesso for mais frequente que a criação, você deseja a primeira escolha. Pegue o golpe de sobrecarga no tempo de concessão de permissão no tempo de criação do objeto, em vez de uma busca de permissão acertada no tempo de acesso ao objeto.

Eu acho que a primeira escolha provavelmente é superior. Eu sugiro este layout da tabela:

user_id (int)
object_id (int)
type (varchar)  (not sure what you have this column for)
admin (bool)
read (bool)
write (bool)
edit (bool)
grant (bool)
delete (bool)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id.

Você também pode usar este layout da tabela e ter uma linha na tabela para cada permissão distinta concedida a cada usuário para cada objeto. Este escala mais facilmente se você adicionar mais tipos de permissões.

user_id (int)
object_id (int)
permission_enum (admin/read/write/edit/grant/delete)
type (varchar)  (not sure what you have this column for)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id, permission_enum
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top