Qual é o modelo básico para criar um banco de dados com usuários e grupos?

9

Estou tentando encontrar a melhor maneira de um sistema de segurança básico para um site. Eu sei que quero usuários e grupos.

Eu pensei que teria:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

O primeiro é o usuário, o segundo é o grupo e o terceiro é a tabela intermediária que conecta os dois. Um usuário tem muitos grupos.

Isso soa bem?

johnny
fonte
Diferente dos nomes. Sua GROUP_TYPEtabela deve ter um nome GROUPou algo semelhante e GROUP_TABLEdeve referenciar usuários e grupos, pois é isso que está vinculando.
Adam Musch
@adam não group_table faz isso com user_id e group_id?
johnny
4
@AdamMusch Não deve ser nomeado GROUP, pois é uma palavra reservada. Tabelas e colunas nunca devem ter nomes de palavras reservadas
Philᵀᴹ
11
@ Phil concordou. Você também pode nomear uma tabela SELECTe um campo FROMpara ter uma consulta comoSELECT [FROM] FROM [SELECT]
JNK
2
Tente chamar a entidades básicas algo como 'app_user' e 'app_role'
ConcernedOfTunbridgeWells

Respostas:

17

A maneira tradicional de modelar isso é usar um padrão chamado Segurança Baseada em Função .

A idéia não é apenas ter grupos de usuários, mas também grupos de permissões. Aqui está como o padrão se parece:

Segurança baseada em funções ERD

Observe que você deseja evitar palavras reservadas para nomes de tabelas, portanto, não nomeie suas tabelas exatamente como mostrado no diagrama.

A maneira como funciona é que seus grupos ou funções têm não apenas uma lista de usuários atribuídos a eles, mas também uma lista de permissões atribuídas a eles. Isso permite orientar quem pode fazer o quê, mas também o que eles podem fazer, se você me seguir.

Joel Brown
fonte
Mas e se meu usuário tiver alguma função como gerente ou qualquer outra coisa e, por alguma razão, o mesmo usuário também precisar de uma permissão específica (que não está nessa função, nem em qualquer outra função sozinha)?
precisa
@levi - Se isso acontecer, uma maneira de lidar com isso é fazer um papel especial como "Permissões Especiais de Bob" , o que é um pouco complicado, mas resolve o problema desde que você não tenha muitas exceções, como isto. É possível que o que você pensa ser uma exceção individual possa realmente ser um novo papel sutil que você não considerou. O que acontece quando Bob sai? A substituição de Bob também precisa dessa permissão excepcional? Nesse caso, você realmente tem um papel com um membro, não uma exceção.
Joel Brown
@ Levi - Outra possibilidade é que você realmente precisa ter uma mistura de direitos individuais e de função. Nesse caso, sua ROLEtabela pode ser subtipada nos tipos Individual e Grupo , onde o tipo de grupo tem zero a muitos membros e o tipo individual tem exatamente um membro. Como você impõe essas regras de cardinalidade é com você. Isso pode ser feito declarativamente no esquema do banco de dados; nesse caso, você precisa alterar um pouco o esquema representado. Ou você pode usar a lógica do aplicativo. Nesse caso, seu esquema ainda se parece com o que eu imaginei acima.
Joel Brown