Per recuperare l'oggetto, è possibile utilizzare la combinazione di LoginModule e Valve. Il fatto che le valvole vengano invocate prima dell'attivazione dell'identificazione ci sta aiutando qui. Quando la valvola viene invocata mette la sessione in ThreadLocal (simile a come JBOSS salva la richiesta in ThreadLocal) e in seguito quando viene richiamato LoginModule.commit(), salva l'oggetto nella sessione.
Per configurare questo componente aggiuntivo codice compilato per la classe di seguito per un barattolo e posizionarlo sotto $ CATALINA_BASE/lib/
package my.test;
import java.io.IOException;
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.servlet.ServletException;
import org.apache.catalina.Session;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
/**
* Use following class to retrieve subject in your HTTPServlet when using Tomcat.
*/
public class ContainerServices extends ValveBase implements LoginModule {
// Key to revtieve subject from session.
public static final String SUBJECT_KEY =
"javax.security.auth.Subject.container";
/**
* Session for current thread.
*/
static InheritableThreadLocal<Session> sessionHolder =
new InheritableThreadLocal<Session>();
// JAAS Subject being authenticated.
private Subject subject;
// Invoke the value.
public void invoke(Request request, Response response) throws IOException,
ServletException {
sessionHolder.set(request.getSessionInternal(true));
try {
// Next in the invocation chain
getNext().invoke(request, response);
} finally {
sessionHolder.remove();
}
}
// Initialize the login module
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options) {
this.subject = subject;
}
// Store subject to session.
public boolean commit() throws LoginException {
Session session = sessionHolder.get();
if (session != null) {
session.getSession().setAttribute(ContainerServices.SUBJECT_KEY, subject);
}
return true;
}
// not used
public boolean abort() throws LoginException {
return false;
}
// not used
public boolean login() throws LoginException {
return true;
}
// not used
public boolean logout() throws LoginException {
return true;
}
}
A $ CATALINA_BASE/conf/server.xml aggiungere seguente configurazione Valve come figlio dell'elemento.
<Valve className="my.test.ContainerServices" />
Nel file di jaas.config aggiungere la stessa classe di LoginModule.
DummyAppLogin {
my.test.ContainerServices required debug=true;
my.test.DummyAppLoginModule required debug=true;
};
Ora, dopo aver effettuato il login, autenticato soggetto può essere recuperato utilizzando segue.
session.getAttribute(ContainerServices.SUBJECT_KEY);
fonte
2015-09-24 03:51:50
essere sicuri che il regno è utilizzato per la vostra webapp, allora si può provare di Servlet API 'HttpServletRequest.getUserPrincipal()' –
sapevo che e funziona, ma ho bisogno di recuperare soggetti per ottenere anche roleprincipal – sasaman85