[3.2] Sicherheitslösung MultiFileUpload

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

[3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 26.02.2016, 19:51:10

Hi!

Ich habe ein wenig im Tracker gestöbert und bin auf Eintrag 133 (http://tracker.adventure-php-framework. ... php?id=133) gestossen.
Dort ist die Rede von einem Provider, welcher die Rechte prüft.

Wie muss ich mir grundsätzlich so einen Provider vorstellen? Was macht ein Provider, wie ist der aufgebaut, an welche Regeln muss ich mich halten? Ich würde mich darum gerne kümmern, ebenso würde ich im Anschluss noch die Doku aus dem Wiki in die offizielle Doku integrieren. Das Tutorial würde ich aber im Wiki belassen.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dr.e. » 28.02.2016, 15:09:09

Hi dave,

die grobe Idee war, dass du einer Action einen Provider in der Konfiguration zuweisen kannst - z.B. per

Code: Alles auswählen

[SecuredAction]
ActionClass = ""
AccessCheckProvider = "My\Namespace\CheckUserAccessProvider"
der vor dem Aufruf von run() bzw. isActive() noch den entsprechenden Provider fragt ob die Action überhaupt aufgerufen werden darf. Andere Idee war, der Action (Interface Action) noch eine weitere Methode zu geben - z.B. callAllowed() -, die prüft, ob die Action aufgerufen werden darf.

Die Trennung von Action und Permission-Check würde mehr Flexibilität bei der Implementierung bedeuten, da ich einen Permission-Check für mehrere Actions nutzen kann. Hilft dir das?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 28.02.2016, 19:36:13

Ja, das hilft erstmal, vielen Dank. Ich mache mir ein paar Gedanken und melde mich dann wieder.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 09.03.2016, 20:30:19

Ich habe mir das nun etwas durch den Kopf gehen lassen und einen ersten Test durchgeführt.

Leider scheitere ich im Moment daran, dass zur Ausführungszeit der Context nicht bekannt ist. Aber normalerweise muss dieser bekannt sein.
Ich versuche einmal meinen Aufruf bis zur Problemstelle zu skizzieren:

In meiner Bootstrap habe ich einen zusätzlichen Aufruf meiner Test-Action:

Code: Alles auswählen

$fC->addAction('DATA\actions\WEB', 'Test'); 
Die Ausführungszeit der Test-Action habe ich auf TYPE_PRE_TRANSFORM gesetzt:

Code: Alles auswählen

protected $type = self::TYPE_PRE_TRANSFORM; 
Im Frontcontroller habe ich in der Funktion addAction ein paar Zeilen ergänzt, welche zum einen nach der zusätzlichen Konfigurations-Einstellung gucken und entsprechend dann die Permission via UMGT über eine zusätzliche Klasse HasPermissionProvider prüft. Und genau zu diesem Zeitpunlkt ist der Context nicht bekannt.

Ist aber an sich unlogisch, denn in meiner Bootstrap rufe ich exakt eine Zeile zuvor die AutoLoginAction vom UMGT auf, welche mich einloggt (und wo der Context bekannt ist?). Irgendwas haut nicht richtig hin, ich sehe aber auch im Moment nicht wirklich weiter, vllt. sind einfach wieder zu viele Bäume im Weg ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dr.e. » 10.03.2016, 10:49:56

Hi dave,

wie erzeugst du denn den HasPermissionProvider? Ist bei diesem vielleicht die Kette unterbrochen, die den Context bzw. die Language mit gibt? Sofern du alle Objekte über den ServiceManager oder den DIServiceManager erzeugst sollte das kein Problem geben.

Hoffe das hilft! :)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 10.03.2016, 17:36:19

In der Tat, da war natürlich der Hund begraben.
Ich erzeuge ihn jetzt über den ServiceManager, damit klappt natürlich alles.

Da waren gestern wirklich zu viele Bäume im Weg ;) Danke für den Denkanstoss.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dr.e. » 10.03.2016, 17:43:34

Gerne! Freut mich! :)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 10.03.2016, 20:12:56

Ich würde in dem Zusammenhang gleich 2 Provider von Hause aus bereitstellen, die der Programmierer dann nutzen kann.
Diese würde ich wie die Validatoren im Tools-Ordner bereit stellen.
Allerdings wären das UMGT-spezifische Permission-Provider. Einer fragt den Status "eingeloggt" ab, ein anderer eine vorhandene Berechtigung. Wäre der Ablageort tools in dem Fall denn dann sinvoll?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dr.e. » 10.03.2016, 20:46:46

Hallo dave,

sofern der Provider zum UMGT gehört, würde ich ihn auch dort ablegen.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 11.03.2016, 00:10:50

