Dove si applicano le regole di autorizzazione per la mia applicazione a più livelli?

8

Questa domanda riguarda l'applicazione delle regole della mia applicazione che mi confondono.

Il mio controller sta utilizzando il servizio e il servizio sta utilizzando il repository.

public class CommentController: ApiController{

    [HttpPost]
    public bool EditComment(Comment comment){
        commentService.Update(comment);
    }
}

public class CommentService{
    ICommentRepository repository;
    ....
    ....
    public void Update(Comment comment){
        repository.Update(comment);
    }
}

Se l'utente è autenticato, può aggiornare un commento.

  • Ma un utente dovrebbe modificare i propri commenti.

  • Ma un amministratore può modificare tutti i commenti.

  • Ma il commento non può essere modificato dopo una data specificata.

  • Modifica da un dipartimento

E ho qualcosa di simile a queste regole.

Se applico la regola "user editing own comment" nel livello di servizio, cambierò methot di aggiornamento e passeremo il parametro del controller User.Identity.Name,

public class CommentService{
    ICommentRepository repository;
    ....
    ....
    public void Update(string updatedByThisUser, Comment comment){
        // if updatedByThisUser is owner of comment
        repository.Update(comment);
    }
}

Ma, è vero cambiare le operazioni di servizio in base alla regola?

Sono confuso un po 'su dove posso applicare le regole. In controller o in servizio o nel repository.

Esiste un modo standard per farlo come i modelli di progettazione.

    
posta barteloma 27.01.2016 - 09:45
fonte

2 risposte

1

Vorrei

  • crea un PermissionService separato che implementa metodi come isUserAllowedTo(user, PermissionService.Permissiontype.Update, PermissionService.Topic.COMMENT, additionalContextRelevantParameters)
  • e chiama i metodi PermissionService nel controller, dove sono disponibili le informazioni di contesto necessarie (ad esempio dalla sessione).

È possibile progettare la propria architettura per chiamare il servizio di autorizzazione in CommentService. Ma vorrei che not lo raccomandi perché ciò aggiungerebbe delle dipendenze aggiuntive al servizio (ad es. La sessione) che rende il testing unitario del servizio molto più difficile

    
risposta data 27.01.2016 - 11:21
fonte
1

In primo luogo, prenditi del tempo per considerare di cosa sia effettivamente responsabile il servizio di commento. Ciò dipenderà dalle tue esigenze specifiche e forse anche dal tuo miglior giudizio.

Se la responsabilità del servizio commenti è limitata all'aggiornamento di qualsiasi commento , allora quello che hai scritto va bene. In questo caso, sarà necessario prendere in considerazione alcune altre logiche condizionali per verificare se è possibile aggiornare un determinato commento. Probabilmente lo farai nel controller, oppure potresti creare un sottoprogramma separato per verificare se un utente può pubblicare un commento. Potresti riutilizzarlo come pianifichi di riutilizzare il servizio di commento.

Se il servizio di commento è responsabile per l'aggiornamento dei commenti di un utente , il servizio diventa Aggiorna (Utente utente, Commento commento) e hai la flessibilità di controllare le regole aziendali all'interno del servizio stesso.

Ora che sei chiaro su quali sono le tue intenzioni progettuali, avrai chiarezza su come implementare la tua soluzione.

    
risposta data 26.05.2016 - 17:54
fonte

Leggi altre domande sui tag