Pergunta

Eu tenho vindo a explorar os detalhes de Django para cerca de uma semana agora e gosto do que vejo. No entanto eu vim em cima de algum .. negatividade em relação ao controle de grão fino de permissões para a interface CRUD.

O que eu estou escrevendo é uma gestão de clientes web-app Intranet. A organização é de cerca de 6 camadas, e eu preciso restringir o acesso a grupos de clientes com base em camadas. Em contínua expansão. Eu tenho uma boa idéia de como eu vou fazer isso, mas não tenho certeza se vou ser capaz de integrá-lo bem na interface de administração pré-construído.

Eu fiz absolutamente Django desenvolvimento zero caso contrário eu provavelmente teria uma idéia melhor sobre se isso iria funcionar ou não. Eu provavelmente não vai usar Django se a interface de administração gerado vai ser inútil para este projecto -. Mas como eu disse, há uma forte dependência de permissões personalizadas de grão fino

Will Django deixe-me construir personalizados de permissões / regras e integrá-lo perfeitamente na interface de administração CRUD?

Atualização One:. Eu quero usar o aplicativo de administração para minimizar a repetição de interfaces CRUD gerando, então sim, eu considerá-lo um deve ter

Atualização Dois:

Eu quero descrever as permissões necessárias para este projeto.

Um cliente pode pertencer a uma ou várias das lojas ". empregados a tempo inteiro só deve ser capaz de editar clientes em sua loja (mesmo se eles pertencem a uma outra loja). No entanto, eles não devem ser capazes de ver os clientes / editar em outra loja. Casuals só deve ser capaz de clientes vista com base no que armazenar eles estão rostered também (ou se o casual está logado como o usuário loja - mais provável).

Gerenciamento acima deles precisa ser capaz de ver todos os funcionários para as lojas que gerem, nada mais.

A administração sênior deve ser capaz de funcionários editar todos e conceder permissões abaixo si mesmos.

Depois de ler a documentação do Django, ele diz que você não pode (autmoatically) definir permissões para um sub-conjunto de um grupo. Apenas o grupo inteiro. É fácil o suficiente para zombar de suas próprias permissões para esta finalidade?

Foi útil?

Solução

Se eu ler seus requisitos atualizados corretamente, eu não acho que sistema de autenticação existente de Django será suficiente. Parece que você precisa de um sistema ACL full-on.

Este assunto surgiu uma série de vezes. Tente googling em django + acl.

amostragens aleatórias ...

Houve um Summer of Code projeto um par de anos atrás, mas eu não tenho certeza de onde tiraram a. Consulte http://code.djangoproject.com/wiki/GenericAuthorization

Há um bilhete fresco no djngoproject.org que podem ser interessantes:

Há alguns recortes de código interessantes sobre dumpz.org:

... mas há zero docs.

Boa sorte!

Outras dicas

sistema de permissões O Django totalmente governa. Cada modelo tem um padrão definido de permissões. Você pode adicionar novas permissões para seus modelos, também.

Cada usuário tem um conjunto de permissões, bem como os membros do grupo. Os usuários individuais podem ter permissões individuais. E eles herdam as permissões de sua participação no grupo.

As suas funções de exibição (e modelos) pode facilmente verificar a presença ou ausência de essas permissões em qualquer nível de granularidade que você precisa usar.

E se isso não for suficiente para você, o perfil add-on dá-lhe ainda mais opções para a definição de um "Usuário" e as suas capacidades, permissões, papéis, responsabilidades, etc.

E se isso não for suficiente para você, você pode definir seus próprios esquemas de autenticação.


O que é importante é não tentar definir grupos que são subconjuntos reais dos usuários, nem casualmente títulos ou funções definidas. Você nunca precisa "definir permissões para um sub-conjunto de um grupo". Você precisa ter grupos menores. Grupos definidos em torno de subconjuntos de pessoas.

permissões padrões do Django estão em torno de acesso modelo, não remar acesso dentro de um modelo. Por outro lado, o problema é de cerca de subconjuntos de linhas em vários modelos:. Cliente, loja, empregado, gerente

Você vai precisar de um conjunto básico de FK de entre esses itens, e alguns filtros para subdividir as linhas. Você pode ter problemas para fazer isso com páginas de administração padrão. Você pode precisar a sua própria versão do administrador para fazer uso de filtros especializados.


Se você não pode fazê-lo com o sistema de permissão Django, você deve repensar seus casos de uso. A sério.

[A interface Django-DESCANSO, no entanto, é um outro animal inteiramente, e requer algum cuidado e alimentação.]

ModelAdmin objetos têm métodos has_add_permission, has_change_permission, has_delete_permission e queryset que podem ser usadas para impor permissões em torno do que o usuário logado pode ver e modificar - você pode criar uma subclasse que utiliza para impor o que quer que permissões você deseja implementar e registrar todos os seus modelos com o aplicação admin usando sua subclasse.

No entanto, tudo depende de como exatamente seu sistema de permissões vai funcionar - quais são as necessidades exatas que caem fora de suas permissões de grão fino? Quanto mais você se move longe do que a aplicação admin foi projetado para fazer, mais trabalho que vai demorar, mas há um monte de ganchos lá que você pode usar para implementar suas necessidades personalizadas. Aqui está um post no blog de Luke Planta que dá exemplos de alguns dos bom- sintonizando você pode fazer sem ter que cavar muito fundo.

Será que absolutamente tem que ser baseada em torno da aplicação admin? vistas genéricos e ModelForms pode cuidar de um monte de pedaços tediosos envolvidos na Implementando CRUD, então ser Desconfie de ficar muito preso a personalização admin - é quase uma tradição Django começar por ficar pendurado no aplicativo admin eo que ele pode e não pode fazer, inicialmente pensando que você nunca vai ter que escrever qualquer código novamente;)

De Django 1.2 não há suporte para permissões de nível de linha, que django-guarda marcas muito intuitivo de manusear.

Você também pode querer ter um olhar para os granulares-permissões monkeypatch: http://code.google.com/p/django-granular-permissions/

Ele adiciona permissões de nível de linha para sistema de permissões do Django.

Eu apenas encontrei http://bitbucket.org/jezdez/django-authority/ , parece promissor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top