# Authentication/UserPrincipal mit Rest Webservice?



## navino (30. Jan 2016)

Hallo zusammen,

ich hätte da mal eine Frage ob es möglich ist einen UserPrincipal anhand eines Webservices-Request zu erstellen und in den Context einzuhängen. Momentan mache ich einen 
request.login(username, password);
über die Weboberfläche. Anschließend kann ich den UserPrinicipal aus dem EJBContext lesen und in den SessionBeans abfragen.
Die Idee ist, das ich dann die authorization nur an einer Stelle prüfen muss, nämlich in der SessionBean.
Was mir halt fehlt wäre halt der login. Oder könnte ich auch den
request.login(username, password); benutzen?

Gruß
navino

www.navino.de


----------



## Steven Hachel (30. Jan 2016)

Läuft das in einem Applikation Server oder Spring-Boot?
Bei einem Applikation Server haste doch ne web.xml und darin befindet sich der Bereich für den Security-Constraint, oder? Darin hast du doch auch eine Login Config definiert. Sobald das geschehen ist, bekommst du doch, sobald du als erstes den Restcall machst, die Aufforderung zum Login...
Login kommt natürlich nur, solange du die URL des RestCalls nicht expliziet exludest und zwar im web-resource-collection des Security Constraints.

Bei Spring-Boot ist es nicht anders. Da wirst du auch zum Login aufgefordert, nach dem du den Controller aufrufst...

Oder habe ich dich nicht ganz verstanden? ^^


----------



## navino (30. Jan 2016)

Hallo,

die Anwendung läuft auf einem Wildfly, Spring benutze ich nicht. Ja man kann natürlich auch die deklarative Security in der web.xml machen, hatte ich auch erst. Habe das aber nun alles selber gemacht über Filter, JSF-Exceptionhandler um eine bessere Kontrolle zu haben. Die deklarative Security steht ja vor allem.
Meine Idee ist halt, das ich nur an einer Stelle mich um die authorization kümmern möchte. Ich werde mir das noch einmal mit der web.xml anschauen was da so alles möglich ist ...

Gruß
navino

www.navino.de


----------



## Steven Hachel (30. Jan 2016)

Die web.xml wäre in deinem Fall ja genau die "eine" Stelle, worin du das konfigurierst. 
Alles andere wäre ja dann zu komplex, da du dann jeden RestController mit zB. einer Security Annotation deklarieren müsstest, um etwas per Interceptor, also einen eigenen SecurityService in etwa, zu realisieren.
Um das ganze dann weiter zu spinnen, könntest du mit solch einem Interceptor zum Beispiel den Zugriff einiger Methoden innerhalb einer EJB oder CDI beeinflussen und darauf reagieren.

viele Spaß beim probieren. 
Steven


----------



## navino (31. Jan 2016)

Momentan habe ich ja die Prüfung der autorization in den SessionBeans, da sollen sie ja auch eigentlich bleiben. In der Webanwendung die mit jsf auf die Sessionbeans zugreift, also die ManagedBean habe ich keine Prüfung. Jetzt kommt aus meiner Sicht (die könnte ja auch falsch sein) ein weiterer Client hinzu, nämlich ein Webservice-Client. Für diesen muß ich auf dem Server eine Webservice erstellen. 
Und angenommen auf der Webseite und über den Webservice soll eine und die selbe Methode einer SessionBean aufgerufen werden, dann wäre ja die SessionBean immer das Teil Software welches in beiden Fällen angesprochen wird. Daher meine Idee mit dem UserPrincipal in beiden Fällen.


Gruß
navino


----------



## Steven Hachel (31. Jan 2016)

Also, über die web.xml kannst du es ja so definieren, dass entweder beim Zugriff auf deinen Service oder JSF oder beides ein von dir geschriebenes Login Formular oder der Login Dialog vom Server kommt.
Du bekommst halt nur dann einen UserPrincipal, wenn du dich erfolgreich angelmeldet hast... und dieser steht dir dann in alle SessionBeans zur Verfügung.


----------



## navino (2. Feb 2016)

Hallo,

ich habe beim googlen jemanden gefunden, der die selbe Idee hatte:
http://stackoverflow.com/questions/...cipal-from-httpservletrequest-into-ejbcontext

Im Webservice habe ich folgendes gemacht:

@Context
   HttpServletRequest request;

 @EJB
  private UserService userService;

dann ein request.login(user, password) aus dem httpheader.

Klappt wunderbar und habe mein login-Modul wiederverwendet, und die Authorization nur in der EJB!!

Viele Grüße
navino


----------