Nabend Christian,
alles klar! Ich habe eine erste Version fertig, meine Test waren erfolgreich. Ich denke, ich werde es am Samstag via GitHub mal zur Ansicht online stellen können. Ich habe mir das Thema mal im Tracker zugeschoben :)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 11.03.2016, 19:42:54

Erste Version jetzt verfügbar:

https://github.com/der-dave/APF-code-3. ... 810299de37

Funktionsweise:
Die *.actionconfig.ini kann nun um die beiden optionalen Parameter PermissionProvider und PermissionValue erweitert werden:

Code: Alles auswählen

[TestPermission]
ActionClass = "DATA\actions\WEB\TestAction2"
PermissionProvider = "APF\modules\usermanagement\biz\provider\permission\HasPermission"
PermissionValue = "add-preis"
Ich liefere zwei Provider von Hause aus mit:
- APF\modules\usermanagement\biz\provider\permission\LoggedIn
- APF\modules\usermanagement\biz\provider\permission\HasPermission

LoggedIn
Prüft anhand des UMGT den Status des Users. Ist dieser eingeloggt, wird die Action ausgeführt. Der zusätzliche Parameter PermissionValue ist in dem Fall nicht nötig.

HasPermission
Prüft anhand des UMGT, ob der User eine bestimmte Permission hat. Die Permission muss über den Parameter PermissionValue überliefert werden.

Für eigene Berechtigungen steht das Interface PermissionProvider unter "APF\modules\usermanagement\biz\provider" zur Verfügung. Die eigene Klasse muss vom PermissionProvider ableiten, sonst wird über den Frontcontroller eine Exception geworfen, ist dies nicht der Fall.

Aus Performance-Gründen wird die Action nur in den ActionStack aufgenommen, sollte die Permission vorhanden sein.

Übrigens: Es ist natürlich egal, wie die Action aufgerufen wird. Normal oder per DIServiceManager. Ist ein entsprechender Provider in der Config angegeben, wird der überprüft. Das ganze funktioniert für statische und dynamische Actions. :)

Eine Action selbst kennt nun auch noch den Zusatand isAllowed neben isActive. Damit kann in der Action selbst nochmal nach einer Berechtigung etc. gefragt werden (bei Spezialfällen). Liefert isAllowed true zurück, wird die Action ausgeführt. In allen anderen Fällen nicht. Das entspricht ja genau der Funktionsweise von isActive - nur heisst es eben nun isAllowed ;)


Feedback sehr gerne! Ich habe keine Ahnung, ob die Vorgehensweise so richtig ist. Ich bin absoluter Beginner was OOP angeht, habe mir diesbezüglich auch extra nochmal einige Artikel durchgelesen, um den Frontcontroller und die Arbeitsweise verstehen zu können.

Einziges Manko ist noch, dass für den Vorgang die Action vom Typ TYPE_PRE_TRANSFORM oder später sein muss. Vorher ist der Context ja nicht bekannt. Wie ich das nun noch prüfen kann und notfalls eine Exception werfen kann, weiss ich nicht -> Anregungen?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dr.e. » 12.03.2016, 14:02:58

Hallo dave,

vielen Dank für deine Arbeit! :)

Habe die Änderungen reviewed und mir ein paar Gedanken zum Einsatz bzw. zu Anwendungsszenarien gemacht. Ich schlage vor, den Berechtigungscheck im Frontcontroller vom konkreten Anwendungsfall im UMGT zu trennen. Grund: wenn ich den Frontcontroller nutzen möchte, aber das UMGT nicht, habe ich keine Chance das sauber zu trennen bzw. bin unweigerlich mit dem UMGT "verheiratet".

Alternativ könnte man mit einfachen Mitteln "nur" das Action-Interface um die Methode allowExecution() erweitern um bei der Ausführung zusätzlich zu prüfen. Die Implementierung des Rechte-Checks erfolgt dann direkt in der Action für den konkreten Anwendungsfall. Gefällt mir persönlich besser, da du dann Ausführungskontext und Anwendungsfall noch besser separieren kannst. Dann würde ein einfaches

Code: Alles auswählen

