Autenticação do usuário Django vindo do Apache.

Uma vez que manter múltiplos banco de dados de autenticação é um problema comum quando se trata do Apache, você pode configurar o Apache para autenticar diretamente no Django authentication system. Isso requer o Apache versão >= 2.2 e mod_wsgi >= 2.0. Por exemplo você poderia:

  • Servir arquivos estáticos/media diretamente do Apache para usuários autenticados

  • Autenticar o acesso a um respositório Subversion para usuários Django com uma certa permissão.

  • Possibilita certos usuários a conectar a um compartilhamento WebDav criado com mod_dav.

Nota

Se você instalou um custom User model e quer usar a autenticador padrão, ele tem que ter um atributo is_active. Se quer usar autoriações baseadas em “grupo”, seu usuário personalizado deve ter uma relação chamada ‘groups’, referenciando um objeto relacional que tenha o campo ‘name’. Você ainda pode especificar seu próprio autenticador mod_wsgi personalizado se sua personalização não puder atingir esses requerimentos.

Autenticação com mod_wsgi

Nota

O uso do WSGIApplicationGroup %{GLOBAL} nas configurações abaixo presume que a instância de Apache está rodando somente uma aplicação Django. Se estiver rodando mais de uma aplicação Django, por favor refira-se a seção Defining Application Groups da documentaçao mod_wsgi para maiores informações sobre essa configuração.

Certifique-se que o mod_wsgi está instalado e ativo e que seguiu os passos para configuração Apache with mod_wsgi.

Depois, altere a configuração do Apache para adicionar um local que queira que somente usuários autenticados sejam capazes de ver:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    Require valid-user
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>

A diretiva WSGIAuthUserScript diz ao mod_wsgi para executar função check_password no script wsgi especificado, passando o usuário e senha que recebeu do “prompt”. Neste exemplo, o WSGIAuthUserScript é o mesmo que o WSGIScriptAlias que é quem define sua aplicação that is created by django-admin startproject.

Usando Apache 2.2 com autenticação

Certifique-se que mod_auth_basic e o mod_authz_user estão “carregados”.

Esses podem ser compilados estaticamente dentro do Apache, ou é necessário usar o LoadModule para carregá-los dinamicamente no seu httpd.conf:

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so

Finalmente, altere seu script WSGI mysite.wsgi para conectar a autenticação do Apache ao mecanismo de autenticação do seu site importando a função check_password:

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

from django.contrib.auth.handlers.modwsgi import check_password

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

Requisições começando com /secret/ não requererão autenticação do usuário.

O mod_wsgi access control mechanisms documentation fornece detalhes adicionais e finromações sobre métodos alternativos de autenticação.

Autorização co mod_wsgi e grupos do Django

O mod_wsgi também fornece funcionalidade para restringir membros de um grupo a um local particular.

Neste caso, a configuração do Apache se pareça com essa:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
    WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
    Require group secret-agents
    Require valid-user
</Location>

Para suportar a diretiva WSGIAuthGroupScript, o mesmo script WSGI mysite.wsgi deve importar também a função groups_for_user que retorna uma lista de grupos aos quais o usuário pertence.

from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user

Agora as requisições para /secret/ irão requerer que o usuário seja membro do grupo “secret-agents”.