Pregunta

Estoy usando Wicket con el Wicket Auth Project para mi capa de presentación y, por lo tanto, lo he integrado con Spring Seguridad. Este es el método que Wicket llama para autenticarme:

@Override
public boolean authenticate(String username, String password) {
    try {
        Authentication request = new UsernamePasswordAuthenticationToken(
                username, password);
        Authentication result = authenticationManager.authenticate(request);
        SecurityContextHolder.getContext().setAuthentication(result);
    } catch (AuthenticationException e) {
        return false;
    }
    return true;
}

Los contenidos (dentro) de mi configuración XML de Spring Security son:

<http path-type="regex">
    <form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
    <password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>

La sección 2.3.6. Protección de ataque de fijación de sesión de la documentación de referencia dice:

  

Los ataques de fijación de sesión son un riesgo potencial donde es posible   para que un atacante malicioso cree un   sesión accediendo a un sitio, luego   persuadir a otro usuario para que inicie sesión con   la misma sesión (enviándoles un   enlace que contiene el identificador de sesión   como parámetro, por ejemplo). Primavera   La seguridad protege contra esto   automáticamente creando un nuevo   sesión cuando un usuario inicia sesión. Si usted   no requieren esta protección, o   entra en conflicto con algún otro requisito,   puedes controlar el comportamiento usando   la protección de fijación de sesión   atributo en, que tiene tres   opciones:

     
      
  • migrateSession: crea una nueva sesión y copia la existente   atributos de sesión a la nueva sesión. Este es el valor predeterminado.
  •   
  • ninguno - No hagas nada. La sesión original se mantendrá.
  •   
  • newSession: crea una nueva " clean " sesión, sin copiar el   datos de sesión existentes.
  •   

La autenticación funciona, pero como soy bastante nuevo en Spring Security, tengo algunas preguntas que también necesito respuestas:

  • Normalmente para iniciar sesión, PUBLICARÍA la información de autenticación en j_spring_security_check y dejaría que Spring Security realice el código de autenticación real. Me gustaría tener protección contra ataques de fijación de sesión, ¿la obtendré cuando realice un inicio de sesión programático como lo hago? Y si no, ¿qué tendría que hacer para obtenerlo?
  • ¿Cómo realizo el cierre de sesión programático?
  • Como utilizaré el inicio de sesión programático y el cierre de sesión, ¿cómo deshabilito Spring para que no intercepte esas URL?

Actualización: Para la protección contra ataques de fijación de sesión, parece que necesito llamar al método en la clase SessionUtils con la firma startNewSessionIfRequired (solicitud HttpServletRequest, boolean migrateAttributes, SessionRegistry sessionRegistry) .

¿Cómo obtengo la instancia de SessionRegistry que necesito pasar? No puedo encontrar ninguna forma de crear una ID de alias, o cómo obtener su ID o nombre.

¿Fue útil?

Solución

Tal vez no sea una respuesta completa a sus preguntas, pero tal vez pueda ayudarlo.

El código que se llama cuando NO usa el inicio de sesión programático, pero aquí encontrará uno estándar:

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

Supongo que te inspiraste en esto en tu código. Se ve bastante similar.

Del mismo modo, el código ejecutado cuando accede al / j_spring_security_logout en el enfoque estándar, se encuentra aquí:

org.springframework.security.ui.logout.LogoutFilter

El LogoutFilter llama a múltiples manejadores. El controlador que estamos usando se llama: org.springframework.security.ui.logout.SecurityContextLogoutHandler , por lo que puede llamar al mismo código en su enfoque.

Otros consejos

De hecho, estará abierto a ataques de arreglos de sesión. Para remediar esto, nuevamente podría estar `` inspirado '' por el código de primavera. Para crear una nueva sesión, obviamente necesitará acceso a la httpsession, por lo que es posible que tenga que refactorizar.

Si ve el método SessionUtils . startNewSessionIfRequired .

Esto migrará la autenticación a una nueva sesión. Es posible que pueda llamar a este método directamente o simplemente refactorizar un poco el código.

En cuanto al cierre de sesión programático, no puede equivocarse demasiado simplemente llamando a session.invalidate () cuando necesite cerrar la sesión de la persona. Esto hará todo lo necesario desde una perspectiva de seguridad general, pero tenga en cuenta que es posible que deba limpiar algunas cosas en la sesión. Si tiene un conjunto de filtros muy complicado, etc., y necesita asegurarse de que el usuario haya cerrado la sesión para el resto de la solicitud, entonces puede agregar:

SecurityContextHolder.getContext().setAuthentication(null);

En cuanto a la interceptación de las URL, ¡podría configurarlas como algo no utilizado e ignorarlo! No estoy seguro de si puede desactivar la intercepción en la configuración; si realmente desea eliminarla, eche un vistazo al AuthenticationProcessingFilter : puede personalizarlo. Si hace esto, tendrá que configurar manualmente el xml de seguridad de primavera y no usar los espacios de nombres proporcionados. Sin embargo, no es demasiado difícil: mire alguna documentación anterior y verá cómo hacerlo.

¡Espero que esto ayude!

1) Cierre de sesión programático

  1. llame a HttpServletRequest.getSession (false) .invalidate
  2. llame a SecurityContextHolder.clearContext ()

2) Dígale a Spring Security que NO intercepte ciertas URL, esto depende de cómo esté configurado el espacio de URL de su aplicación. Si todas sus páginas (excepto / logIn y / logout) vivieran en el contexto / myApp, entonces podría hacer esto:

<http ....>
  <intercept-url pattern="/myApp/**" ..>
 ....
</http>

Tuve un problema con el inicio de sesión programático. Llamé a todos los métodos autenticaciónManager.authenticate (...) y SecurityContextHolder.getContext (). SetAuthentication (...) pero tuve algunos problemas con la sesión. Tuve que agregar las siguientes líneas para administrar correctamente la sesión:

HttpSession session = request.getSession();
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());

Esto no estaba claro en el código de ejemplo publicado anteriormente. Para obtener más información, consulte http://forum.springsource.org/showthread.php?t=69761

Para cerrar sesión mediante programación también es posible lanzar un org.springframework.security.core.AuthenticationException . Por ejemplo, SessionAuthenticationException . En este caso, ExceptionTranslationFilter inicia el cierre de sesión.

Puedes probar esto

    try {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        SecurityContextHolder.clearContext();

    } catch (Exception e) {
        logger.log(LogLevel.INFO, "Problem logging out.");
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top