Hallo allerseits
Da ich mit meiner Anfrage
http://www.java-forum.org/mobile-geraete/123059-session-id-verwalten.html
bis heute nicht weiter gekommen bin, versuche ich hier die Frage etwas allgemeiner zu stellen. Hoffentliche, erfahre ich mehr.
In einer Anwendung, die mehrere Schnittstellen zur Verfügung stellen muss (WebAnwendung mit JSF, Android App, SOAP-WebServices (JAX-WS) und RESTfull-WebServices (JAX-RS)), muss sichergestellt werden, dass diese nur von angemeldeten Benutzer verwendet werden darf. Die Frage ist: Wo prüfe ich, ob der Benutzer angemeldet ist, bevor ich ihm den Zugriff auf die Funktionalitäten der Anwendung gewähre oder ihn mit einer passenden Meldung zum Anmeldungsformular weiterleite?
Ich habe folgende Situation:
Die untersten zwei Layer sind schon implementiert, und in der obersten Etage ist JSF-Layer schon implementiert.
Ich war der Meinung, dass die Kontrolle, ob ein Benutzer angemeldet ist oder nicht und falls ja, was für eine Rolle er hat (Administartor, Superuser, Standarduser ...), oberhalb des Business Logic Layers stattfinden muss. Ein wichtiger Grund dafür ist die Navigation:
Diese Prüfung gehört aus meiner Sicht nicht in Business Logic Layer.
Bei der JSF-Schnittstelle habe ich dies mit Hife des Session-Objekts realisiert. Wenn sich ein Benutzer anmeldet, lege ich seine Rolle in die Sitzung ab. Bevor auf eine Anfrage reagiert wird, wird zuerst geprüft, ob der Benutzer angemeldet ist und falls ja, welche Rolle er hat. Erst dann wird entschieden, wie es weiter geht bzw. wass der Benutzer zu sehen bekommt.
Bei der Reslisierung der App (für Android) sind bei mir diverse Fragen aufgetaucht.
Das Problem im ersten Fall ist, dass man auf die Funktionalitäten der Anwendung aus einem Browser durch das einfache Eingeben der URL zugreifen könnte, ohne sich angemeldet zu haben. Denn, das JAX-RS Layer übernimmt keine Überprüfung, ob der Benutzer korrekt angemeldet ist oder nicht. Aus meiner sicht: unbrauchbar
Im zweiten Fall muss ich irgendwie das Sitzungsobjekt noch verwalten (als HttpClient wird Apache HttpClient verwendet). Wie macht man dies?
Wie geht man in einem solchen Fall vor? Sind meine Überlegungen bezüglich Login-Prüfung "im grünen Bereich", ober voll daneben? Und, wie macht man das im Falle einer App?
Vielen Dank.
Da ich mit meiner Anfrage
http://www.java-forum.org/mobile-geraete/123059-session-id-verwalten.html
bis heute nicht weiter gekommen bin, versuche ich hier die Frage etwas allgemeiner zu stellen. Hoffentliche, erfahre ich mehr.
In einer Anwendung, die mehrere Schnittstellen zur Verfügung stellen muss (WebAnwendung mit JSF, Android App, SOAP-WebServices (JAX-WS) und RESTfull-WebServices (JAX-RS)), muss sichergestellt werden, dass diese nur von angemeldeten Benutzer verwendet werden darf. Die Frage ist: Wo prüfe ich, ob der Benutzer angemeldet ist, bevor ich ihm den Zugriff auf die Funktionalitäten der Anwendung gewähre oder ihn mit einer passenden Meldung zum Anmeldungsformular weiterleite?
Ich habe folgende Situation:
Code:
--------------- --------------- ---------------
- JSF - - JAX-RS - - JAX-WS -
--------------- --------------- ---------------
--------------------------------------------------------
- Business Logic Layer -
--------------------------------------------------------
--------------------------------------------------------
- DAO Layer (mit Hibernate) -
--------------------------------------------------------
Die untersten zwei Layer sind schon implementiert, und in der obersten Etage ist JSF-Layer schon implementiert.
Ich war der Meinung, dass die Kontrolle, ob ein Benutzer angemeldet ist oder nicht und falls ja, was für eine Rolle er hat (Administartor, Superuser, Standarduser ...), oberhalb des Business Logic Layers stattfinden muss. Ein wichtiger Grund dafür ist die Navigation:
- Wenn ein Administrator angemeldet ist, bekommt er alles zu sehen und kann auch alles machen.
- Ist ein Standard-Benutzer angemeldet, bekommt er weniger zu sehen und kann dementsprechend auch weniger machen.
Diese Prüfung gehört aus meiner Sicht nicht in Business Logic Layer.
Bei der JSF-Schnittstelle habe ich dies mit Hife des Session-Objekts realisiert. Wenn sich ein Benutzer anmeldet, lege ich seine Rolle in die Sitzung ab. Bevor auf eine Anfrage reagiert wird, wird zuerst geprüft, ob der Benutzer angemeldet ist und falls ja, welche Rolle er hat. Erst dann wird entschieden, wie es weiter geht bzw. wass der Benutzer zu sehen bekommt.
Bei der Reslisierung der App (für Android) sind bei mir diverse Fragen aufgetaucht.
- Wenn sich ein Benutzer korrekt anmeldet, bekommt er erst dann die Activity zu sehen, die er sehen darf. So übernehme die App die Kontrolle darüber, wer was sehen und machen darf. Die Folge wäre, dass ich im JAX-RS Layer auf dei Überprüfung der Anmeldung und der Rolle verzichten könnte.
- Ich versuche, ähnlich wie bei der JSF-Lösung, die Rolle in der Sitzung zu verwalten.
Das Problem im ersten Fall ist, dass man auf die Funktionalitäten der Anwendung aus einem Browser durch das einfache Eingeben der URL zugreifen könnte, ohne sich angemeldet zu haben. Denn, das JAX-RS Layer übernimmt keine Überprüfung, ob der Benutzer korrekt angemeldet ist oder nicht. Aus meiner sicht: unbrauchbar
Im zweiten Fall muss ich irgendwie das Sitzungsobjekt noch verwalten (als HttpClient wird Apache HttpClient verwendet). Wie macht man dies?
- Die Lösung mit Cookies wäre eine Alternative, aber meines Wissens gibt es kein Standard für Cookies und je nach eingesetztem Server könnte es Probleme geben.
- Müsste ich die ganze zeit mit einer HttpClient-Instanz arbeiten? Oder, könnte ich in jeder Methode eine neue HttpClient-Instanz erstellen (pro Client-System und Server gebe es ein Cookie)?
Wie geht man in einem solchen Fall vor? Sind meine Überlegungen bezüglich Login-Prüfung "im grünen Bereich", ober voll daneben? Und, wie macht man das im Falle einer App?
Vielen Dank.