En esta oportunida estoy tratando de configurar una aplicacion web que combine las tecnologias que menciono en el titulo de este thread.
He logrado configurar correctamente jsf2 y richfaces, eso funciona OK. Uso faces-config.xml para establecer mis reglas de navegacion, manejo skins, tengo todos los taglibs correspondientes, etc... Todo esta como debe estar.
Pero para esta aplicacion necesito autenticacion de usuarios y manejo de roles, es por esto que decidi usar spring security 3 y aqui empezaron los problemas. Logre configurar spring security para que me muestre un formulario de login basico (el que trae spring) y usando nombres de usuarios y contrasenas hardcodeados en el security-context.xml funciona bien, esto quiere decir, cuando trato de acceder a un recurso que requiere de un usuario logueado, este formulario aparece y luego de loguearme correctamente veo la pagina que queria ver.
Hasta aca todo bien, pero me surgieron dos problemas que no se como resolver.
El primero tiene que ver con el login. Yo he definido templates para mi aplicacion y quiero tener una pagina de login que utilice estos templates y que sea la que utilice spring security para autenticar usuarios. He intentado crear la pagina de login y un loginBean para autenticarme pero no funciono. Asi que mi primer pregunta es:
Como es la forma correcta de crear esta pagina de login personalizada y que el formulario (<h:form>) siga el proceso de login de spring y de ser posible como integro todo esto para que los usuarios, contrasenas y roles esten en una base de datos?
La segunda cosa tiene que ver con las reglas de navegacion. Yo utilizo faces-config.xml para definir mis reglas de navegacion, es decir, de la pagina /faces/home.xhtml quiero ir a /faces/admin/home_admin.xhtml con el action "goAdminHome". Luego en la pagina /faces/home.xhtml pongo un <h:commandLink action="goAdminHome" value="Ir al home de administracion"/> y siguiendo la regla definida en faces-config.xml cuando hago click en ese link voy a esa pagina, el problema es que desde que configure spring security, me pasan dos cosas: la primera es que cuando hago click no importa si el usuario tiene rol de administrador, la pagina es redirigida y mostrada igual. Y la segunda es que la url queda mal formada, queda algo del estilo: "http://localhost:8080//faces/home.xhtml" cuando en realidad estoy viendo /faces/admin/admin_home.xhtml y como si fuera poco los estilos de la pagina mostrada quedan "raros". Realmente n o se como solucionar esto. Osea que la segunda pregunta es: Cual es la forma correcta de declarar reglas de navegacion para las paginas usando jsf2 y spring security 3? Quizas sea Spring WebFlow 2?
Bueno para terminar les dejo mis archivos de configuracion para ver si les sirve de algo! Un fuerte abrazo a todos y gracias!
JM
web.xml
Código:
applicactionContext-security.xml<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext-security.xml </param-value> </context-param> <context-param> <param-name>webAppRootKey</param-name> <param-value>barmanagement.root</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/log4j.properties</param-value> </context-param> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <context-param> <param-name>javax.faces.FACELETS_LIBRARIES</param-name> <param-value>/WEB-INF/springsecurity.taglib.xml</param-value> </context-param> <context-param> <param-name>org.richfaces.skin</param-name> <param-value>blueSky</param-value> </context-param> <context-param> <param-name>org.richfaces.enableControlSkinning</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.richfaces.enableControlSkinningClasses</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>/faces/home.xhtml</welcome-file> </welcome-file-list> </web-app>
Código:
faces-config.xml<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> <http auto-config='true' access-denied-page="/accessDenied.xhtml"> <intercept-url pattern="/resources/**" filters="none" /> <intercept-url pattern="/templates/**" filters="none" /> <intercept-url pattern="/login.xhtml*" filters="none" /> <intercept-url pattern="/faces/tickets/**" access="ROLE_ADMIN, ROLE_USER" /> <intercept-url pattern="/faces/admin/**" access="ROLE_ADMIN" /> <intercept-url pattern="/faces/home.xhtml*" access="IS_AUTHENTICATED_FULLY" /> <form-login /> <logout logout-success-url='/faces/home.xhtml' logout-url="/logout" invalidate-session="true"/> <session-management invalid-session-url="/timeout.xhtml"> <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </session-management> </http> <authentication-manager> <authentication-provider> <user-service> <user name="admin" password="admin" authorities="ROLE_ADMIN, ROLE_USER" /> <user name="jmdiaz" password="jmdiaz" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager> </beans:beans>
Código:
<?xml version='1.0' encoding='UTF-8'?> <!-- =========== FULL CONFIGURATION FILE ================================== --> <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> <navigation-rule> <from-view-id>/faces/home.xhtml</from-view-id> <navigation-case> <from-action>goTicketsHome</from-action> <to-view-id>/faces/tickets/tickets_home.xhtml</to-view-id> </navigation-case> <navigation-case> <from-action>goAdminHome</from-action> <to-view-id>/faces/admin/admin_home.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config>