2016-06-29 8 views
0

Ich habe ein fast abgeschlossenes Webprojekt mit EJB3.1 als WAR in Wildfly 8.2. Es ist gesichert durch einen selbstgeschriebenen JAAS-Bereich mit Formularauthentifizierung (auth-Methode FORM).Sicherer EJB3.1-Webservice (in JBoss Wildfly 8.2)

Jetzt möchte ich eine EJB-Webservice hinzufügen, die im Grunde als

@Stateless 
@WebService 
public class ProductImportWebservice { 
    @Resource 
    WebServiceContext wsContext; 

    [...] 

    @WebMethod 
    public Product createOrFind(String name) { 
     [...] 
    } 
} 

Der Webservice wie erwartet funktioniert, aber jetzt durch Benutzername/Passwort für den Webservice Zugriff schützen wollen definiert ist, ich habe das Problem, dass ich. So kommentierte ich den Webservice oder die @WebMethod mit

@RolesAllowed("ADMIN") 

, die eine gültige Rolle in der JAAS-Authentifizierung ist. Wirkung: Der SOAP-Client erhält die Antwort "reqeust not allowed/not authenticated" - erhält aber keine Authentifizierungsanfrage und Versuche mit BASIC-Authentifizierung werden ignoriert. Wenn ich die URL des Webservice zur Sicherheitsbeschränkung in der web.xml hinzufüge, erhalte ich eine Authentifizierungsanfrage ... aber das Problem ist jetzt, dass es die formularbasierte Authentifizierung ist - wie ein Benutzer mit einem Browser es erwarten würde . Dies ist unbrauchbar für einen „normalen“ SOAP-Client :-(

Die konkrete Frage ist nun: Gibt es eine Möglichkeit, beides haben - BASIC-Authentifizierung für den Webservice und formularbasierte Authentifizierung für den Rest der Anwendung ?.

Der einzige andere Weg I sehen würde das WAR-Paket bis zu einem EAR-Paket und Bereitstellung der Webservice in einem anderen Web-Kontext zu spalten

Antwort

1

die konkrete Frage ist nun: gibt es ein Möglichkeit, beides zu haben - BASIC Authentifizierung für den Webservice und FORM-basierte Authentifizierung für der Rest der Anwendung?

Sie können nicht sowohl FORM und BASIC Authentifizierung für die gleiche Web-Anwendung verwenden.

Wenn Sie dies tun müssen, erstellen Sie zwei separate Anwendungen mit einer gemeinsamen Codebasis.

Referenz:

https://docs.oracle.com/javaee/7/tutorial/security-webtier002.htm#JEETT01227

Die Auth-Verfahren Subelement konfiguriert den Authentifizierungsmechanismus für die Webapplikation. Der Elementinhalt muss entweder NONE, BASIC, DIGEST, FORM oder CLIENT-CERT sein.

+0

Nicht die Antwort, die ich erhofft habe, aber ich denke, du hast Recht. Ich denke, ich werde einen anderen Weg gehen: füge die webmethod-Parameter mit User-Credentials hinzu und überprüfe sie selbst :-( – cljk

+0

Ich wollte nur hinzufügen: Am Ende habe ich meinen Webservice um eine Funktion "login" erweitert, die das delegiert login-process zu HttpRequest.login - was im Grunde den JAAS-check aufruft .... in den geschützten Methoden überprüfe ich die Rollenzugehörigkeit durch Überprüfung von wsContext.isUserInRole (...) und der WS-Client verwaltet einfach Sitzungen wie in http://stackoverflow.com/questions/14699114/jax-ws-client-maintains-session-cookies-across-multiple-services Es funktioniert wie ein Charme und war viel weniger Arbeit als die Aufteilung des Projekts. – cljk

+0

@cljk Sie Du könntest auch dein Glück mit JASPIC versuchen, das ist Standard und erlaubt es dir, mehrere Authentifikatoren ('ServerAuthModule's) zu stapeln, wie es dir gefällt.Ich bezweifle jedoch, dass es sowohl für Servlet als auch für JAX-WS trivial ist, sie einzurichten. – Uux