Wo gelten Autorisierungsregeln für meine mehrschichtige Anwendung?

8

Bei dieser Frage geht es darum, Regeln meiner Bewerbung anzuwenden, die mich verwirren.

Mein Controller verwendet den Dienst und der Dienst verwendet das 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);
    }
}

Wenn der Benutzer authentifiziert ist, kann er einen Kommentar aktualisieren.

  • Ein Benutzer sollte jedoch eigene Kommentare bearbeiten.

  • Ein Administrator kann jedoch alle Kommentare bearbeiten.

  • Ein Kommentar kann jedoch nach einem bestimmten Datum nicht mehr bearbeitet werden.

  • Von einer Abteilung bearbeiten

Und ich habe so etwas wie diese Regeln.

Wenn ich die Regel "Benutzer bearbeitet eigenen Kommentar" in der Serviceschicht anwende, ändere ich die Aktualisierungsmethode und übergebe den Parameter des Controllers User.Identity.Name,

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

Aber ändert sich der Servicebetrieb tatsächlich nach Regeln?

Ich bin etwas verwirrt darüber, wo ich die Regeln anwenden kann. Im Controller oder im Service oder im Repository.

Gibt es eine Standardmethode, um dies wie Designmuster zu tun?

Bartelom
quelle
Nach meiner Erfahrung ist es immer gut, eine Autorisierung auf Controller-Ebene anzuwenden. Sie würden ein Autorisierungsattribut wie folgt über den Namen der Controller-Klasse setzen: [Authorize(Roles="member, admin")]und jetzt sind alle Aktionsmethoden im Controller nur für Benutzer in der Rolle "Mitglied" oder "Administrator" zugänglich.
Alternatex
1
Wenn ich meinen Dienst jedoch für Desktop-Projekte und MVC-Website-Projekte verwenden muss, sollte ich die Autorisierungsregeln für alle Projekte erneut anwenden.
Barteloma

Antworten:

1

Ich würde

  • Erstellen Sie einen separaten PermissionService, der Methoden wie implementiert isUserAllowedTo(user, PermissionService.Permissiontype.Update, PermissionService.Topic.COMMENT, additionalContextRelevantParameters)
  • und rufen Sie die PermissionServiceMethoden in der Steuerung auf, in der die erforderlichen Kontextinformationen (dh aus der Sitzung) verfügbar sind.

Sie können Ihre Architektur so gestalten, dass der Berechtigungsdienst im CommentService aufgerufen wird. Ich würde dies jedoch nicht empfehlen, da dies dem Dienst (dh der Sitzung) zusätzliche Abhängigkeiten hinzufügen würde, die das Testen des Dienstes durch Einheiten wesentlich schwieriger machen

k3b
quelle
1

Nehmen Sie sich zunächst etwas Zeit, um zu überlegen, wofür der Kommentarservice tatsächlich verantwortlich ist. Dies hängt von Ihren spezifischen Anforderungen und möglicherweise sogar von Ihrem eigenen Urteilsvermögen ab.

Wenn die Verantwortung des Kommentardienstes auf die Aktualisierung eines bestimmten Kommentars beschränkt ist , ist das, was Sie geschrieben haben, gut. In diesem Fall müssen Sie eine andere bedingte Logik berücksichtigen, um zu überprüfen, ob ein bestimmter Kommentar aktualisiert werden kann. Sie werden dies wahrscheinlich in der Steuerung tun, oder Sie können ein separates Subsystem erstellen, um zu überprüfen, ob ein Benutzer einen Kommentar veröffentlichen kann. Sie können dies genauso wiederverwenden, wie Sie den Kommentarservice wiederverwenden möchten.

Wenn der Kommentardienst für die Aktualisierung der Kommentare eines Benutzers verantwortlich ist , wird Ihr Dienst zu Aktualisieren (Benutzerbenutzer, Kommentarkommentar) und Sie haben die Flexibilität, Geschäftsregeln innerhalb des Dienstes selbst zu überprüfen.

Nachdem Sie sich über Ihre Entwurfsabsichten im Klaren sind, haben Sie Klarheit darüber, wie Sie Ihre Lösung implementieren können.

Preis Jones
quelle