Django: Autenticação no site – Definir areas privadas e públicas

oraculum

Tagged:


Esses dias precisei de definir as areas que serão públicas e privadas no Projeto Galileu, pra mim como tudo o que tinha feito no django isso já estaria no “pacote” de instalação, mas para minha supresa esse processo deve ser feito na unha, postei na lista do django como fazer o processo e me indicaram um link que tinha um codigo de como fazer esses bloqueios, então para os que estão vindo agora não passarem pelo que passei segue-se um tuto passo-a-passo sobre como fazer isso, bem então vamos ao trabalho.

Na documentação oficial do Django é aconselhado a fazer o seguinte:

from django.contrib.auth.decorators import login_required 
 
@login_required
def listar(request):

Ou seja devemos colocar em cada uma das nossas views o seguinte parametro antes: “@login_required” com isso o django só vai permitir o acesso a quem tiver feito o Login, mas cá pra nós fazer isso em projeto pequeno tudo bem, agora imagine isso num projeto grande e ná hora de corrigir um bug você sem querer apaga  a linha, aí amigo você já sabe o que pode acontecer :(

Bem  a dica que recebi na lista foi fazer um Middleware e inclusive o user – Renato Garcia – me enviou um snipes com um código de um middleware que facilita um pouco as coisas, mas o código que foi passado não atendia muito pra mim, pois alí tinhamos que declarar todas as telas que deveríam ser bloqueadas para acesso público. Acontece que neste mundo há casos e casos e tem projetos que possuem 100 página públicas e 10 privadas e há outros casos que o quadro se inverte, como no meu caso.

Primeiro crie uma pasta na raiz do seu projeto:

middleware

Dentro dela crie o seguinte arquivo: tools.py

from django.http import HttpResponseRedirect
from django.conf import settings
import re
 
class LoginEnforce(object):
    """
    Middlware class which requires the user to be authenticated for all urls except
    those defined in PUBLIC_URLS in settings.py. PUBLIC_URLS should be a tuple of regular
    expresssions for the urls you want anonymous users to have access to. If PUBLIC_URLS
    is not defined, it falls back to LOGIN_URL or failing that '/accounts/login/'.
    Requests for urls not matching PUBLIC_URLS get redirected to LOGIN_URL with next set
    to original path of the unauthenticted request.
    Any urls statically served by django are excluded from this check. To enforce the same
    validation on these set SERVE_STATIC_TO_PUBLIC to False.
    """
 
    def __init__(self):
        self.login_url   = getattr(settings, 'LOGIN_URL', '/accounts/login/' )
        if hasattr(settings,'PUBLIC_URLS'):
            public_urls = [re.compile(url) for url in settings.PUBLIC_URLS]
        else:
            public_urls = [(re.compile("^%s$" % ( self.login_url[1:] )))]
        if getattr(settings, 'SERVE_STATIC_TO_PUBLIC', True ):
            root_urlconf = __import__(settings.ROOT_URLCONF)
            public_urls.extend([ re.compile(url.regex)
                for url in root_urlconf.urls.urlpatterns
                if url.__dict__.get('_callback_str') == 'django.views.static.serve'
            ])
        self.public_urls = tuple(public_urls)
 
    def process_request(self, request):
        """
        Redirect anonymous users to login_url from non public urls
        """
        try:
            if request.user.is_anonymous():
                for url in self.public_urls:
                    if url.match(request.path[1:]):
                        return None
                return HttpResponseRedirect("%s?next=%s" % (self.login_url, request.path))
        except AttributeError:
            return HttpResponseRedirect("%s?next=%s" % (self.login_url, request.path))

Depois disso precisamos apenas de acertar uns detalhes no nosso arquivo settings.py, vamos lá:

1 – Coloque a seguinte linha abaixo no seu arquivo:

PUBLIC_URLS = (
    r'accounts/login',
    r'usuario/registrar',
    r'$',
    r'inicial',
    r'contato',
    r'colabore',
    r'projeto',
)

Nesta parte do Public_URLS você vai declarar as urls que são públicas ou seja tudo que estiver ali não será necessario o login e para todo resto o usuário terá que fazer o login para visualizar a pagina. Com isso é só declarar o que será publico e o resto você não precisa se preocupar nunca mais.

Ainda não acabou vamos ao próximo passo no nosso settings.py.

2 – Vamos adicionar a nossa middleware na configuração do settings.py procure a parte abaixo no seu settings e adicione a nossa classe ficando assim:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'galileu.middleware.tools.LoginEnforce',
)

Atenção para a linha 5 onde você vai fazer ‘seuprojeto.middleware.tools.LoginEnforce’ e não Galileu como eu coloquei acima.

Qualquer dúvida ou problema é só postar aqui :)

Share Button

2 Comments

  1. Gustavo Henrique

    Legal seu artigo!
    Gostei do seu blog, já assinei o feed. Só um detalhe… o texto da página principal está sobrepondo o menu direito e aumentando o width da página (firefox 3.0.6/linux).
    Um abraço!

    Reply

  2. oraculum

    @Gustavo Henrique – Hei man muito obrigado pelo aviso do layout no firefox eu uso Opera então nem percebi o erro aqui no Opera está tudo ok, mas realmente no fire tava acontecendo esse bugzinho era nos códigos que eu postava o fire não quebrava a linha quando o texto estava na tag < pre > – Bugizinho do fire basico por isso prefiro o Opera.

    Todo caso agradeço a visita :)

    Reply

Leave a Reply