The Inventory Management System implements a role-based access control (RBAC) system with three predefined roles. Each role has specific permissions that determine which operations users can perform.
Roles are defined in the database and assigned to users during account creation. The system uses the @require_role decorator to enforce permissions at the API endpoint level.Location: backend/User/Domain/role.py
class Role(Base): """Entidad Rol del sistema.""" __tablename__ = "roles" id = Column(Integer, primary_key=True, autoincrement=True, index=True) name = Column(String(50), unique=True, nullable=False, index=True) description = Column(String(255), nullable=True)
PREDEFINED_ROLES = [ {"name": "admin", "description": "Acceso total: gestión de usuarios, auditoría y todas las funcionalidades."}, {"name": "gestor", "description": "Gestiona productos, lotes, entradas, salidas y reportes. Sin administración de usuarios."}, {"name": "consultor", "description": "Solo lectura en todas las secciones del sistema."},]
Full system access including user management, audit logs, and all CRUD operations.
Capabilities:
Full user management (create, read, update, deactivate)
Access to audit logs and system monitoring
Manage products, batches, inventory movements
Manage suppliers and customers
Generate and view all reports
System configuration
Example Permissions:
# User Management (user_controller.py)@router.route('/', methods=['GET'])@require_role('admin') # line 23def list_users(): """Lista todos los usuarios. Solo admin."""@router.route('/', methods=['POST'])@require_role('admin') # line 62def create_user(): """Crea un nuevo usuario. Solo admin."""# Audit Logs (audit_controller.py)@require_role('admin')def get_audit_logs(): """Access system audit logs"""
Roles and the default admin user are automatically created on system initialization:From user_service.py:101-136:
@staticmethoddef seed_roles_and_admin(db) -> None: """Precarga los roles predefinidos y crea el usuario admin inicial.""" role_repo = RoleRepository(db) user_repo = UserRepository(db) # Crear roles si no existen for role_data in PREDEFINED_ROLES: existing = role_repo.get_by_name(role_data["name"]) if not existing: role = Role(name=role_data["name"], description=role_data["description"]) role_repo.create(role) logger.info("Rol '%s' creado.", role_data["name"]) # Crear usuario admin inicial si no existe admin_user = user_repo.get_by_username(DEFAULT_ADMIN["username"]) if not admin_user: admin_role = role_repo.get_by_name("admin") if admin_role: admin = User( id=str(uuid.uuid4()), username=DEFAULT_ADMIN["username"], email=DEFAULT_ADMIN["email"], password_hash=generate_password_hash(DEFAULT_ADMIN["password"]), active=True, role_id=admin_role.id, ) user_repo.create(admin)