Rest API e autorizzazione risorsa

2

Il modo in cui ho creato la mia pausa API è il seguente:

/api/users/{id}
/api/users/{id}/items/{itemId}

Ma ho anche URI come questo:

/api/items/{itemId}

È un po 'di confusione su come gestire l'autorizzazione dell'oggetto in questo caso.

Non voglio inviare tutte le richieste di una risorsa all'URI / api / users / {id} / items / {itemId} , ma voglio anche assicurarmi che un utente non può accedere ad un articolo a cui non è associato.

La mia idea è di utilizzare AOP e, per ogni richiesta di / api / items / {itemId} , ottenere l'utente dal token di autenticazione JWT e decidere se l'utente è autorizzato a accedi all'articolo specificato.

Questo approccio è ok, o ci sono alternative migliori?

    
posta user1437649 02.04.2017 - 12:10
fonte

3 risposte

3

Sì, il tuo approccio è OK e comunemente usato.

In effetti, se modelli il tuo codice giusto, probabilmente utilizzerai lo stesso codice per l'autorizzazione all'accesso per entrambi i casi.

Esempio molto semplificato:

public Item getUserItem(int userId, int itemId) {
    Item item = loadItem(itemId);

    if (userId != item.ownerId()) {
        // fail, access not allowed
    }

    return item;
}

// URI: /api/users/{id}/items/{itemId}

Item getForUser(int id, int itemId) {
    return getUserItem(id, itemId);
}

--------------------------------

// URI: /api/items/{itemId}

Item get(int itemId) {
    return getUserItem(
        JwtParser.parse(headers.Authorization).userId,
        itemId
    );
}
    
risposta data 02.04.2017 - 13:47
fonte
1

Potresti utilizzare un punto di applicazione della politica REST (PEP) che richiama un punto di decisione (PDP) di politica esterna (motore di autorizzazione) che deciderà per te in base all'ID utente e all'ID risorsa se l'accesso dovrebbe essere concesso . REST PEP potrebbe essere un intercettore di messaggi o un'annotazione sul codice.

    
risposta data 04.04.2017 - 05:03
fonte
0

Nel primo caso, cosa mi impedisce all'utente 1 di inviare / api / users / 2 / items / 121442 e ottenere un elemento a cui non posso accedere?

Se invii credenziali come intestazioni http (ad esempio) come è comune, non è necessario inviarle anche nella richiesta. Quindi avresti / api / items / 121442 e richiedi le intestazioni USER_ID = Johndoe e USER_PASSWORD = 12345 (ovviamente crittografato e usa https). Non è necessario inviare l'id utente nella richiesta uri così come è già noto, e ancora meglio il tuo sistema di autenticazione può cambiarlo da un id (ad esempio un nome utente come qui) a un id (1) che è noto solo al tuo sistema interno , fornendo una maggiore sicurezza.

    
risposta data 03.04.2017 - 08:51
fonte

Leggi altre domande sui tag