sgmp/solicitacoes/acesso.py

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