# RollesAllowed und Stateless kombinieren



## unknown (5. Okt 2016)

Hallo

Ich möchte gerne in meiner Rest-Schnittstelle (Basic Auth) die zwei Annotationen @Stateless und @RolesAllowed gleichzeitig verwenden. Mein Code sieht wie folgt aus:

```
@Stateless
@ManagedBean
@Path("/hello")
publicclassHelloWorldResource{
    @EJB
    HelloBean hellobean;

    @RolesAllowed("Admin")
    @GET
    @Path("/{param}")
    publicResponse getMsg(@PathParam("param")String msg,@QueryParam(value ="test")String test,@ContextSecurityContext sc)throwsIOException{


        hellobean.addBean();


        String output ="Jersey say : "+ msg +" "+ test +"is User in Role: "+sc.isUserInRole("Admin");

        returnResponse.status(200).entity(output).build();

        }
}
```
Und erhalte die folgende Exception:

```
javax.ejb.EJBAccessException:[EJB:010160]Security violation:User<anonymous> has insufficient permission to access EJB type=<ejb>, application=Shopping-1, module=Shopping-1.war, ejb=HelloWorldResource, method=getMsg, methodInterface=Local, signature={java.lang.String,java.lang.String,javax.ws.rs.core.SecurityContext}.
at weblogic.ejb.container.internal.InvocationWrapper.checkMethodPermissionsBusiness(InvocationWrapper.java:415)
at weblogic.ejb.container.internal.BaseLocalObject.preInvoke(BaseLocalObject.java:110)
at weblogic.ejb.container.internal.BaseLocalObject.__WL_preInvoke(BaseLocalObject.java:69)
at weblogic.ejb.container.internal.SessionLocalMethodInvoker.invoke(SessionLocalMethodInvoker.java:22)
at ch.shopping.resource.HelloWorldResource_94mzfg_NoIntfViewImpl.getMsg(UnknownSource)
Truncated. see log file for complete stacktrace
```
Als App Server verwende ich Weblogic. Dieses kann anscheinend mit der Annotation @RolesAllowed nicht richtig umgehen, wenn es sich um EJB handelt. Die Authentifizierung passiert dann offenbar auf App Server Ebene. Ich möchte jetzt auch keinen Pseudo User "anonymous" in Weblogic unter (my reals) anlegen. Denn so erlaube ich jedem Benutzer den Zugriff auf meine EJBs.

Ich habe sehr viel nachgesucht. Anscheinend bin ich nicht der einizige mit diesem Problem. Hab' bisher allerdings keine Lösung dafür gefunden ausser auf die Annotation
@Stateless zu verzichten (dann funktioniert es nämlich).

Kennt jemand eine bessere Lösung? Oder kann mir jemand zumindest erklären, was passiert wenn ich auf @Stateless verzichte?


----------



## stg (6. Okt 2016)

Ich finde die Kombination

```
@Stateless
@ManagedBean
@Path
```
ein wenig merkwürdig ... aber das sollte hier nichts zur Sache tun.


Vielleicht hilft dir das hier weiter:
http://stackoverflow.com/questions/27711748/ejb-jax-ws-web-service-authentication-and-authorization


----------



## unknown (6. Okt 2016)

stg hat gesagt.:


> Ich finde die Kombination
> 
> ```
> @Stateless
> ...



Danke für die Antwort. Ich werde es mir anschauen.

Meinst du die gleichzeitige Verwendung von @Stateless und @ManagedBean? Falls ja: Bisher habe ich das Problem so gelöst, dass ich @Stateless einfach entfernet habe. Damit einige Sachen wie Injection immer noch funktionieren, habe ich @ManagedBean verwendet und in meinem Beispiel vergessen wieder wegzunehmen. Ansonsten wäre ich froh, wenn du mir kurz erklären würdest, was dran merkwürdig ist.


----------



## Steven Hachel (19. Okt 2016)

@ManagedBean wird für JSF genutzt, um im Frontend auf Methoden dieser Klasse zugreifen zu können. @ManagedBean ist aber seit Jahren deprecated und es sollte hierfür @Named (CDI) verwendet werden.

Zudem ist @ManagedBean oder @Named *hier sinnlos*, da du ja bestimmt nicht vom Frontend darauf zugreifen möchtest, oder? Das tust du ja über Rest.

viele Grüße
Steven


----------

