Nella mia API di permessi, come gestisco oggetti che non esistono?

1

Elgg sta progettando un'API di autorizzazione liberamente attorno a Stream di attività modello. L'API utente potrebbe apparire (approssimativamente) come:

function elgg_can($capability, $subject = null, $object = null, $target = null) { ... }
  • $capability è una stringa
  • $subject è un oggetto utente
  • $object è l'oggetto eseguito su
  • $target è il contesto in cui l'azione si svolgerà

es. L'utente corrente può modificare il titolo di un oggetto?

if (elgg_can('edit title', $currentUser, $someObject)) {
    ...
}

Mi piacerebbe sapere un buon modo per gestire chiedere il permesso per creare oggetti . Se l'oggetto non esiste ancora, il sistema di permessi non può sapere nulla al riguardo, quindi c'è un problema dell'uovo di gallina con alcune ovvie soluzioni:

  1. Consenti il passaggio di una stringa al posto di $ oggetto (ad esempio, TypeName).
  2. Inserisci i metadati relativi all'oggetto nella funzionalità $. Per esempio. elgg_can("create PageObject", $currentUser, null, $group) .
  3. Chiedi all'utente API di creare l'oggetto e poi passarlo nell'API per decidere se continuare a esistere.

Mi manca un'altra soluzione ovvia? Ci sono modelli di permessi simili a questo (che si potrebbe ragionevolmente chiamare con successo) che gestiscono questo?

    
posta Steve Clay 15.07.2013 - 22:45
fonte

2 risposte

1

Sei sicuro che questo sia veramente un problema di permessi?

Esistono molti modelli di sicurezza a livello di oggetto esistenti, sia basati sui ruoli che basati su criteri, l'esempio più ovvio di ciò è l'ACL. Ogni oggetto può avere le proprie autorizzazioni, il che ha senso. Ma non c'è il permesso per "creare questo oggetto ", c'è solo un permesso per "creare un oggetto ". Potrebbero esserci delle restrizioni attorno al tipo di un oggetto che un utente può creare, ma di solito si tratta di ciò che accade.

Naturalmente, l'effettiva operazione di creazione di un oggetto potrebbe non riuscire per altri motivi. Ad esempio, l'oggetto potrebbe essere considerato un duplicato o potrebbe avere alcuni dati non validi o violare alcune regole importanti (un tweet troppo lungo, ad esempio). Non essere in grado, diciamo, di aggiungere una foto a un album fotografico che non possiedi, si tratta più di convalida della richiesta che di autorizzazioni sul (inesistente) oggetto.

Tra le opzioni che proponi, # 2 è probabilmente il più vicino alla modellazione delle autorizzazioni attuali senza fornire anche informazioni che non è possibile sapere per certo al momento (ovvero se la creazione di un oggetto o meno avrà successo). Lì non è un oggetto quando si effettua il controllo dei permessi, quindi se un utente può creare solo determinati tipi di oggetti, allora dovrebbe esserci un'autorizzazione diversa per ciascun tipo.

Potresti anche voler considerare che una funzione ultra-generica, taglia unica, sia spesso problematica proprio per questo motivo: ci sono sempre alcuni scenari che non si adattano e se cerchi di adattarli , si finisce con una specifica ambigua o difficile da usare. Ad esempio, un utente non dovrebbe essere in grado di porre la domanda, "Quali tipi di oggetti posso creare in questa posizione?" invece di doverlo calcolare uno per uno? Ovviamente non conosco tanto il dominio come te, ma consideri la possibilità che tu stia cercando di adattare 10 sterline in una busta da 5 libbre. Se l'API fosse più pulita avendo 2 o 3 o 10 funzioni invece di 1, l'espansione potrebbe essere la migliore risposta.

    
risposta data 14.09.2013 - 14:42
fonte
0

Usa lo schema del prototipo. In questo modello, crei un nuovo oggetto clonando un prototipo. Ovviamente ciò richiede che il prototipo esista. Solitamente non è una limitazione irragionevole, poiché nessun utente può creare oggetti casuali dal nulla. È improbabile che elgg_can("create BFG9000") funzioni per te: P

Poiché il prototipo deve esistere, può avere diritti di accesso.

    
risposta data 16.07.2013 - 14:01
fonte

Leggi altre domande sui tag