Associer un rôle à un utilisateur¶
Objectif : construire et valider l'association utilisateur ↔ rôle.
Ce que vous allez apprendre : create_auth_user_role(user_id, role_id) construit
et valide une association AuthUserRole que l'application persiste ensuite dans
user_roles.
Premier palier du niveau avancé de la progression RBAC.
Module opt-in
Ce starter suppose forge-mvc-rbac installé. La démo ne persiste pas
l'association (pas de base).
Ce que ce starter montre¶
create_auth_user_role(user_id, role_id)→AuthUserRolevalidé ;- la clé logique
user_id:role_id; - la validation sans persistance (démo).
Classes Forge utilisées¶
| Classe / fonction | Rôle dans ce starter | Référence |
|---|---|---|
forge_mvc_rbac.create_auth_user_role |
Construire et valider une association user/role. | RBAC |
Tester¶
Ouvrez https://localhost:8000/rbac-user-role?user_id=1&role_id=2.
Le contrôleur¶
Créez le contrôleur mvc/controllers/rbac_user_role_controller.py :
# mvc/controllers/rbac_user_role_controller.py
from core.http.request import Request
from core.http.response import Response
from core.mvc.controller.base_controller import BaseController
from forge_mvc_rbac import create_auth_user_role
class RbacUserRoleController(BaseController):
"""Starter pédagogique : construire une association utilisateur ↔ rôle."""
@staticmethod
def index(request: Request) -> Response:
try:
user_id = int(request.query("user_id") or 1)
role_id = int(request.query("role_id") or 2)
association = create_auth_user_role(user_id, role_id)
context = {
"user_id": association.user_id,
"role_id": association.role_id,
"key": f"{association.user_id}:{association.role_id}",
}
except Exception as exc:
context = {"error": str(exc)}
return BaseController.render("rbac_user_role/index.html", context=context, request=request)
Comprendre ce code¶
create_auth_user_rolevalide le couple (entiers positifs) et renvoie un objet
; il ne touche pas la base.- La persistance est le job de l'application : on insère le couple dans
user_roles. - Une même personne peut cumuler plusieurs associations (plusieurs rôles).
La vue¶
Créez la vue mvc/views/rbac_user_role/index.html :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Associer un rôle à un utilisateur - Forge</title>
</head>
<body>
<h1>Associer un rôle à un utilisateur</h1>
<form method="get" action="/rbac-user-role">
<label>user_id <input type="number" name="user_id" value="{{ user_id or 1 }}"></label>
<label>role_id <input type="number" name="role_id" value="{{ role_id or 2 }}"></label>
<button type="submit">Construire l'association</button>
</form>
{% if error %}
<p data-level="error"><strong>{{ error }}</strong></p>
{% else %}
<p data-level="success">Association valide : <code>{{ key }}</code>
(user_id={{ user_id }}, role_id={{ role_id }}).</p>
{% endif %}
<p>L'objet est validé mais <strong>pas persisté</strong> ici : en production, on
l'enregistre dans <code>user_roles</code>.</p>
</body>
</html>
La route¶
Ajoutez l'import et la route dans le groupe public de mvc/routes.py :
# mvc/routes.py
from mvc.controllers.rbac_user_role_controller import RbacUserRoleController
with router.group("", public=True) as public:
public.add("GET", "/rbac-user-role", RbacUserRoleController.index, name="rbac_user_role_index")
À retenir¶
- L'association user ↔ rôle est un objet validé, persisté par l'application.
- La table cible est
user_roles. - Le package valide ; il ne décide pas du stockage.
Après ce starter¶
La suite : résoudre les permissions effectives d'un utilisateur.