Ecco un'idea. Tecnicamente, forse entrambi non sono corretti. Forse il posto migliore per lo stato di accesso dell'utente e il ruolo da convalidare è un'istanza concreta di una classe Validator
.
Questo fa sorgere la domanda: cosa farebbe un ControllerValidator
nello scenario oltre a verificare se un utente ha effettuato l'accesso? Potrebbe testare cinque cose fondamentali su una richiesta HTTP da derivare se si tratta di una richiesta ragionevolmente buona o probabilmente di un attacco malevolo.
1) Ingressi minimi (sono stati inviati abbastanza controlli HTML?)
2) Ingressi massimi (sono stati inviati troppi controlli HTML?)
3) Input corretti (i controlli HTML hanno inviato quelli giusti?)
4) Codifica corretta (Tipicamente, è la codifica UTF-8, ma è ciò che vuoi / hai bisogno?). Questo controllo dovrebbe avere la sua classe di validatore di specialità. Inietti un'istanza di questo oggetto in tutti gli oggetti ControllerValidator
.
5) Dimensioni di input massime (c'è qualche input oltre la dimensione accettabile che avrebbe dovuto arrivare fino a questo punto?).
Quindi, la risposta è che i controllori dovrebbero controllare l'utente e il ruolo (perché è rilevante per la richiesta HTTP, che è il portatore del comando finale). Ricorda, la definizione di un URL HTTP consente l'autenticazione dell'utente. Quindi, controllare l'utente come parte della richiesta è un'attività legittima, anche se non si sta utilizzando l'autenticazione HTTP. La verifica del ruolo è semplicemente un'estensione dell'autenticazione dell'utente.
Ora, questo diagramma UML è solo un abstract. Tuttavia, cattura l'essenza di controllare l' intento di una richiesta HTTP (richiesta in buona fede o chiaramente malevola). Passano tutti i test di un ControllerValidator
oppure la richiesta viene rifiutata e terminata.
Tuttavia, osservando le tue esigenze, ci sarebbe una differenza tra PrivateControllerValidator
e CMSControllerValidator
. Ai primi non sarebbe permesso di fare il controllo dei ruoli. È così che vuoi davvero che sia? Mi sembra che un CMSControllerValidator
sia un PrivateControllerValidator
. Sei sicuro che un'istanza di PrivateControllerValidator
mai debba utilizzare il controllo del rotolo?
Aggiornamento : se disponi di un URL server Web di riscrittura e una classe Router
, inizialmente devi eseguire solo i cinque test precedenti per gli aspetti correlati alle intestazioni delle richieste HTTP. Una volta che hai testato abbastanza per inviare dati a Router
, puoi fare convalide specifiche della pagina nel modello (in PHP, questo include la convalida di $ _POST, $ _FILES, $ _GET, $ _COOKIE, o qualsiasi altra cosa).