if ($this->actionStack[$offset]->getType() == $type
                && $this->actionStack[$offset]->isActive()
               && $this->actionStack[$offset]->allowExecution()
          ) { 
schon als Change reichen.

Habe dir auf GitHub ein paar Kommentare und Vorschläge zu den einzelnen Code-Stellen hinterlassen.
Einziges Manko ist noch, dass für den Vorgang die Action vom Typ TYPE_PRE_TRANSFORM oder später sein muss. Vorher ist der Context ja nicht bekannt. Wie ich das nun noch prüfen kann und notfalls eine Exception werfen kann, weiss ich nicht -> Anregungen?
Das habe ich noch nicht verstanden. Warum funktioniert das nicht? Du setzt doch den Context und die Sprache in der index.php vor dem Start des Frontcontroller, oder?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dave » 14.03.2016, 19:44:54

Hi Christian,
Danke für deine Anmerkungen!
dr.e. hat geschrieben: Habe die Änderungen reviewed und mir ein paar Gedanken zum Einsatz bzw. zu Anwendungsszenarien gemacht. Ich schlage vor, den Berechtigungscheck im Frontcontroller vom konkreten Anwendungsfall im UMGT zu trennen. Grund: wenn ich den Frontcontroller nutzen möchte, aber das UMGT nicht, habe ich keine Chance das sauber zu trennen bzw. bin unweigerlich mit dem UMGT "verheiratet".
Ja, mit der Trennung Action - UMGT hast du Recht, das habe ich angepasst.
Meine Idee war, über die Action-Config noch einen bestimmten Berechtigungs-Wert mitzugeben, der dann vom PermissionCheck geprüft wird.
Wenn nun jedoch mein Interface PermissionCheck

Code: Alles auswählen

interface PermissionCheck {
   public function hasPermission();
}
so aussieht, kann ich den Wert aus der Config ja nicht mehr übergeben. Je nach Provider kann damit dann ja alles geprüft werden. Die Verbindung zum UMGT ist nur ein Beispiel.

dr.e. hat geschrieben: Alternativ könnte man mit einfachen Mitteln "nur" das Action-Interface um die Methode allowExecution() erweitern um bei der Ausführung zusätzlich zu prüfen. Die Implementierung des Rechte-Checks erfolgt dann direkt in der Action für den konkreten Anwendungsfall. Gefällt mir persönlich besser, da du dann Ausführungskontext und Anwendungsfall noch besser separieren kannst. Dann würde ein einfaches

Code: Alles auswählen

if ($this->actionStack[$offset]->getType() == $type
                && $this->actionStack[$offset]->isActive()
               && $this->actionStack[$offset]->allowExecution()
          ) { 
schon als Change reichen.
Daran habe ich schon gedacht und die Funktion isAllowed eingeführt. Wir können diese natürlich in den Namen allowExecution ändern :) Leider habe ich gleichzeitig den Namen auch nochmal in der Funktion addAction verwendet. Das hat evtl. zu etwas Verwirrung gesorgt. Das habe ich angepasst.
dr.e. hat geschrieben:
Einziges Manko ist noch, dass für den Vorgang die Action vom Typ TYPE_PRE_TRANSFORM oder später sein muss. Vorher ist der Context ja nicht bekannt. Wie ich das nun noch prüfen kann und notfalls eine Exception werfen kann, weiss ich nicht -> Anregungen?
Das habe ich noch nicht verstanden. Warum funktioniert das nicht? Du setzt doch den Context und die Sprache in der index.php vor dem Start des Frontcontroller, oder?
Das ist natürlich Quatsch von meiner Seite her. Habe mich da ein wenig verrannt. Alles Ok, Context ist sofort vorhanden.


Hier einmal meine Änderungen auf GitHub:
https://github.com/der-dave/APF-code-3. ... 71dc814d74

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dr.e. » 16.03.2016, 14:14:25

Hallo dave,

danke für deine Rückmeldung und deine Anpassungen! :) Habe es leider noch nicht geschafft mir die neue Implementierung anzusehen. Hole das so schnell als möglich nach - spätestens am Wochenende!
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.2] Sicherheitslösung MultiFileUpload

Beitrag von dr.e. » 21.03.2016, 13:25:08

Hallo dave,

Asche über mein Haupt, habe es am Wochenende wieder nicht geschafft zu antworten - sorry. :( :roll:
Ja, mit der Trennung Action - UMGT hast du Recht, das habe ich angepasst.
Das passt, danke!
Daran habe ich schon gedacht und die Funktion isAllowed eingeführt. Wir können diese natürlich in den Namen allowExecution ändern :) Leider habe ich gleichzeitig den Namen auch nochmal in der Funktion addAction verwendet. Das hat evtl. zu etwas Verwirrung gesorgt. Das habe ich angepasst.
Genau. Allerdings sehe ich noch keine Änderung im Action-Interface, damit du auch

Code: Alles auswählen

$this->actionStack[$offset]->allowExecution() 
abfragen kannst. Wo finde ich das?
Das ist natürlich Quatsch von meiner Seite her. Habe mich da ein wenig verrannt. Alles Ok, Context ist sofort vorhanden.
Super! :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste