---
suivi: 1086
date: 2026-07-30
sujet: Fix AuthorizesRequests — contrôleurs foncier (500 prod)
chantier: module-foncier
type: fix
statut: poussé
hash: ca614c52
fichiers:
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - app/Http/Controllers/Foncier/OffreFonciereController.php
  - tests/Feature/Foncier/FoncierAuthorizeRequestsFixTest.php
  - tests/Feature/Foncier/FoncierAuthorizeRequestsSourceTest.php
  - docs/suivi/SUIVI_1086_fix_authorize_controllers_foncier.md
---

## PROMPT ENVOYÉ

SUIVI #1086 — fix 500 prod `authorize()` indisponible sur contrôleurs foncier
(récidive exacte du #1040). Audit exhaustif puis pattern ERP `AuthorizesRequests`.

## PHASE 1 — DIAGNOSTIC

### 1. Action concernée (prod L152 — décalé depuis)
Prod : `DossierFoncierController.php:152` → aujourd’hui les `$this->authorize`
sont aux L167 (`show`/`view`), L231 (`edit`/`update`), L281 (`update`),
L314 (`syncHabilitations`/`manageHabilitations`).
Le 500 frappe dès qu’un utilisateur **atteint** l’action (créateur sur show,
etc.) : la fonctionnalité est morte, pas de fuite (authorize ne s’exécute pas).

### 2. Audit exhaustif `$this->authorize` / Foncier/

| Fichier:ligne | Appel | Trait présent AVANT fix |
|---------------|-------|-------------------------|
| DossierFoncierController.php:167 | authorize('view') | **NON** |
| DossierFoncierController.php:231 | authorize('update') | **NON** |
| DossierFoncierController.php:281 | authorize('update') | **NON** |
| DossierFoncierController.php:314 | authorize('manageHabilitations') | **NON** |
| OffreFonciereController.php:20 | authorize('update') store | **NON** |
| OffreFonciereController.php:55 | authorize('update') update | **NON** |
| OffreFonciereController.php:79 | authorize('update') repondre | **NON** |
| OffreFonciereController.php:119 | authorize('view') show | **NON** |
| OffreFonciereController.php:135 | authorize('view') showDirect | **NON** |

Autres contrôleurs Foncier (Secteur, Parcelle, Proprietaire, AlerteAdmin,
CommuneSearch, FoncierCommentaire, FoncierController) : **aucune** occurrence
`$this->authorize` / `authorizeResource` / `Gate::`.
`$user->can(...)` dans DossierFoncierController show (L185–186) : OK via trait
User `Authorizable`, hors bug contrôleur.
Aucun contrôleur d’acte (#1085 non livré).

### 3. Pattern ERP (repris, pas inventé)
Base `Controller` vide (Laravel 11+). Convention #1040 / TacheSuivi* /
AssistantProposition / Projet / AppelOffre :
`use Illuminate\Foundation\Auth\Access\AuthorizesRequests;` + `use AuthorizesRequests;`
sur la classe. **Pas** de 3ᵉ mécanique.

### 4. Policy DossierFoncier
Enregistrée dans `AppServiceProvider` (`Gate::policy`). Invoquée **uniquement**
via `$this->authorize` / `$user->can` sur ces contrôleurs. Comme authorize
plantait, la policy **n’a jamais été exercée en prod** sur les actions show/
edit/update/habilitations/offres depuis le déploiement #1075/#1078 — sauf
chemins qui échouaient avant (scope → 404) sans atteindre authorize.

## PHASE 2 — CORRECTION
Ajout du trait sur `DossierFoncierController` et `OffreFonciereController`.
Aucun affaiblissement ACL ; scope #1075 inchangé.

## Tableau actions × tests

| Action | Contrôleur:ligne | Mécanisme | Test route | Autorisé / non |
|--------|------------------|-----------|------------|----------------|
| show | Dossier:167 | policy view | FoncierAuthorizeRequestsFixTest | 200 créateur / 404 tiers |
| edit | Dossier:231 | policy update | idem | 403 lecture seule |
| update | Dossier:281 | policy update | idem + AclTest | 403 lecture seule |
| syncHabilitations | Dossier:314 | manageHabilitations | idem | redirect créateur / 403 lecture / 404 tiers |
| offres.store | Offre:20 | policy update | idem | redirect créateur / 404 tiers |
| (source) | les 2 Ctrl | trait Reflection | FoncierAuthorizeRequestsSourceTest | method_exists authorize |

## Closures
Aucune ajoutée.

## Bundles
Aucun `.vue` — pas de rebuild.

## DÉPLOIEMENT
`git pull origin main` · `php artisan optimize:clear` (ou `view:clear`) —
pas de migration / journal.

## LEÇON
Le #1040 a corrigé **un** contrôleur (Aktor) sans garde-fou systématique : le
#1075 a recopié `$this->authorize` sans le trait. `php -l` est aveugle.
Contrôle désormais : test source + `method_exists(..., 'authorize')` /
Reflection sur chaque contrôleur Foncier qui appelle authorize, et audit grep
« `$this->authorize` ⇒ AuthorizesRequests dans le même fichier » à chaque lot
policy.
