Zum Inhalt springen

Zugriff auf Objekte beschränken - Best Practice

Erstellt am 15. September 2015 · 4 Antworten · letzte Antwort am 18. September 2015

Tags: Frontend-Benutzer, Sicherheit, Frage

WonkoTheSane ·

Hallo,

wie kann ich den Zugriff auf Objekte am Besten beschränken. Beispiel: Ich möchte, dass ein Benutzer nur bestimmte Blogs bearbeiten kann (Bsp. Benutzer1>Blog1, Benutzer2>Blog2 usw).

Was ich bisher gemacht habe:

Ein Benutzer-Tabelle angelegt, die auf fe_users gemappt. Eine n:m-Relation von Blog zu Benutzer. In der ListAction des Contollers zum Bearbeiten lasse ich nur die Blogs des eingeloggten Benutzers anzeigen. Soweit OK.

Jetzt ergibt sich folgendes Problem: Ich logge mich als Benutzer1 ein. Es wird Blog1 angezeigt. Ich gehe auf bearbeiten und kopiere den Link aus dem Browser. Ich logge mich wieder aus und neu ein als Benutzer2. Blog1 wird nicht angezeigt, wenn ich aber den kopierten Link einfüge, kann ich auch Blog1 bearbeiten.

Wie verhindere ich das am Besten? Möglichst so, dass an zentraler Stelle die Zugriffsrechte geprüft werden und ich bei der Weiterentwicklung nicht durch Unachtsamkeit neue Lücken einbaue.

Danke und viele Grüße
Wonko

Donpeponi ·

Hallo,

du hast einen ObjectStorage für die Blogs?

Dann kannst du einfach beim aufruf der editAction eine Abfrage machen, ob der aktuelle User diesen Blog hält.

if($this->feUser->getBlogs()->contains($actualBlog)){
  ...render template
}else{
  .. mach etwas anderes (z.B. redirect)
}
WonkoTheSane ·

Dann muss ich nur in jeder Action die Rechte prüfen. Das geht halt gerne mal vergessen, wenn man später was ergänzt. Kann man das nicht an zentraler Stelle abfragen? Gibt es eine Möglichkeit, in der initializeAction zu prüfen, ob ein Blog übergeben wurde?

Donpeponi · · Beste Antwort

Du kannst das ganze in der initializeAction definieren oder auch ganz in einen Sicherheits Service z.B. auslagern.

Dort könntest du gleich auch Adminrechte überprüfen oder wie du willst.

public function initializeAction(){
  // den aktuell eingeloggten FE-User im ganzen Controller verfügbar machen
  $uid = $GLOBALS['TSFE']->fe_user->user['uid'];
  $this->feUser = $this->userRepo->findByUid($uid);

  if($this->request->hasArgument("blog")){
  	$blog = $this->request->getArgument("blog");
  	...
  }
}
WonkoTheSane ·

Danke, die Lösung habe ich jetzt umgesetzt.

Ein Hinweis noch:

$this->request->getArgument("blog");

liefert die ID, nicht den Blog. Aber den kann man sich ja mit findByUid im Repository suchen. 🙂