61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
# Controle de acesso a rotas sensíveis com base em ConfiguracaoSGMP e UsuarioSistema.
|
|
|
|
from __future__ import annotations
|
|
|
|
from functools import wraps
|
|
|
|
from django.contrib import messages
|
|
from django.http import HttpRequest
|
|
from django.shortcuts import redirect
|
|
|
|
from .models import ConfiguracaoSGMP, UsuarioSistema
|
|
|
|
|
|
def get_perfis_gerenciar_permissoes() -> list[str]:
|
|
"""Retorna os códigos de perfil autorizados a acessar /permissoes/ (config Admin)."""
|
|
cfg = ConfiguracaoSGMP.load()
|
|
perfis = cfg.perfis_gerenciar_permissoes
|
|
if not perfis:
|
|
return [UsuarioSistema.Perfil.ADMIN]
|
|
return list(perfis)
|
|
|
|
|
|
def usuario_pode_gerenciar_permissoes(usuario: UsuarioSistema | None) -> bool:
|
|
if not usuario or not usuario.ativo:
|
|
return False
|
|
perfis = get_perfis_gerenciar_permissoes()
|
|
return any(usuario.tem_perfil(p) for p in perfis)
|
|
|
|
|
|
def requer_acesso_gerenciar_permissoes(view_func):
|
|
"""
|
|
Exige login, UsuarioSistema ativo e perfil permitido pela ConfiguracaoSGMP.
|
|
"""
|
|
|
|
@wraps(view_func)
|
|
def wrapper(request: HttpRequest, *args, **kwargs):
|
|
if not request.user.is_authenticated:
|
|
messages.error(request, "Você precisa estar autenticado.")
|
|
return redirect("solicitacoes:login")
|
|
|
|
try:
|
|
usuario = UsuarioSistema.objects.get(
|
|
matricula=request.user.username,
|
|
ativo=True,
|
|
)
|
|
except UsuarioSistema.DoesNotExist:
|
|
messages.error(request, "Usuário não encontrado no sistema.")
|
|
return redirect("solicitacoes:login")
|
|
|
|
if not usuario_pode_gerenciar_permissoes(usuario):
|
|
messages.error(
|
|
request,
|
|
"Você não tem permissão para acessar o gerenciamento de permissões.",
|
|
)
|
|
return redirect("solicitacoes:dashboard")
|
|
|
|
request.usuario_sistema = usuario
|
|
return view_func(request, *args, **kwargs)
|
|
|
|
return wrapper
|