2015-05-14 15 views
5

Sto avviando un'applicazione che utilizza un'API REST che effettua chiamate a un livello EJB su JBoss Wildfly (RestEasy).Propagare l'utente principale da REST al livello EJB

I servizi REST sono all'interno di una guerra che chiama quindi il livello ejb. so come realizzare modulo personalizzato BASIC o uno qualsiasi dei authenthication a riposo a un RESTEasy Interceptor che controlla intestazioni ecc Fondamentalmente come descritto qui: http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/

Il problema ora è - questo è solo un controllo sulla facciata REST. All'interno del layer EJB non conosco l'utente che ha autenticato il servizio REST.

Per cancellare questo - quando si utilizza RMI e chiamate EJB remoto con autenticazione, il nome utente viene memorizzato in contesto di sessione:

@Stateless 
public class LoginService { 
@Resource 
private SessionContext sessionContext; 

    public String getCurrentUser() { 
    Principal principal = sessionContext.getCallerPrincipal(); 
    return principal.getName(); //I need this to be the username from REST auth 
    //Currently it's anonymous 
    } 
} 

Esiste un modo per propagare il nome utente in qualche modo standard? Per esempio. mettere un'antenna personalizzata su SessionContext?

risposta

1

È possibile utilizzare il metodo doAs dell'oggetto. See the JavaDocs here.

Quando i makings chiamano dalla guerra al EJB, farlo con il metodo doAs del soggetto autenticato. In questo modo il soggetto viene propagato al contesto dell'ejb. (ad esempio @RolesAllowed funzionerà correttamente) È possibile configurare l'autenticazione nel web.xml come al solito, se lo si desidera.

Per ottenere il soggetto nella guerra, provate questo Subject userSubject=(Subject)PolicyContext.getContext("javax.security.auth.Subject.container");

+0

Questo non sta lavorando su Wildlfly 9.0.2. Ho provato "Riposo senza stato" definendo "Senzatetto senzatale". Ho provato "Pojo Rest" chiamando "Bean Session Stateless". Nessuna propagazione del principal utente. W/@SecurityContext set up, w/Resteasy specifiche configurazioni di sicurezza (resteasy.role.based.security). –