Sto lavorando a una piccola applicazione cercando di comprendere i principi della progettazione guidata dal dominio. In caso di successo, questo potrebbe essere un pilota per un progetto più ampio. Sto cercando di seguire il libro "Implementing Domain-Driven Design" (di Vaughn Vernon) e sto cercando di implementare un forum di discussione simile e semplice. Ho anche controllato i campioni IDDD su github. Ho delle difficoltà ad adottare l'identità e l'accesso al mio caso. Vorrei fornire alcune informazioni di base:
- Comprendo (si spera) il ragionamento alla base della separazione degli utenti e della logica dei permessi: è un dominio di supporto ed è un contesto limitato diverso.
- Nel dominio principale, non ci sono utenti, solo autori, moderatori, ecc. Questi vengono creati raggiungendo il contesto di identità e accesso utilizzando un servizio e quindi traducendo gli oggetti utente ricevuti in e moderatore.
Le operazioni di dominio vengono chiamate con un ruolo correlato come parametro: ad es .:
ModeratePost( ..., moderator);
Il metodo dell'oggetto dominio controlla se l'istanza del moderatore fornita non è nulla (l'istanza del moderatore sarà nulla se l'utente richiesto dal contesto Identità e accesso non ha il ruolo di moderatore).
In un caso, effettua un controllo aggiuntivo prima di modificare un Post:
if (forum.IsModeratedby(moderator))
Le mie domande sono:
In quest'ultimo caso, i problemi di sicurezza non vengono nuovamente integrati nel dominio principale? In precedenza il libro indica "con chi può pubblicare un argomento o a quali condizioni è consentito. Un forum deve solo sapere che un autore lo sta facendo proprio ora".
L'implementazione basata sul ruolo nel libro è abbastanza semplice: quando un Moderatore è il dominio principale cerca di convertire l'ID utente corrente in un'istanza del Moderatore o in un Autore quando ne ha bisogno. Il servizio risponderà con l'istanza appropriata o null se l'utente non ha il ruolo richiesto. Tuttavia, non riesco a vedere come potrei adattarlo a un modello di sicurezza più complesso; il nostro attuale progetto per cui sto pilotando ha un modello piuttosto complesso con gruppi, ACL, ecc.
Anche con regole non molto complesse, come ad esempio: "Un post dovrebbe essere modificato solo dal suo proprietario o da un editore", questo approccio sembra fallire, o almeno non vedo il modo corretto di implementarlo.
Chiedere al contesto Identity and Access un'istanza di OwnerOrEditor non sembra corretto e finirei con un numero sempre maggiore di classi relative alla sicurezza nel dominio principale. Inoltre, dovrei passare non solo l'ID utente, ma l'identificatore della risorsa protetta (l'id del post, il forum, ecc.) Al contesto di sicurezza, che probabilmente non dovrebbe interessare a queste cose (è corretto? )
Estraendo i permessi dal dominio principale e controllandoli nei metodi degli oggetti del dominio o nei servizi, finirò al punto di partenza: mescolare i problemi di sicurezza con il dominio.
Ho letto da qualche parte (e tendo a concordare con esso) che queste cose relative alle autorizzazioni non dovrebbero far parte del dominio principale, a meno che la sicurezza e le autorizzazioni non siano il dominio stesso stesso. Una semplice regola come quella sopra giustificata rende la sicurezza parte del dominio principale?
HasPermissionToEdit(userId, resourceId)
ma non mi sento giusto contaminare la logica del dominio con queste chiamate. Probabilmente dovrei controllare questi nei metodi di servizio dell'applicazione, prima di invocare la logica del dominio?
UserService @AccessControlList[inf3rno]
nella risposta a cui mi sono collegato.