Sulla base di questo Jaspic Example ho scritto il validateRequest
seguente metodo per un ServerAuthModule
:JASPIC wildfly 9 validateRequest con sessione
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject,
Subject serviceSubject) throws AuthException {
boolean authenticated = false;
final HttpServletRequest request =
(HttpServletRequest) messageInfo.getRequestMessage();
final String token = request.getParameter("token");
TokenPrincipal principal = (TokenPrincipal) request.getUserPrincipal();
Callback[] callbacks = new Callback[] {
new CallerPrincipalCallback(clientSubject, (TokenPrincipal) null) };
if (principal != null) {
callbacks = new Callback[] {
new CallerPrincipalCallback(clientSubject, principal) };
authenticated = true;
} else {
if (token != null && token.length() == Constants.tokenLength) {
try {
principal = fetchUser(token);
} catch (final Exception e) {
throw (AuthException) new AuthException().initCause(e);
}
callbacks = new Callback[]
{
new CallerPrincipalCallback(clientSubject, principal),
new GroupPrincipalCallback(clientSubject,
new String[] { "aRole" })
};
messageInfo.getMap().put("javax.servlet.http.registerSession", "TRUE");
authenticated = true;
}
}
if (authenticated) {
try {
handler.handle(callbacks);
} catch (final Exception e) {
throw (AuthException) new AuthException().initCause(e);
}
return SUCCESS;
}
return AuthStatus.SEND_FAILURE;
}
Questo funziona come previsto, per la prima chiamata di un EJB con @RolesAllowed("aRole")
ma per la successiva chiamata questo non funziona affatto Wildfly nega con questo messaggio di errore:
ERROR [org.jboss.as.ejb3.invocation] (default task-4) WFLYEJB0034: EJB Invocation
failed on component TestEJB for method public java.lang.String
com.jaspic.security.TestEJB.getPrincipalName():
javax.ejb.EJBAccessException: WFLYSEC0027: Invalid User
Se immagino destra, l'errore occures in: org.jboss.as.security.service.SimpleSecurityManager
line 367 del codice sorgente di wilfly, a causa di line 405, in cui credential
è selezionata, ma sembra essere null
.
Questo sembra uguale in Wildfly 8/9/10CR (altre versioni non testate).
Ancora una volta non sono sicuro, se sto sbagliando, o se questo è lo stesso bug di https://issues.jboss.org/browse/WFLY-4626? E 'un bug o è un comportamento previsto?
ho provato questa soluzione, ma 'tp = (TokenPrincipal) hs.getAttribute (callerSessionKey);' non restituisce qualcosa di diverso 'null' sembra che Wildfly 9.0.02 non abbia mai la stessa sessione nel mio esempio. – knoe
Domanda sciocca ma solo per essere sicuro - stai creando una sessione da qualche parte, giusto? Siccome non ero sicuro che l'utilizzo della sessione HTTP sarebbe stato un'opzione per te (potresti aver voluto rimanere completamente stateless, HTTP session-wise), l'esempio sopra non lo è, e allega solo il chiamante e i suoi ruoli se lì è già una sessione attiva.Se crei una sessione altrove e il SAM non è ancora in grado di recuperare le informazioni, fammelo sapere e lo ripeterò domani. Altrimenti sull'autenticazione iniziale all'interno del SAM, 'req.getSession (false)' dovrà diventare 'req.getSession()'. – Uux
Non ha funzionato per me, perché nella crittografia 'web.xml'ssl è stata applicata, ma non presente. Grazie! La tua risposta è la soluzione che userò. – knoe