userdetails current authenticationprincipal authenticated after spring authentication servlets spring-security

current - spring security get username after login



Accediendo a HttpServletRequest durante DaoAuthenticationProvider authenticate en Spring Security (2)

Necesito acceder al objeto HttpServletRequest desde mi DaoAuthenticationProvider en Spring security.

El componente de seguridad amplía DaoAuthenticationProvider e invalidamos el método de authenticate para realizar alguna autenticación / validación personalizada. Se requiere una verificación adicional para validar la dirección IP del usuario que aparece en la url de la solicitud como un parámetro de cadena de consulta (Ej: http://domain.com/context?ip=192.168.0.1 ).

El enfoque actual que intento es hacer uso de RequestContextHolder thread-local y obtener la solicitud http en mi DAOAuthenticationProvider personalizado.

Algunas otras soluciones que leo aquí y en los foros de primavera parecen sugerir inyectar AuthenticationDetailsSource , uso de custom-filter y otros pasos que no entiendo debido a que soy nuevo en Spring Security.

Tendríamos diferentes aplicaciones web que usan el mismo componente de seguridad para realizar la autenticación.

¿Puede alguien señalarme en la dirección correcta o ayudarme con los enfoques implementados anteriormente?


Puede agregar Spring''s RequestContextFilter en su web.xml. De esta forma, los atributos se guardarán en el hilo actual en cada solicitud. Luego, puede obtener HtttpServletRequest original:

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = attributes.getRequest();


Puede usar RequestContextHolder y efectivamente contiene la misma solicitud, aunque Spring Security generalmente envolverá la solicitud entrante, por lo que puede obtener una referencia diferente dependiendo de si coloca RequestContextFilter antes o después de la cadena Spring Security (tenga en cuenta que puede verificar fácilmente esto usted mismo comparando el valor devuelto de RequestContextHolder con la solicitud en un controlador de aplicación).

También es relativamente fácil insertar un AuthenticationDetails personalizado como mencionaste:

package com.mycompany; public class MyWebAuthenticationDetailsSource implements AuthenticationDetailsSource { public Object buildDetails(Object context) { return ((HttpServletRequest)context).getParameter("ip"); } }

Entonces usa

<bean id="ads" class="com.mycompany.MyWebAuthenticationDetailsSource /> <bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> <property name="authenticationDetailsSource" ref="ads" /> <property name="authenticationManager" ref="authenticationmanager" /> </bean>

y agregue esto como un filtro personalizado como se describe en el manual de referencia. En 3.1, el espacio de nombres lo admite directamente en el elemento form-login . Authentication.getDetails() devolverá el valor de su parámetro "ip".

Tenga en cuenta que probablemente no deba usar 3.0.4, ya que tiene vulnerabilidades de seguridad conocidas.

Además, ¿puedes explicar cómo se está configurando el parámetro "ip"?