2016-07-21 17 views
0

Ich benutze Resteasy 3.0.11.Final mit JBoss AS 5.1.0 GA. Ich habe einen definierten REST-Webservice. Der gesamte Dienst ist mit einer BASIC-Authentifizierung mit einer benutzerdefinierten Sicherheitsdomäne gesichert. Wenn ich Postman verwende, um eine Anfrage (# 1) mit BASIC-Authentifizierung für Benutzer A zu senden, ruft JBoss AS ein Login-Modul für den Benutzer auf und ruft dann eine lokale EJB-Methode (mit Anfangskontext gesucht) mit dem Aufrufer Principal A auf. Unmittelbar nachdem ich eine andere Anfrage (# 2) mit BASIC-Authentifizierung für den Benutzer B gesendet habe, ruft JBoss AS in diesem Fall kein Login-Modul mehr auf und ruft erneut eine lokale ejb-Methode mit dem Aufrufer A auf. Nach einiger Zeit sendet das Senden einer Anfrage mit Benutzer B das gewünschte Ergebnis (lokaler Ejb-Methodenaufruf mit Anrufer-Principal B). Ich bin mir nicht sicher, was das Problem verursacht, die Konfiguration des Resteasy-Dienstes/Sitzungsbehandlung oder die Konfiguration der JBoss AS-Sicherheitsdomäne, die für Login-Module zuständig ist (Subjekt-Timeout? Fehlende Abmeldung nach dem Aufruf der Methode?)? Grundsätzlich möchte ich Resteasy so konfigurieren, dass eine neue Sitzung mit einem neuen Aufruf des Login-Moduls für den Aufruf der lokalen EJB-Methode für jede Ruheanforderung erzwungen wird.JBoss AS 5.1.0 GA Resteasy-Anwendung - erzwingen Sie Login für jede Anfrage

web.xml:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>my-app</display-name> 
    <context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider,com.mycompany.infrastructure.ExceptionMapper</param-value> 
    </context-param> 
    <context-param> 
    <param-name>resteasy.resources</param-name> 
    <param-value>com.mycompany.resource.Resource</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
    </listener> 
    <servlet> 
    <servlet-name>my-app-resteasy-servlet</servlet-name> 
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.core.Application</param-name> 
     <param-value>com.mycompany.application.Application</param-value> 
    </init-param> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>my-app-resteasy-servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
    <security-constraint> 
    <web-resource-collection> 
     <web-resource-name>my-app-resteasy-servlet</web-resource-name> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>User</role-name> 
    </auth-constraint> 
    </security-constraint> 
    <login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>MyRealm</realm-name> 
    </login-config> 
    <security-role> 
    <role-name>User</role-name> 
    </security-role> 
</web-app> 

Jboss-web.xml

<jboss-web> 
    <context-root>/path</context-root> 
    <security-domain>java:/jaas/MyRealm</security-domain> 
</jboss-web> 

beans.xml

<beans 
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     bean-discovery-mode="all"> 
</beans> 

login-config.xml für mein

<application-policy name="MyRealm"> 
    <authentication> 
     <login-module code="com.mycompany.security.UsernamePasswordLoginModuleImpl" 
     flag="required"> 
     <module-option name="password-stacking">useFirstPass</module-option> 
     </login-module> 
    </authentication> 
</application-policy> 

Resource.java

@Path("/resource") 
@Stateless 
public class Resource { 

    @POST 
    @Path("/execute") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public ResponseDTO execute(RequestDTO dto) { 
     try { 
      // code 
     } catch (Exception exception) { 
      // handle 
     } 
    } 
} 

Antwort

0

fand ich eine sehr grobe Lösung:

Resource.java:

@Path("/resource") 
@Stateless 
public class Resource { 

    @POST 
    @Path("/execute") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public ResponseDTO execute(RequestDTO dto, @Context HttpServletRequest request) { 
     try { 
      // code 
     } catch (Exception exception) { 
      // handle 
     } finally { 
      if (request != null) { 
       request.getSession().invalidate(); 
      } 
     } 
    } 
} 

oder das gleiche Ergebnis, unterschiedliche Implementierung (ohne den gleichen Code in jedem Verfahren wiederholen in einer Ressource, offensichtlich):

SessionInvalidatorFilter.java

public class SessionInvalidatorFilter implements ContainerResponseFilter { 
    @Context 
    private HttpServletRequest request; 

    public void filter(ContainerRequestContext requestCtx, ContainerResponseContext responseCtx) throws IOException { 
     if ((request != null) && (request.getSession() != null)) { 
      request.getSession().invalidate(); 
     } 
    } 
} 

web.xml

<context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>com.mycompany.infrastructure.filter.SessionInvalidatorFilter</param-value> 
</context-param>