Posso usar Autenticação Básica HTTP com Django?

votos
34

Temos um site em execução no Apache, cujo acesso tem um número de páginas estáticas protegidas via HTTP autenticação básica.

Eu escrevi uma nova parte do site com Django usando Django suporte embutido para gerenciamento de usuários.

O problema que tenho é que os usuários têm de login uma vez através da autenticação básica HTTP e, em seguida, novamente usando um formulário de login Django. Isso tanto desajeitado e muito confuso para os usuários.

Eu queria saber se alguém tinha encontrado uma maneira de fazer log Django um usuário em usar o HTTP informações de autenticação Basic.

Eu não esperava para passar uma senha para Django, mas se um usuário davefoi autenticado pelo Apache, então eles devem ser automaticamente conectado ao Django como davetambém.

(Uma opção seria fazer Apache e Django compartilhar um armazenamento de usuário para garantir nomes de usuário e senhas comuns, mas isso ainda envolveria dois prompts de login que é o que estou tentando evitar.)

Publicado 30/09/2008 em 09:34
fonte usuário
Em outras línguas...                            


6 respostas

votos
30

Por apenas apoiar autenticação básica em alguns pedidos (e não sujar com o servidor web - que é como alguém pode interpretar o seu título da pergunta), você vai querer olhar aqui:

http://www.djangosnippets.org/snippets/243/

Respondeu 06/07/2009 em 16:48
fonte usuário

votos
21

Este foi adicionado à versão 1.3 Django. Consulte a documentação mais atual para este aqui: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

Respondeu 04/05/2011 em 01:42
fonte usuário

votos
9

Fazer check-out ligações de Oli. Você basicamente ver o nome de usuário autenticado como verificado por autenticação básica HTTP no Django, olhando para request.META [ 'REMOTE_USER'].

Update: Testado o patch proposto por ticket # 689 , que está disponível up-to-date no repositório git do telenieko aqui . Aplica-se de forma limpa, pelo menos na revisão 9084 do Django.

Ative a autenticação backend usuário remoto

  • adicionando o RemoteUserAuthMiddlewaredepoisAuthenticationMiddleware
  • adicionando a configuração AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

Se você usar lighttpd e FastCGI como eu, ativar mod_auth, criar credenciais para um usuário de teste (eu o chamei testusere definir 123como a senha) e configurar o site Django para exigir autenticação básica.

O seguinte urls.pypode ser usado para testar a configuração:

from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
    url(regex='^$',
        view=lambda request: HttpResponse(repr(request), 'text/plain')),

    url(regex='^user/$',
        view=lambda request: HttpResponse(repr(request.user), 'text/plain')),

    url(regex='^users/$',
        view=lambda request: HttpResponse(
            ','.join(u.username for u in User.objects.all()),
            'text/plain')),
)

Depois de recarregar lighty eo servidor Django FCGI, carregando a raiz do site agora pede para autenticação e aceita as testusercredenciais, e em seguida, gera um despejo do objeto de solicitação. Em request.META essas novas propriedades devem estar presentes:

'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'

A /user/URL pode ser usada para verificar se você está de fato logado como testuser:

<User: testuser>

E a /users/URL agora lista o automaticamente adicionado testuser(aqui o adminusuário que eu tinha criado ao fazer syncdbtambém é mostrado):

admin,testuser

Se você não deseja corrigir Django, é trivial para retirar o RemoteUserAuthBackende RemoteUserAuthMiddlewareclasses em um módulo separado e consulte que nas configurações do Django.

Respondeu 01/10/2008 em 08:36
fonte usuário

votos
3

httpauth.py . Eu ainda sou um newb completo com Django para que eu não tenho nenhuma idéia de como ele se encaixa exatamente, mas deve fazer o que você está procurando.

Edit: aqui está um fio bug mais sobre o assunto .

Respondeu 30/09/2008 em 09:39
fonte usuário

votos
0

Esta parece ser uma tarefa para o costume AuthenticationBackend- ver documentação Django sobre este assunto , djangosnippets.org tem alguns exemplos da vida real de tal código (ver 1 ou 2 ) (e isso não é realmente uma coisa difícil).

AuthenticationBackend subclasses tem que ter apenas 2 métodos definidos e seu código é bastante simples: um tem que retornar objeto Usuário por ID de usuário, o segundo tem que executar credenciais verificar e retornar objeto Usuário se as credenciais são válidas.

Respondeu 01/10/2008 em 10:14
fonte usuário

votos
0

Porque o Django pode ser executado de várias maneiras, e somente versão ModPython dá-lhe uma estreita integração com Apache, eu não acredito que há um caminho para Django para você entrar básicas sobre autenticação básica do Apache. Autenticação realmente deve ser feito ao nível da aplicação, uma vez que vai dar-lhe muito mais controle e será mais simples. Você realmente não quer o incômodo de compartilhar um userdata entre Python e Apache.

Se você não se importa com uma versão corrigida do Django, então há um patch no http://www.djangosnippets.org/snippets/56/ que lhe dará alguns middleware para suportar autenticação básica.

Autenticação básica é realmente muito simples - se o usuário não está logado você retornar um 401 autenticação código de status necessário. Isso leva o navegador para exibir uma caixa de login. O navegador, em seguida, fornecer o nome de usuário e senha como cordas bas64 codificado. A entrada wikipedia http://en.wikipedia.org/wiki/Basic_access_authentication é muito bom.

Se o patch não faz o que você quer, então você poderia implementar básica auth-se muito rapidamente.

Respondeu 30/09/2008 em 21:55
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more