Estensione dell'ACL con regole più sofisticate nell'API REST web

4

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.

    
posta ibi0tux 26.11.2016 - 21:10
fonte

1 risposta

1

Parte del dolore che senti con la sicurezza della tua API è che ha il livello sbagliato di granularità. Se è necessario consentire a un utente di "aggiornare il proprio profilo utente", è necessario esporre tale operazione specifica sull'API distinta da "aggiornamento (qualsiasi) profilo utente". L'applicazione client dovrebbe chiamare l'operazione appropriata. Quindi puoi verificare l'autorizzazione a fare quell'operazione in modo dichiarativo e negarla sul bordo di sicurezza prima che entri nel codice del controller.

Ad esempio: se il client richiede PUT /api/<update (any) user's profile> { profileid: ... } . Cerchi le loro autorizzazioni (ad es. Rivendicazioni) per "aggiorna (qualsiasi) profilo utente". Non riuscendo a trovarlo, sono negati al confine di sicurezza. Considerando che potrebbero essere autorizzati a "aggiornare il proprio profilo utente", quindi un PUT /api/<update user's own profile> {...} verrebbe passato al controller per quell'operazione. Non dovrai nemmeno specificare un ID profilo di destinazione per questa operazione, perché puoi ottenerlo dai loro dati di autenticazione.

REST non sta semplicemente esponendo il tuo database su HTTP né mappando i verbi HTTP alle operazioni CRUD (o almeno non dovrebbe esserlo). Un'API è lì per focalizzare i clienti sulle operazioni di livello superiore. Guardarlo in questo modo rende anche più semplice la sicurezza ... proteggi l'operazione, non modifiche specifiche dei dati.

Nota: intenzionalmente non ho usato convenzioni di denominazione specifiche per le operazioni del profilo di cui sopra. Lascerò a qualcun altro il compito di discutere le convenzioni appropriate per gli endpoint REST non-entità.

Ecco un'altra risposta di recente che potrebbe aiutarti.

    
risposta data 01.02.2017 - 20:21
fonte

Leggi altre domande sui tag