Django: Pergunta de autenticação completamente personalizada. Por favor ajude
-
21-09-2019 - |
Pergunta
Estou criando um aplicativo de vários inquilinos que não usará nenhum dos Admin Django padrão (exceto para uso interno que terá acesso a todos os inquilinos ... isso é simples o suficiente). Estou tentando criar um sistema de autorização próprio e não estou interessado em usar o modelo de usuário padrão (ou qualquer modelo de aplicativo interno). Meu aplicativo terá contas e cada conta terá administradores (teve que usar o administrador versus o usuário para fins de lixo). Esses usuários se autenticarão usando meu próprio sistema completamente personalizado. Isso está tudo errado. Devo/ainda posso usar o sistema de autenticação do Django em uma situação com vários tenantes que usa minha própria interface personalizada (como mencionado antes de não permitir que os titulares de contas usem a interface de administrador padrão). Existem implicações de segurança no uso do meu próprio sistema ou nos elementos de segurança padrão do Django, como a prevenção de seqüestros de sessão, me protege?
Parece-me que muito Django é construído em torno da idéia de usar a interface do administrador e não criar software SaaS de vários inquilinos com seu próprio administrador. Estou pensando nisso tudo errado?
Solução
Você definitivamente deve usar o Django Auth System, ele ainda faz 90% do que você precisa.
Eu construí o que se parece exatamente com o seu cenário em um projeto: contas corporativas, cada uma com usuário administrador e vários usuários regulares.
Aqui está a estrutura do modelo que usei:
class Account(models.Model): # represents copporate customer
admin = models.ForeignKey(User)
# other fields ...
class UserProfile(models.Model):
user = models.ForeignKey(User)
account = models.ForeignKey(Account)
E alguns exemplos de aplicação de requisitos de autorização no nível de exibição com decoradores personalizados:
@account_access_required # request.user.get_profile().account == account
def account_page(request, account_id):
# ...
@account_admin_required # request.user == account.admin
def account_users(request, account_id):
# ...
Na verdade, usamos subdomínios para contas, então não havia necessidade de explícito account_id
parâmetro.
É muito razoável usar interface personalizada para administradores de contas. A interface admin do Django destina-se apenas a usuários 100%cometidos, como administradores de sistema e equipe de suporte interno.