# JSF Access Control



## smotron (8. Sep 2013)

Der Zugriff auf Bean Methoden erfolgt bei JSF ja über Referenzen durch EL. Wenn jetzt eine rollenbasierte Zugriffskontrolle implementiert werden soll, so stelle ich mir folgende Frage:

Wenn eine Komponente nicht gerendert wird, weil die Rolle keine Berechtigung dafür hat und diese Komponente wenn die Berechtigung ausreichend wäre z.B. eine action ausführen soll, also z.B. eine Managed Bean Methode aufruft, ist es dann unter Umständen möglich diese Methode auch ohne Berechtigung auszuführen?

Also beispielsweise zuerst abfangen eines Requests mit ausreichender Berechtigung und dann den Request mit nicht ausreichender Berechtigung Repeaten (wobei man dann die Session ID und ViewStateID anpassen müsste und die ViewState ID vermutlich dann wohl nicht konsistent wäre)?

Oder ist JSF auf irgendeine Weise geschützt dagegen? Meine Vermutung ist ja, dass wenn eine Komponente nicht gerendert wird diese auch nicht in der View von JSF vorhanden ist und deshalb ein Aufruf so einer Methode nicht möglich ist...
Wenn dem nicht so wäre, so könnte ja man ja mit manipulieren Requests alle Methoden von Managed Beans aufrufen, egal ob dazu eine Referenz mittels EL implementiert wurde oder nicht, oder?

Und falls das zutrifft, dann wäre eine Abfrage in den Business Methoden ob eine Rolle eine entsprechende Berechtigung hat nur ein zusätzlicher Sicherheitslayer, der in dem Fall dass dalle Komponenten korrekt gerendert bzw nicht gerendert werden nicht unbedingt nötig ist?


----------



## nillehammer (8. Sep 2013)

Schreibe bitte ein kleines Codebeispiel. Im Moment hört sich Deine Frage für mich so an, als wenn Du gedanklich Java-Methodenaufrufe mit Requests durcheinander würfelst. Ersteres ist nicht geschützt und muss es auch nicht, zweites ist geschützt und muss es auch, weil Requests die Schnittstelle der Anwendung zum Anwender sind.


----------



## smotron (8. Sep 2013)

xhtml:
...
<p:commandButton value="Test" actionListener="#{testBean.action}" id="test"  rendered="#{testBean.permitted}"/>
...
Bean:


```
@ManagedBean
@RequestScoped
public class TestBean {

private boolean permitted;

  @PostConstruct
  private void init(){
    if ( user hat rolle admin){
      permitted=true;
    }
    else
      permitted = false;
  }

  public void getPermitted{
    return permitted;
  }

  public void action{
    Und Action;
  }
}
```

Und als Ausführung zu meinem Beispiel jetzt:
Zuerst klickt ein User mit der Rolle Administrator auf den Button (ist gerendert, da ja die Rolle in Ordnung ist). Ein Request wird gesendet und die Methode ausgeführt. Nun wird dieser Request einfach mitgehört und kopiert.

Ein User ohne die Rolle Administrator kann den Button jetzt nicht sehen, da er ja nicht gerendert ist, aber schickt diesen kopierten Request jetzt trotzdem erneut ab. In diesem Fall dürfte dann unter keinen Umständen etwas ausgeführt werden, aber eben das ist meine Frage nur um sicher zu gehen (wobei natürlich wie vorher erwähnt nebenbei auch die ViewStateID nicht passen würde und zu einer ViewExpiredException führen sollte).

Wenn dem so ist, dann müsste es für ein Permission System theoretisch auch ausreichend sein sich nur auf das rendered Attribut zu verlassen und es wäre keine zusätzliche Überprüfung in den Business Methoden notwendig ob die aktuelle Rolle des Users zur Ausführung bemächtigt, oder? (Ist natürlich trotzdem ein guter zusätzlicher Layer vor allem für sensible Funktionen, aber mir gehts hier in erster Linie mal nur um die Theorie).


----------



## nillehammer (8. Sep 2013)

Ah ok, verstanden. Du müsstest die action-Methode tatsächlich noch separat per Annotation schützen. Hier ist ganz gut erklärt wie: https://blogs.oracle.com/enterprisetechtips/entry/improving_jsf_security_configuration_with


----------



## smotron (8. Sep 2013)

Sicher, dass das rendered Attribut nicht auch genügen müsste? Ich meine, JSF nimmt den Request entgegen und versucht den DOM Tree zu rekonstruieren. Der Button ist nicht gerendert, wird also nicht in den DOM tree den JSF erstellt aufgenommen und dennoch soll JSF eine action darauf aufrufen?
Wie geht denn JSF damit um? Am sinnvollsten wäre doch in diesem Fall wenn JSF die action einfach ignorieren würde!?


----------



## nillehammer (9. Sep 2013)

> Wie geht denn JSF damit um? Am sinnvollsten wäre doch in diesem Fall wenn JSF die action einfach ignorieren würde!?


Bin mir nicht sicher, dass ein Nicht-Rendern davor schützt, dass jemand den Form-Post nachbaut und absetzt. Immerhin ist die managed Bean ja vorhanden. Ich sehe keinen Grund, warum der Getter aufrufbar ist, die action-Methode aber nicht. Musst Du ausprobieren, da hören meine Detailkenntnisse von JSF auf... Vielleicht weiß es ja jemand anders.


----------

