2009-06-18 52 views
36

Estoy usando Wicket con Wicket Auth Project para mi capa de presentación y, por lo tanto, la he integrado con Spring Security. Este es el método que se llama por Wicket para la autenticación para mí:Uso programático de Spring Security

@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; 
} 

El contenido (en el interior) de mi configuración XML 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. Session Fixation Attack Protection de la documentación de referencia dice:

ataques de fijación de sesión son un riesgo potencial donde es posible por un atacante malintencionado para crear un sesión accediendo a un sitio, luego persuade a otro usuario a iniciar sesión con la misma sesión (enviándoles un enlace que contiene el identificador de sesión como un parámetro, por ejemplo). Primavera Security protege contra esta de forma automática mediante la creación de una nueva sesión cuando un usuario inicia sesión. Si no requieren esta protección, o entra en conflicto con algún otro requisito, que pueden controlar el comportamiento utilizando el session- la fijación de protección contra atributo, que tiene tres opciones:

  • migrateSession - crea una nueva sesión y copia los atributos de sesión existente a la nueva sesión. Este es el predeterminado.
  • ninguno - No hagas nada. La sesión original será retenida.
  • newSession - Crea una nueva sesión "limpia", sin copiar los datos de sesión existentes de .

Las obras de autenticación, pero como estoy bastante nuevo en la primavera de Seguridad Tengo algunas preguntas que necesito respuestas demasiado:

  • Normalmente para inicio de sesión, que iba a publicar la autentificación información al j_spring_security_check y deje que Spring Security realice el código de autenticación real. Me gustaría tener protección contra los ataques de fijación de sesiones, ¿lo 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 usaré el inicio de sesión y el cierre de sesión programáticos, ¿cómo desactivo que Spring intercepte esas URL?

Actualización: Para la sesión protección contra ataques de fijación parece que tengo que llamar al método en la clase SessionUtils con la firma startNewSessionIfRequired(HttpServletRequest request, 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.

+0

Bounty a la primera publicación de una respuesta para las tres preguntas anteriores –

+0

Hey Kent - respondí las preguntas y dejar que la recompensa está sobrepasado - por qué ? – Pablojim

+0

Lo siento, tuve algunos asuntos personales que me impidieron iniciar sesión. –

Respuesta

22

Quizás no sea una respuesta completa a sus preguntas, pero tal vez podría serle de ayuda.

El código que se llama cuando no se utiliza inicio de sesión programática, sino una norma es que se pueden encontrar aquí:

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

supongo que fueron inspirados por esto en su código. Se ve bastante similar.

mismo modo, el código que se ejecuta cuando se accede al /j_spring_security_logout en el enfoque estándar, es decir que se encuentran aquí:

org.springframework.security.ui.logout.LogoutFilter

El LogoutFilter llamadas de varios controladores. El controlador que estamos utilizando se llama: org.springframework.security.ui.logout.SecurityContextLogoutHandler, por lo que puede llamar al mismo código en su enfoque.

+0

¡Qué buena respuesta! :-) Estaba un poco más que inspirado, por la documentación de referencia de Spring 3.0 (las tres líneas en mi bloque de prueba son un copiado y pegado directo): http://static.springframework.org/spring-security/site /docs/3.0.x/reference/technical-overview.html#d4e689. Debo señalar que estoy usando 2.0.4. ¡Voy a ver el código que mencionaste! ¡Gracias! Dejaré la pregunta abierta por el momento, ya que aún estoy buscando respuestas a mis preguntas OP. –

8

De hecho, estará abierto a ataques de fijación de sesión. Para remediar esto, podría ser "inspirado" por el código de Spring. Para crear una nueva sesión, obviamente necesitará acceder a la httpsession, por lo que es posible que tenga que hacer algunas refactorizaciones.

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 el código un poco.

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

SecurityContextHolder.getContext().setAuthentication(null); 

En cuanto a la interceptación de las URL que sólo podría ¡Ponlos en algo que no uses e ignóralo! No estoy seguro si puede desactivar la interceptación en la configuración. Si realmente desea eliminarla, eche un vistazo al AuthenticationProcessingFilter, puede personalizar esto. 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: mira algunos documentos anteriores y verás cómo hacerlo.

Espero que esto ayude!

+0

Creé una actualización anterior porque tengo problemas con la protección de ataque de fijación de sesión. –

+0

¿Necesita limitar las sesiones concurrentes? p.ej. permitiendo al mismo usuario iniciar sesión dos veces en dos sesiones diferentes? Si no es así, no necesita un Registro de sesión: simplemente pase un valor nulo al método SessionUtils. ¡Si necesita esto, cuando lo implemente tendrá un registro de sesión! ver aquí: http://static.springframework.org/spring-security/site/docs/2.0.x/reference/ns-config.html#ns-concurrent-session vez más para usted que pueda necesitar para configurarlo usted mismo y no usar el espacio de nombres personalizado. Supongo que no necesita esta funcionalidad. – Pablojim

+0

SessionUtils se eliminó en spring-security 3.0, parece que org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy.onAuthentication() (y su subclase ConcurrentSessionControlStrategy) son su reemplazo más cercano. –

6

1) Salir programático

  1. llamada HttpServletRequest.getSession (falso) .invalidate
  2. llamada SecurityContextHolder.clearContext()

2) Envía la primavera de Seguridad NO para interceptar ciertas direcciones URL, este un tipo de depende de cómo se configura el espacio url de la aplicación. Si todas sus páginas (excepto/login y/cierre de sesión) vivían en el contexto/myApp entonces se podría hacer esto:

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

Para hacer cerrar la sesión de programación también es posible lanzar una org.springframework.security.core.AuthenticationException. Por ejemplo, SessionAuthenticationException. En este caso ExceptionTranslationFilter inicie sesión.

1

Tuve un problema con el inicio de sesión programático.Llamé a todos los métodos authenticationManager.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 quedó claro en el código de ejemplo publicado anteriormente. Para obtener más vistazo a http://forum.springsource.org/showthread.php?t=69761

0

Puede probar se administra este

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

     SecurityContextHolder.clearContext(); 

    } catch (Exception e) { 
     logger.log(LogLevel.INFO, "Problem logging out."); 
    } 
Cuestiones relacionadas