2016-05-04 4 views
2

Ich habe eine Frage zu einem Federmechanismus. Hier ist das Szenario:Warum funktioniert @Resource nicht mit @PreAuthorize

Ich habe eine abstrakte Controller-Klasse, die einige Abhängigkeiten durch die @Resource Annotation injiziert hat. Eine Unterklasse enthält die @RequestMapping Annotation für die Bearbeitung der Anfrage. Bis jetzt hat alles gut funktioniert und alle Abhängigkeiten wurden injiziert.

Jetzt versuche ich, Spring Security in unser Projekt vorstellen, aber wenn ich versuche, @PreAuthorize ich NullPointerException in einigen @ModelAttribute Methoden erhalten zu verwenden, da die Dependency Injection jetzt ausfällt. Ich habe herausgefunden, dass Spring eine Proxy-Klasse meines Controllers macht, aber irgendwie nicht alle Abhängigkeiten injiziert.

Vielleicht fehlt mir eine Konfiguration Spring zu sagen, dass die Proxys die Abhängigkeiten des Ziels verwenden müssen oder dass es alle Abhängigkeiten in den Proxy selbst injizieren sollte.

Wenn jemand eine Idee hat, würde ich mich freuen, es zu hören.

Antwort

0

Wenn Sie Annotation vorautorisieren möchten, dann ist es das Beste, sie in der Serviceebene nicht im Controller zu verwenden. Dies wird auch hier http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/faq.html#faq-method-security-in-web-context dokumentiert „Im Allgemeinen würden wir bei der Dienstschicht-Anwendungsverfahren Sicherheit empfehlen, anstatt auf einzelnen Web-Controller“

Wenn Sie Urls schützen möchten (dh requestmapping in Controller definiert) der beste Weg ist die Verwendung von Intercept-uRL-Muster wie in dieser uRL beschrieben http://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/core-web-filters.html#filter-security-interceptor

Wenn Sie noch Preauthorize im Controller dann verwenden möchten Sie diese Anweisungen befolgen kann (die bereits hier Securing controller method with @RolesAllowed and @PreAuthorize existieren)

vorzuauthorisieren und JSR-250 Anmerkungen zu verwenden, müssen Sie

  • annotate springen Sie Sicherheitskonfiguration Klasse mit: @EnableGlobalMethodSecurity (prePostEnabled = true, jsr250Enabled = true)
  • , wenn Sie irgendwo anders in Ihrer Anwendung Frühling verwenden AOP mit JDK-Proxies, machen alle Controller-Klassen, in denen Sie die Methode Sicherheits Schnittstellen implementieren alle geschützten Methoden erklärt
  • verwenden möchten, wenn Sie irgendwo anders in der Anwendung Frühling AOP mit CGLIB Proxies zu verwenden, fügen proxyTargetClass = true @EnableGlobalMethodSecurity: @ EnableGlobalMethodSecurity (prePostEnabled = true, jsr250Enabl ed = true, proxyTargetClass = true)
  • wenn Sie CGLIB Proxies mit Feder Version unter 3.2, fügen CGLIB Bibliothek Classpath (CGLIB Klassen enthalten sind im Frühjahr 3.2+) vermeiden Mischen CGLIB und JDK proxying wie es verwendet werden soll wird nicht von der Spring-Dokumentation empfohlen: Mehrere Abschnitte werden zur Laufzeit in einen einzigen Autoproxy-Ersteller zusammengefasst, der die stärksten Proxy-Einstellungen für alle Abschnitte (in der Regel aus unterschiedlichen XML-Bean-Definitionsdateien) anwendet. Dies gilt auch für die und Elemente. Um es klar zu sagen: Die Verwendung von 'proxy-target-class = "true" on oder Elementen erzwingt die Verwendung von CGLIB-Proxies für alle drei.

Hoffe das hilft

Verwandte Themen