usuarios usuario tipo sencillo registro que programar programa pida ejemplos datos contraseña con java spring tomcat spring-security

tipo - programar usuario y contraseña en java



¿Cómo puedo obtener el nombre de usuario de un inicio de sesión fallido utilizando la seguridad de primavera? (4)

He descubierto que esto funciona para mí. Desafortunadamente, todavía no encontré la ubicación exacta de esto en los documentos de SpringSecurity:

En cualquier acción, puede verificar el nombre de usuario utilizado por última vez (independientemente de si el inicio de sesión no se pudo o no):

String username = (String) request.getSession().getAttribute("SPRING_SECURITY_LAST_USERNAME");

Estamos usando spring security 3.0.5, Java 1.6 y Tomcat 6.0.32. En nuestro archivo de configuración .xml tenemos:

<form-login login-page="/index.html" default-target-url="/postSignin.html" always-use-default-target="true" authentication-failure-handler-ref="authenticationFailureHandler"/>

y nuestro authenticationFailureHandler definido como:

<beans:bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler"> <beans:property name="exceptionMappings"> <beans:props> <beans:prop key="org.springframework.security.authentication.BadCredentialsException">/index.html?authenticationFailure=true</beans:prop> </beans:props> </beans:property> </beans:bean>

Java

@RequestMapping(params={"authenticationFailure=true"}, value ="/index.html") public String handleInvalidLogin(HttpServletRequest request) { //... How can I get the username that was used??? // I''ve tried: Object username = request.getAttribute("SPRING_SECURITY_LAST_USERNAME_KEY"); Object username = request.getAttribute("SPRING_SECURITY_LAST_USERNAME"); // deprecated }

Así que estamos dirigiendo todas las BadCredentialsExceptions al index.html y al IndexController . En el IndexController me gustaría obtener el username que se utilizó para el intento fallido de inicio de sesión. ¿Cómo puedo hacer esto?


Bien, entonces la respuesta resultó ser algo extremadamente simple, sin embargo, hasta donde puedo decir, no muy discutido ni documentado.

Aquí está todo lo que tenía que hacer (no hay configuraciones en ningún lado que hayan creado esta clase) ...

import org.apache.log4j.Logger; import org.springframework.context.ApplicationListener; import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent; import org.springframework.stereotype.Component; @Component public class MyApplicationListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> { private static final Logger LOG = Logger.getLogger(MyApplicationListener.class); @Override public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) { Object userName = event.getAuthentication().getPrincipal(); Object credentials = event.getAuthentication().getCredentials(); LOG.debug("Failed login using USERNAME [" + userName + "]"); LOG.debug("Failed login using PASSWORD [" + credentials + "]"); } }

Estoy lejos de ser un experto en seguridad primaveral, así que si alguien lee esto y conoce una razón, no deberíamos hacerlo así o conocer una mejor manera de escucharla.



Lo hice de esta manera:

  1. Creó una clase que extiende SimpleUrlAuthenticationFailureHandler

  2. Reemplace el método onAuthenticationFailure , que recibe un HttpServletRequest como parámetro.

  3. request.getParameter("username") , donde "username" es el nombre de mi entrada en mi formulario HTML.