2 Stimmen

Spring Sicherheit 3.1 +JSF 2.0. Problem mit der Annotation von Methoden in ManagedBeans?

Hy .Was ich versuche zu tun, ist Spring Security mit einer Jsf+Spring IOC + Hibernate-Anwendung zu integrieren. Ich habe es geschafft, die Login-Seite einzurichten und einige andere Seiten zu filtern. Bisher so gut, aber als ich versuchte, die @Secured- oder @PreAuthorize-Annotationen auf Methoden innerhalb von ManagedBeans zu setzen (innerhalb von Daos funktionieren die Annotationen), habe ich festgestellt, dass sie absolut nichts tun. Ich habe gelesen, dass ich KLASSEN-Proxy benötige. Spring verwendet aspektorientierte Programmierung mit Proxy, das Managed Bean implementiert ein Interface, daher wird kein KLASSEN-Proxy, sondern ein JDK-Dynamik-Proxy verwendet. Also habe ich das in meiner Konfigurationsdatei gemacht:

 //the rest of the beans

Die applicationContext-security-Xml sieht so aus:

Kann mir jemand sagen, warum die Annotationen innerhalb eines Managed Beans nicht funktionieren und wie das Problem gelöst werden kann? z. B.:

    @PreAuthorize("ROLE_PROJECT_MANAGER")
public void aproveVacation(Vacation vacation) {...}

danke

0voto

Alexx Punkte 301

Das Problem wurde gelöst. Die Lösung besteht darin, die Managed Beans in Spring Beans umzuwandeln. So geht's:
web.xml benötigt nicht den JSF-Listener, sondern nur den Spring-Listener:

    org.springframework.web.context.ContextLoaderListener

    org.springframework.web.context.request.RequestContextListener

Der Anwendungskontext benötigt diese Konfiguration, um zu funktionieren:

//andere Konfigurationen

Beachten Sie, dass die ersten beiden die Basis-Package für die Spring-Beans definieren müssen (für die Komponenten) und dass die Beans annotiert sind. Die dritte Konfiguration ist erforderlich, um den Klassenproxy zu erzwingen, hier ist der Grund, warum Sie das brauchen.
Ok. Sobald wir wissen, dass wir die Annotationen von JSF ManagedBeans zu Spring-Komponenten ändern:

@ManagedBean
@SessionScoped
public class UserLoginBean {

@ManagedProperty(name = "userDao", value = "#{userDao}")
private UserDao userDao; 
}   

zu:

@Component
@Scope("session")
@Qualifier("userLoginBean")
public class UserLoginBean  {

@Autowired
private UserDao userDao;
}     

Das war's. Wenn Sie diese Konfiguration bereits haben und es nicht funktioniert, sollten Sie in Ihre applicationContext.xml setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X