Me gustaría pista cuando los usuarios iniciar sesión en mi aplicación. Tengo un código que me gustaría para ejecutar la derecha después de que el usuario está autenticado. El problema es que no puedo averiguar donde esta debe ser llamado. Primavera-seguridad tienen una forma de llamar a un método de autenticación?

InformationsquelleAutor UmYeah | 2010-04-05

7 Comentarios

  1. 31

    probablemente será útil para alguien…
    En el caso de la Primavera 3, configure la seguridad:

    <security:http use-expressions="true" auto-config="true">
        <security:intercept-url pattern="..."/>
        <security:form-login
                authentication-failure-handler-ref="authFailureHandler"
                authentication-success-handler-ref="authSuccessHandler"/>
        <security:logout success-handler-ref="logoutSuccessHandler"
                invalidate-session="true"/>
        <security:session-management session-fixation-protection="newSession"/>
    </security:http>
    
    <bean id="authFailureHandler" class="mine.AuthenticationFailureHandlerImpl"/>
    <bean id="authSuccessHandler" class="mine.AuthenticationSuccessHandlerImpl"/>
    <bean id="logoutSuccessHandler" class="mine.LogoutSuccessHandlerImpl"/>

    e implementar una clase apropiada:

    public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
    
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            //do what you want with 
            response.getOutputStream().write("success".getBytes());
        }
    }

    Puede vincular los recursos a través de xml config.

    • Cosas buenas! Gracias por la autenticación de éxito-de-controlador-ref
    • Si quiero añadir una pequeña acción y, a continuación, continuar con la manipulación normal, ¿cómo sería?
  2. 11

    Mejor manera es crear una aplicación de escucha y registrarlo con la primavera contexto de seguridad.

    import org.springframework.context.ApplicationListener;
    import org.springframework.security.authentication.event.InteractiveAuthenticationSuccessEvent;
    
    public class AuthenticationSuccessListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {
    
        @Override
        public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) {
            System.out.println("User Logged In");
    
        }
    }

    Asegúrese de agregar la clase por encima de la spring-security.xml como un bean. Hay un montón de otros tipos de eventos de seguridad de los oyentes usted puede escuchar, comprobar el tipo de jerarquía para una lista de todos los tipos de eventos de seguridad que se puedan escuchar.

    • Dependiendo de la situación, pero que sería mi camino a seguir. Si usted necesita para crear un efecto secundario de la autenticación de caso de uso ApplicationListener. Si necesita especificar cómo el proceso de autenticación debe ser manejado el uso de los controladores. En este caso, «seguimiento de la autenticación de acción» me gustaría ir para el evento, así como es más como un efecto secundario.
  3. 6

    En caso de que desee continuar con el comportamiento predeterminado, pero sólo entre realizar su propia lógica de negocio, usted puede extend SimpleUrlAuthenticationSuccessHandler e invocar super.onAuthenticationSuccess(request, response, authentication); antes de regresar. Más detalles, consulte https://stackoverflow.com/a/6770785/418439

    • Esto es lo que yo suelo hacer y me recomienda hacerlo así si no necesita cambiar nada en la implementación original sino que simplemente requiere una funcionalidad adicional. Puedo crear un ChainAuthenticationSuccessHandler que luego de la llamada de mi controlador personalizado y de uno de los controladores como SimpleUrlAuthenticationSuccessHandler. Me parece que es más fiable y limpio de la ampliación del Muelle de la clase. Supongo que como bien podría crear algún tipo de decorador de clase en la parte superior del controlador original para evitar la herencia, pero la cadena de solución de apelaciones mejor para mí.
  4. 4

    Acaba de escribir su propia SpringSecurityFilter y agregar a la cadena de filtros de la derecha después de que su proveedor de autenticación se llama.

    package my.code;
    
    public class AuditFilter extends SpringSecurityFilter {
    
       public void doFilterHttp(...) throws ... {
          {application code to run before request is processed}
          chain.doFilter(...);
          {application code to run after request has fully processed} 
       }
    }

    A continuación, en el XML de configuración (siempre que la configuración de la Seguridad de la cadena de Filtros) añadir una línea como esta:

    <bean id="auditFilter" class="my.code.AuditFilter>
       <security:custom-filter position="LAST"/>  <-- you can change the position
    </bean>
    • Por favor, tenga en cuenta que SpringSecurityFilter cambiado a los genéricos de la Primavera en la web GenericFilterBean en la Primavera de de Seguridad 3.
  5. 2

    Si quieres evitar leer todo el hilo : curado versión con anotaciones & un poco más explicativo :

    import org.springframework.context.ApplicationListener; 
    import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.stereotype.Component;
    
    @Component 
    public class LoginSuccessListener implements ApplicationListener<AuthenticationSuccessEvent{
    
        @Override
        public void onApplicationEvent(AuthenticationSuccessEvent evt) {
    
            //if you just need the login
            String login = evt.getAuthentication().getName();
            System.out.println(login + " has just logged in");
    
            //if you need to access full user (ie only roles are interesting -- the rest is already verified as login is successful)
            User user = (User) evt.getAuthentication().getPrincipal();
            System.out.println(user.getUsername() + " has just logged in");
    
        } 
    }
  6. 1

    De autenticación no no necesariamente implica el inicio de sesión con éxito. Un usuario puede ser autenticado correctamente a través de, por ejemplo, de dos vías de SSL (X. 509 cert), y todavía Spring Security le redirigirá a una página de error si la sesión de gestión de la concurrencia con max-sessions="1" y este es un segundo intento de inicio de sesión simultáneos. Si su configuración es muy sencilla, sin la sesión de control de concurrencia, puede suponer el inicio de sesión = autenticación para todos los propósitos prácticos. De lo contrario, si usted tiene, por ejemplo, la lógica de que los registros de cada éxito de inicio de sesión en una base de datos, usted tendrá que invocar esta lógica en el punto de real de inicio de sesión, no en el momento de la autenticación. Una forma (de ninguna manera óptima, con sujeción a mi limitada comprensión de la Primavera marco de Seguridad) para hacer esto es poner en práctica su propio ConcurrentSessionControlAuthenticationStrategy (haga clic en aquí para el código fuente) y la inyecta en CompositeSessionAuthenticationStrategy en la Primavera de Seguridad (3.2 y superior) de configuración XML:

    <http>
        .
        .
        <session-management session-authentication-strategy-ref="sas" />
        .
        .
    </http>
    .
    .
    <beans:bean id="sas" class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
        <beans:constructor-arg>
            <beans:list>
                <beans:bean class="path.to.my.implementation.of.ConcurrentSessionControlAuthenticationStrategy">
                    <beans:constructor-arg ref="sessionRegistry"/>
                    <beans:property name="maximumSessions" value="1"/>
                    <beans:property name="exceptionIfMaximumExceeded" value="true"/>
                <beans:bean>
                <beans:bean class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"/>
                <beans:bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy"/>
                    <beans:constructor-arg ref="sessionRegistry"/>
                </beans:bean>
            </beans:list>
        </beans:constructor-arg>
    </beans:bean>
    
    <beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>

    Yo hubiera preferido a inyectar una costumbre PostLogin controlador en el marco del ConcurrentSessionControlAuthenticationStrategy, en lugar de copiar-pegar en mi costumbre ConcurrentSessionControlAuthenticationStrategy y hacer modificaciones, pero no conozco una manera de hacer esto en el momento.

    Más completo ejemplo de configuración se puede encontrar aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here