Ho cercato di progettare un'API RESTful e ho avuto risposta alla maggior parte delle mie domande, ma c'è un aspetto delle autorizzazioni con cui sto lottando.
Diversi ruoli possono avere permessi diversi e diverse rappresentazioni di una risorsa. Ad esempio, un amministratore o l'utente stesso possono visualizzare più campi nella propria rappresentazione utente rispetto a un altro utente con privilegi inferiori. Ciò si ottiene semplicemente modificando la rappresentazione sul back-end, ovvero: decidendo se includere o meno tali campi.
Inoltre, alcune azioni possono essere intraprese su una risorsa da alcuni utenti e non da altri. Ciò si ottiene decidendo se includere o meno tali elementi di azione come collegamenti, ad esempio: modifica ed eliminazione dei collegamenti. Un utente che non dispone delle autorizzazioni di modifica non avrà un collegamento di modifica.
Questo copre quasi tutti i miei casi di utilizzo dei permessi, ma ce n'è uno che non ho ancora capito. Esistono alcuni scenari in cui per una determinata rappresentazione di un oggetto, tutti i campi sono visibili per due o più ruoli, ma solo un sottoinsieme di quei ruoli sono stati modificati per determinati campi.
Un esempio:
{
"person": {
"id": 1,
"name": "Bob",
"age": 25,
"occupation": "software developer",
"phone": "555-555-5555",
"description": "Could use some sunlight.."
}
}
Dato 3 utenti: un amministratore, un utente normale e Bob stesso (anche un utente normale), ho bisogno di essere in grado di trasmettere al front-end che:
Gli amministratori possono modificare tutti i campi, Bob stesso può modificare tutti i campi, ma un utente normale, mentre possono visualizzare tutti i campi, può solo modificare il campo della descrizione. Certamente non voglio che il cliente debba fare la determinazione (o anche, se è per questo, avere qualche nozione dei ruoli coinvolti) ma ho bisogno di un modo per il back-end per trasmettere al cliente quali campi sono modificabili.
Non posso semplicemente usare una combinazione di rappresentazione (i campi restituiti per la visualizzazione) e i collegamenti (indipendentemente dal fatto che sia disponibile o meno un collegamento di modifica) in questo scenario poiché è più finemente granuloso.
Qualcuno ha risolto questo problema elegantemente senza aggiungere la logica direttamente al client?