Un buon approccio per le autorizzazioni degli utenti di un'applicazione

-1

Ho un'app che ha più utenti. Nella mia app un utente può - creare contatti (persone) - modifica i contatti - guarda i contatti - creare una voce per l'agenda - visualizza la voce dall'agenda

Ho anche bisogno che l'Utente A possa visualizzare i contatti dell'Utente B ma non è autorizzato a modificare quel contatto.

L'utente B può visualizzare e modificare le voci dell'utente in Agenda. L'app avrà circa 10-15 permessi per ogni modulo (Agenda, Contatti, Documenti, EmailMarketing) e il numero di moduli può arrivare a circa 20

Diciamo che "Utente A" è un addetto alle vendite e "Utente B" è il responsabile delle vendite.

Di sicuro, ogni oggetto aziendale (contatto, voce agenda, ecc.) avrà un ID proprietario.

Qual è il miglior approccio / design patter / buone pratiche da utilizzare per gestire questa situazione?

    
posta catalinux 22.01.2014 - 09:51
fonte

1 risposta

2
  • Utilizza una tabella di database che codifica le autorizzazioni dell'utente per varie operazioni.
  • Scrivi un gestore degli accessi che si trova di fronte al DB.
  • Per ciascuna operazione potenzialmente limitata, innanzitutto verificare come condizione preliminare che l'accesso sia valido. Questo è troppo complesso per la maggior parte dei sistemi di tipi, quindi dovrà essere fatto come codice. Se l'accesso non è valido, lanciare un'eccezione o interrompere altrimenti.

Esempio:

abstract class BusinessObject {
  User owner;
  AccessManager access;
  ...
}

class Contact extends BusinessObject {
  void edit(User byUser) {
    access.validate(this, byUser, Operation.EDIT);
    ... // normal code
  }
}

class AccessManager {
  ...
  boolean check(BusinessObject subject, User user, Operation op) {
    // pseudocode
    results = db.execute("SELECT 1 FROM permissions WHERE subject=? AND user=? and operation=?", subject.id(), user.id(), op.id());
    return results.length > 0;
  }

  void validate(BusinessObject subject, User user, Operation op) {
    if (check(subject, user, op))
      return;
    throw AccessViolation(user + " does not have permission to " + op + " on " + subject);
  }
}

class Context {
  void execute() {
    try {
      someContact.edit(someUser);
    }
    catch (AccessViolation e) {
      logger.log(e);
      displayPrettyError("Sorry, you don't have permission to edit that contact. " +
                         "You can ask " + someContact.owner().name() + " for permission.");
    }
  }
}
    
risposta data 22.01.2014 - 10:34
fonte

Leggi altre domande sui tag