Pergunta

Nós 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 a autenticação informações HTTP Basic.

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

(Uma opção seria fazer Apache e Django share 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.)

Foi útil?

Solução

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 /

Outras dicas

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/

Do confira os links 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 para bilhete # 689 , que está disponível up-to-date em telenieko é git repositório aqui . Aplica-se de forma limpa, pelo menos, sobre a revisão 9084 de Django.

Ative o backend autenticação de usuário remoto

  • adicionando o RemoteUserAuthMiddleware após AuthenticationMiddleware
  • adicionando o AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',) configuração

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

A seguir urls.py pode 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 credenciais testuser, 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'

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

<User: testuser>

E a URL /users/ agora lista o testuser automaticamente adicionado (aqui o usuário admin eu tinha criado ao fazer syncdb também é mostrado):

admin,testuser

Se você não deseja corrigir Django, é trivial para separar as classes RemoteUserAuthBackend e RemoteUserAuthMiddleware em um módulo separado e consulte que nas configurações do Django.

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 longo fio bug sobre o assunto

.

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 log-lo 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 em http: //www.djangosnippets.org/snippets/56/ que lhe dará alguns middleware para suportar autenticação básica.

auth básico é 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ê pode implementar autenticação básica se muito rapidamente.

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

subclasses AuthenticationBackend 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 objeto de retorno usuário se as credenciais são válidas

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