# (JSF) Wie am besten einzelne Seiten schützen?



## raptor (23. Aug 2007)

Hallo,

ich habe hier eine kleine Anwendung mit Hilfe eines Tutorials erstellt. Einstiegsseite ist im Prinzip ein Login-Formular. Dort gibt der Benutzer seine Daten ein und wird ggfls. eingeloggt. Die Daten kommen aus einer MySQL Datenbank, in der auch noch Rollen und Berechtigungen der Benutzer gespeichert sind.
Jetzt soll es so sein, dass ich für jede JSP/JSF-Seite angeben soll, welche Berechtigung dafür notwendig ist um dann dem Benutzer den Zugriff zu ge- oder verwähren. 

Wie stelle ich das am Besten an?


----------



## DaKo (23. Aug 2007)

http://www.google.de/search?hl=de&q=jsf+filter&btnG=Google-Suche&meta=


----------



## ms (23. Aug 2007)

Eine Möglichkeit wäre JAAS: 
http://java.sun.com/products/jaas/overview.html
Ist zwar nicht ganz easy bis es läuft aber quasi der Standard.

Hier noch ein kleines Beispiel für Tomcat:
http://www.kopz.org/public/documents/tomcat/jaasintomcat.html

ms


----------



## raptor (23. Aug 2007)

Kann mir jemand nur ganz kurz beschreiben, wie das mit den Filtern abläuft? Also nur die reine Funktionsweise, den Rest würde ich mir dann schon selber angucken. Danke.


----------



## ms (23. Aug 2007)

Der Client sendet einen Request.
Bevor dieser Request dein Servlet erreicht muss er durch den Filter. Der Filter entscheidet ob der Request weiter an das Servlet geleitet wird oder in deinem Fall z.B. auf eine Fehlerseite.

ms


----------



## raptor (23. Aug 2007)

Ah. Okay. Sehr hilfreich. Danke.


----------



## raptor (28. Aug 2007)

Ich hab mir jetzt mal mit diesem Artikel ein wenig über Filter angeeignet.
Aus einem früheren JSF Tutorial habe ich in der Anwendung jetzt eine Login-Seite mit einem zugehörigen LoginBean als Session scoped managed bean. 
Wie kann man denn diese beiden Sachen miteinander kombinieren?

Sorry, aber ich werde hier ohne großartige Schulung oder auch nur eine geringste Einführung in das Java EE Thema geworfen und an manchen Stellen finde ich es etwas schwer, den Überblick zu behalten und die nötigen Infos aus dem Netz zu ziehen.

edit: hm, okay. Habe hier einen Lösungsansatz gefunden: http://forum.java.sun.com/thread.jspa?threadID=5203762&tstart=135
Nun muss ich nur noch wissen, wie ich nach dem Login, das UserBean in die Session schreibe...


----------



## y0dA (28. Aug 2007)

Hi!
Also benutzt du nun einen Filter, welche bei jedem Request überprüfen soll, ob der Benutzer eingeloggt ist? Wenn dem so ist, könntest du deine UserBean auch gleich im Filter hinterlegen.

Oder du schreibst sie in die Session:


```
HttpServletRequest httpReq = (HttpServletRequest) req;

UserBean userBean = new UserBean();
userBean.setUser("blah");
userBean.setLogin(true);
userBean.setPassword("12345"); //macht ma natürlich verschlüsselt, wenn überhaupt notwendig
...

httpReq.getSession().setAttribute("userBean", userBean); //erster Parameter: so heißt das SessionObjekt in deiner
                                                                                   // faces.config!
```

Klarerweise kannst du das aber nicht 1:1 umsetzen da sonst deine UserBean ständig überschrieben werden würde (eben bei jedem Request)!

Was du sonst noch machen könntest, ist es so in deinem LoginController zu speichern:


```
//ist quasi die Methode hinter dem Login Button deiner JSP
public void doLogin(final ActionEvent e) {
//eventuelle prüfungen...
...
UserBean tmpUserBean = (UserBean) this.getSessionVariable("userBean"); //wie oben, so heißt die Bean in deiner
                                                                                                              //faces.config
tmpUserBean .setUser("blah");
tmpUserBean .setLogin(true);
tmpUserBean .setPassword("12345"); //macht ma natürlich verschlüsselt, wenn überhaupt notwendig

//referenz löschen
tmpUserBean  = null;

}

public static Object getSessionVariable(
            final String variable) {
        FacesContext fc = FacesContext.getCurrentInstance();

        ApplicationFactory factory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        Application application = factory.getApplication();

        ValueBinding loggedInBinding = application
                .createValueBinding("#{" + variable + "}");

        return loggedInBinding.getValue(fc);
    }
```


Hoffe das hilft dir weiter.

mfg


----------



## orribl (29. Aug 2007)

Hi,
du kannst dir auch mal dieses  Projetk angucken:

http://sourceforge.net/projects/jssf/

Macht genau das was du willst....
Die readme is eigentlich auch recht ausfuehrlich, da steht drin wie du das ganze konfigurieren musst....


MfG


----------



## raptor (29. Aug 2007)

Jein.
Ich habe das Gefühl, je weiter ich vorran komme, desto mehr stehe ich auf dem Schlauch, weil immer neue Befriffe und Methoden auf mich zu kommen. Mir fehlen da irgendwie die Grundlagen.

Trotzdem Danke. Und ein wenig geholfen hat es schon. 

edit: Das "Jein" bezogt sich auf den vorletzten Post vor diesem.


----------



## raptor (5. Sep 2007)

Moin,

ich habe jetzt einen Filter eingbaut. Das klappt auch alles hervorragend. Wenn der Benutzer nicht eingeloggt ist, dann wird er auf die Login-Seite verwiesen. Wenn er keine Berechtigung für die aktuelle Seite hat, dann .... ja, dann sollte er eigentlich mit einer Fehlermeldung auf der aktuellen Seite bleiben. Ich habe ich meiner Session-Bean ein Attribut Status, dass ich entsprechend füllen kann. Aber ich weiß nicht, wie ich einen "redirect" auf die aktuelle Seite mache. Kann mir da jemand weiterhelfen?


----------



## ms (5. Sep 2007)

Du könntest in dem Filter ganz zum Schluss die aktuelle URL in die Session schreiben.
Wenn beim nächsten mal der Filter durchlaufen wird und der Fehler auftritt dann einfach einen Redirect auf die gespeicherte URL.
War jetzt ein Gedankengang von mir, also nicht getestet.

ms


----------



## raptor (5. Sep 2007)

Hui. Simple aber könnte klappen. Ich probiere es gleich mal aus.

edit: Ergebnis kann ich erst später posten. Muss gerade noch was anderes erledigen.


----------



## raptor (10. Sep 2007)

Irgendwie haut das nicht so recht hin. Ich brauche die redirect-Einstellung in der faces-config.xml, damit die jeweils richtige Seite mit dem Filter ausgeführt wird. Sonst hätte ich den Effekt, dass ich nach dem Login ohne Filter auf die Willkommen Seite gelange. Erst beim nächsten Request würde der Filter ausgeführt. 
Und wenn ich diese Redirect-Einstellung habe, dann habe ich in dem Request zu dem Zeitpunkt ja schon die aktuelle Seite stehen. Zumindest beim erstmaligen Aufruf. Ich müsste also irgendwie einen zweiten Filter bauen, der vorher läuft, oder? So in der Art habe ich aber schon was probiert. Funktionierte nicht so recht.


----------

