Attualmente sto lavorando a un progetto API REST e sto cercando un modo per aggiungere una gestione ACL avanzata, oltre a ciò
Consideriamo ad esempio che ho una rotta che è la seguente:
/profile/{user}
Diciamo che questa rotta potrebbe essere chiamata con i metodi GET o PUT. Il metodo GET ha un controller per visualizzare il profilo utente, mentre il metodo PUT dovrebbe essere usato per aggiornare i dati del profilo utente corrispondente.
Con ACL standard, come fornisce la maggior parte delle librerie, è facile definire qualcosa del tipo:
/profile/{user} , GET -> Role::*
/profile/{user} , PUT -> Role::user
che significa che il metodo GET per il percorso non richiede alcun ruolo ed è "pubblico", mentre il metodo metodo PUT è disponibile solo se il
il cliente ha il ruolo user
.
Ora vorrei arricchire questo meccanismo per controllare l'identità esatta dell'utente. In effetti, sembra logico che solo il proprietario di un account possa modificare il profilo, non gli altri utenti e date le regole precedenti, niente lo proibisce a meno che non venga effettuato un ulteriore controllo (tipicamente nel controller).
Il mio suggerimento è di essere in grado di scrivere regole come questa:
/profile/{user} , PUT -> Role::user, Session::user == {user}
In questo modo, per accedere a questo percorso, l'utente corrente deve avere il ruolo user
ma l'id dell'utente deve essere uguale al parametro del percorso.
Questo potrebbe anche essere esteso più in generale, ad esempio con un modello di dati post
che sarebbero post in un'applicazione, in cui tutti i post hanno un autore (che è un utente)
e solo gli autori possono modificare i propri post:
/post/{post} , PUT -> Role::user, Session::user == {post}.author
So che tali pratiche sono scoraggiate da alcune persone che sostengono che si tratta di una logica di business più della semplice logica di sicurezza di accesso, ma non sono d'accordo.
Considerando che sto progettando di sviluppare una libreria per gestire questo ACL avanzato, mi piacerebbe sapere cosa ne pensi di questo modo di pensare e se conosci alcuni framework o applicazioni che già utilizzano tale meccanismo.