2016-12-24 62 views
8

Zrobiłem kilka badań na ten temat, ale nie mogłem znaleźć rozwiązania.Ograniczenie bezpieczeństwa oparte na adnotacjach nie działa w przypadku wywołań metod wywołanych gniazdem sieciowym

Mam klasy jak ten

@Stateless 
class ConfigBean { 
    @RequiresRole("administrator") 
    public void reloadConfiguration(){ 
    ...... 
    } 
} 

i mam JAX-RS (Jersey) usługi jak poniżej.

@Path("config") 
class ConfigService{ 

    @EJB 
    ConfigBean config; 

    @Get 
    @Path("reload") 
    public void reload(){ 
    config.reloadConfiguration(); 
    } 
} 

To będzie działać poprawnie na wywołanie API /Test/config/relaod (to działa tylko z użytkownikiem administrator).

Ale poniżej kod nie działa zgodnie z oczekiwaniami (czyli normalny użytkownik może wywołać metodę reload config),

@ServerEndpoint("/socket") 
public class EchoServer { 
/** 
* @OnOpen allows us to intercept the creation of a new session. 
* The session class allows us to send data to the user. 
* In the method onOpen, we'll let the user know that the handshake was 
* successful. 
*/ 

@EJB 
ConfigBean config; 

@OnOpen 
public void onOpen(Session session){ 
    System.out.println(session.getId() + " has opened a connection"); 
    try { 
     session.getBasicRemote().sendText("Connection Established"); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

/** 
* When a user sends a message to the server, this method will intercept the message 
* and allow us to react to it. For now the message is read as a String. 
*/ 
@OnMessage 
public void onMessage(String message, Session session){ 
    System.out.println("Message from " + session.getId() + ": " + message); 
    try { 
     if(message.equalsIgnoreCase("reloadConfig")){ 
      config.reloadConfiguration(); 
     } 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

/** 
* The user closes the connection. 
* 
* Note: you can't send messages to the client from this method 
*/ 
@OnClose 
public void onClose(Session session){ 
    System.out.println("Session " +session.getId()+" has ended"); 
    } 
} 

Odpowiedz

0

Shiro integracja JAX-RS przechwytuje tylko JAX-RS punktów końcowych.

Aby uzyskać bardziej ogólne podejście do adnotacji, można użyć integracji Guice, Spring lub AspectJ.

Jeśli używasz CDI, można spojrzeć na this branch dla Shiro adnotacji Interceptor, to jest to tylko pierwszy przebieg, ale to działa

+0

Moje pytanie brzmi adnotacje działają bez zarzutu, gdy wywołanie metody wyzwalane przez żądanie HTTP, ale nie działa, gdy jest wyzwalane przez komunikat gniazda sieci. –