tutorial example español java spring-mvc spring-security spring-webflow

java - example - spring security tutorial español pdf



¿Cómo implementar la página de inicio de sesión utilizando Spring Security para que funcione con Spring web flow? (4)

Tengo una aplicación web con Spring 2.5.6 y Spring Security 2.0.4. Implementé una página de inicio de sesión que funciona, que autentica al usuario contra un servicio web. La autenticación se realiza definiendo un administrador de autentificación personalizado, como este:

<beans:bean id="customizedFormLoginFilter" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter"> <custom-filter position="AUTHENTICATION_PROCESSING_FILTER" /> <beans:property name="defaultTargetUrl" value="/index.do" /> <beans:property name="authenticationFailureUrl" value="/login.do?error=true" /> <beans:property name="authenticationManager" ref="customAuthenticationManager" /> <beans:property name="allowSessionCreation" value="true" /> </beans:bean> <beans:bean id="customAuthenticationManager" class="com.sevenp.mobile.samplemgmt.web.security.CustomAuthenticationManager"> <beans:property name="authenticateUrlWs" value="${WS_ENDPOINT_ADDRESS}" /> </beans:bean>

La clase de administrador de autenticación:

public class CustomAuthenticationManager implements AuthenticationManager, ApplicationContextAware { @Transactional @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { //authentication logic return new UsernamePasswordAuthenticationToken(principal, authentication.getCredentials(), grantedAuthorityArray); }

La parte esencial del jsp de inicio de sesión se ve así:

<c:url value="/j_spring_security_check" var="formUrlSecurityCheck"/> <form method="post" action="${formUrlSecurityCheck}"> <div id="errorArea" class="errorBox"> <c:if test="${not empty param.error}"> ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} </c:if> </div> <label for="loginName"> Username: <input style="width:125px;" tabindex="1" id="login" name="j_username" /> </label> <label for="password"> Password: <input style="width:125px;" tabindex="2" id="password" name="j_password" type="password" /> </label> <input type="submit" tabindex="3" name="login" class="formButton" value="Login" /> </form>

Ahora el problema es que la aplicación debería usar Spring Web Flow . Después de que la aplicación se configuró para usar Spring Web Flow, el inicio de sesión ya no funciona: la acción de formulario para "/ j_spring_security_check" da como resultado una página en blanco sin mensaje de error. ¿Cuál es la mejor manera de adaptar el proceso de inicio de sesión existente para que funcione con Spring Web Flow?

Editar: no hubo ningún mensaje de error, solo se mostró una página en blanco. Funciona ahora: el problema era que a web.xml le faltaban entradas

<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>

Como no puedo cancelar la recompensa aunque el problema esté resuelto, la recompensa se otorga a la respuesta más perspicaz o al enlace, lo que ayudaría a otras personas a configurar Spring Security y Web Flow para que trabajen juntas.



Aquí hay documentación que describe por qué es necesario ''springSecurityFilterChain''.

El filtro springSecurityFilterChain no se crea explícitamente, sino que se crea implícitamente mediante el elemento de esquema de seguridad de primavera <http> en el contexto de la aplicación

<http auto-config="false" session-fixation-protection="none"> <form-login login-page="/login.jsp" default-target-url="/home.htm" /> </http>

Los beans creados requieren un proveedor de autenticación, por lo que proporcionamos uno

<authentication-provider> <user-service id="userDetailsService"> <user password="password" name="username" authorities="ROLE_USER" /> </user-service> </authentication-provider

Con estos cambios implementados, incluida la configuración del filtro de seguridad como se describe en la pregunta editada, la página se procesará correctamente y la pila de seguridad configurada estará en su lugar en cada página servida.

Estos detalles y un recorrido por una simple aplicación de seguridad de primavera se encuentran en la aplicación web aimple con Spring Security, parte 13 .

La documentación de referencia describe la configuración de springSecurityFilterChain como la primera parte de la configuración de web.xml: Configuración del espacio de nombres de seguridad - Primeros pasos . (Vinculado a la versión 2.0.x utilizada por el OP. La última versión 3.1 está aquí ).


De su código no está claro si tiene la configuración de Spring Security en absoluto. Supongo que no.

  • Debe agregar espacio de nombre de seguridad en su configuración. Algo como esto

    <beans xmlns="http://www.springframework.org/schema/beans" ... skipped ... xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ... skipped ... http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">

  • Debe configurar Spring Security. Por ejemplo:

    <security:http once-per-request="false" auto-config="false"> <security:form-login login-page="path/to/your/login.jsp"/> </security:http>

  • Esto podría ser suficiente para que "simplemente funcione", pero creo que debería echarle un vistazo a la implementación de AuthenticationProvider y no de AuthenticationManager. En este caso, necesitaría una configuración similar a esta:

    <bean class="my.company.project.MyAuthProvider" autowire="byType"> <security:custom-authentication-provider/> </bean>


Tuve que cambiar el nombre de mi formulario de j_security_check a otra cosa en glassfish, ya que parece interpretar esa URL en sí.