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.
En su lugar, podría proporcionar su propia versión de DefaultAuthenticationEventPublisher y anular el método publishAuthenticationFailure.
Lo hice de esta manera:
Creó una clase que extiende
SimpleUrlAuthenticationFailureHandler
Reemplace el método
onAuthenticationFailure
, que recibe unHttpServletRequest
como parámetro.request.getParameter("username")
, donde"username"
es el nombre de mi entrada en mi formulario HTML.