Ich versuche, ein einfaches Protokollierungstool zu erstellen, das mithilfe von AspectJ den HttpServletRequest-Text drucken kann.Anmeldung bei Verwendung von MultiReadHttpServletRequest mit Spring-Sicherheit nicht möglich. BenutzernameAndPasswordAuthFilter
Dazu habe ich eine einfache Pointcut erstellt, die alle Hinrichtungen von javax fängt Filter.doFilter, HttpServlet doPost, doGet, Service etc.
ich das dann ersetzen HttpServletRequest mit meinem eigenen Wunsch Wrapper, der Kopien der Körper die Anfrage, so dass es kann mehr als einmal aufgerufen werden, damit ich es protokollieren kann. Siehe - https://github.com/Alotor/test-binding/blob/master/src/java/grails/util/http/MultiReadHttpServletRequest.java.
Es funktionierte so weit, bis ich versuchte, den Körper in einer Anwendung zu protokollieren, die Spring-Sicherheitsfilter verwendet. Jetzt kann ich mich nicht anmelden, scheint irgendwie, dass die Implementierung des HttpServletRequestWrapper für Spring wichtig ist, aber ich kann nicht herausfinden, wo und warum.
Mein Code (etwas vom Original geändert, aber es gibt die Idee):
aspect MyAspect {
pointcut httpCalls(HttpServletRequest req, HttpServletResponse resp):
args(req, resp, ..) && (execution(void javax.servlet.Servlet+.service(..))
|| execution(void javax.servlet.Servlet+.doGet(..))
...
|| execution(void javax.servlet.Filter.doFilter(..));
Object around(HttpServletRequest req, HttpServletResponse resp):httpCalls(req,resp) {
...
if (!ThreadContext.getContext().wasReplaced()) { // we need to replace the request
reqWrapper = new MultiReadHttpServletRequest(req);
ThreadContext.getContext().setWasReplaced(true);
obj = proceed(reqWrapper, resp);
TraceContextFactory.getFactory().getContext().setWasReplaced(false);
} else {
obj = proceed(req, resp);
}
return obj;
}
}
Jede Idee, warum ich mich nicht einloggen kann, und dies nicht mit Spring Security arbeiten? Ich sah, dass sie ihre eigenen Wrapper verwenden, aber da die API die gleiche ist, sollte es funktioniert haben.
Zur Verdeutlichung - ich bin eine Anwendung auf Tomcat laufen, und ich instrumentieren nicht org.apache.catalina (es funktioniert nicht, wahrscheinlich aufgrund der Reihenfolge beim Laden der Klasse, die verhindert, dass der aspectj Tomcat Quellcode verweben) .
Edit:
ich jetzt ist das das Problem sehen, im Inneren des UsernamePasswordAuthenticationFilter.java:
protected String obtainUsername(HttpServletRequest request) {
return request.getParameter(usernameParameter);
}
Die oben genannten Erträge null, falls ich meine Wrapper verwenden, sonst ist es "Gast" zurückgibt, die ist der Benutzername, den ich verwendet habe. Ich habe den Inputstream und den Reader überschrieben, aber der eigentliche Aufruf von getParameter (...) erfolgt über die zugrunde liegende Anfrage, die den ursprünglichen Eingabestream von org.apache.catalina.connector.RequestFacade verwendet.
http://localhost:8081/someApp/j_spring_security_check:
Danke,
Lin
Geben Sie den vollständigen Code für den Aspekt ein. In dieser verkürzten Version scheint man nur 'confine (...)' zu nennen, wenn die 'firstTimeTracking'-Bedingung' wahr 'ist. –
@ NándorElődFekete - Ich habe den Code aktualisiert. jede Hilfe wird geschätzt. Der Code funktioniert in allen Fällen außer der Spring-Sicherheit, die irgendwie auf den Typ (?) Des HttpServletRequestWrapper angewiesen ist. – Lin