permissões
TRANSCRIPT
Permisses no Django
Uma pincelada no tema
Algumas definies
Por padro o Django vem com um sistema, uma app, de controle de autenticao e permisses:
django.contrib.auth
Algumas definies
O django.contrib.auth uma app plugvel que j vem habilitada por
padro no arquivo de configuraes settings.py (na tupla de
installed_apps)
Algumas definies
Essa app, alm de controlar a parte de login e o acesso ao admin
padro do Django, tambm permite atribuir permisses por Usurio e por
Grupo de Usurios as models das apps disponveis no admin (auth,
sites e de suas apps que esto habilitadas na tupla de
installed_apps no arquivo settings.py)
E como faz para testar ?
Para testar, acesse o admin com um usurio com atributos de Membro
da Equipe (is_staff) e com Status de Super Usurio (is_superuser) e
crie um novo usurio.
Ob: Este novo usurio que voc ir criar, precisar ter o atributo
Membro da Equipe (is_staff) setado pois isso que caracteriza a
capacidade de se logar no admin, mesmo que o Status de Super Usurio
esteja atribuido.
As permisses
Por padro, o Django disponibiliza 3(trs) tipos de permisses padres
para o acesso a uma model:
- can_change (pode modificar/alterar objetos daquela model.) -
can_add (pode adicionar objetos naquela model.) - can_delete (pode
deletar objetos daquela model.)
As permisses
Essas permisses podem ser atribuidas programaticamente, ou atravs
do admin, para isso, basta editar no admin o usurio e atribuir as
permisses em questo para a model especfica. Exemplo de atribuio de
permisso programaticamente:
from minhaApp.models import MinhaModel
from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(MinhaModel)
permission = Permission.objects.create(codename='can_change', name='Can Change', content_type=content_type)
As permisses
Ob: Tambm possivel criar novas permisses customizadas, setando uma
tupla chamada permissions em uma MetaClass de sua Model, por
exemplo:
class MinhaModel(models.Model): titulo = models.CharField(max_length=100) class Meta: permissions = ( ("pode_ver", "S pode ver"), )
As permisses
Ao acessar o objeto em questo pode-se verificar a existncia da
permisso:
if user.has_perm('minhaApp.pode_ver'): # faz alguma coisa.
ou
if group.has_perm('minhaApp.pode_ver'): # faz alguma coisa.
As permisses
As permisses tambm podem ser checadas em funes(ou mtodos) das
views:
from django.contrib.auth.decorators import permission_required @method_decorator(permission_required('minhaApp.pode_ver')) def meu_metodo(self, *args, **kwargs): # faz alguma coisa
As permisses
E tambm no template:
{% if perms.minhaApp.pode_ver %} Contedo que eu posso ver {% endif %}
As permisses
E quando o django sabe que existe estas permisses ?, quando ele carrega elas ? O segredo est no middleware da app django.contrib.auth
Este middleware est declarado no settings.py na tupla de MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = ( ..... 'django.contrib.auth.middleware.AuthenticationMiddleware', .....)
As permisses
Ao excutar este middleware o Django carrega todos os backends de permisso, que estiverem registrados na varivel AUTHENTICATION_BACKENDS (que uma tupla com o path completo para as classes que implementam os backends de permisso.)
Esta varivel est localizada no global_settings.py da instalao do django contendo o valor padro ('django.contrib.auth.backends.ModelBackend',). E aqui neste backend que a mgica de carregar as permisses acontece.
Esta varivel poder ser redefinida no settings.py do projeto no caso de voc querer utilizar por exemplo o django-guardian (uma app que possibilita a configurao de permisses por instncias de objetos e no somente por Models) mas o django-guardian assunto para a prxima conversa.
CLIQUE PARA EDITAR O FORMATO DO TEXTO DO TTULO
Clique para editar o formato do texto da estrutura de tpicos2. Nvel da estrutura de tpicos3. Nvel da estrutura de tpicos4. Nvel da estrutura de tpicos5. Nvel da estrutura de tpicos6. Nvel da estrutura de tpicos7. Nvel da estrutura de tpicos