Utilizamos RequestHeaderAuthenticationFilter como la implementación de la pre-autenticación de estrategia y PreAuthenticatedAuthenticationProvider como el proveedor de autenticación. Uno de los requisitos es la tienda que todos los inicios de sesión para la base de datos con la siguiente información. Como usuario de la dirección IP y otros relacionados con la solicitud de información no está disponible en UserDetailsService clase, ¿cuál es la mejor estrategia para recuperar esta información y almacenar en la base de datos?

InformationsquelleAutor RKodakandla | 2011-10-20

2 Comentarios

  1. 35

    Toda la información está disponible a través de HttpServletRequest. Usted puede obtener por:

    La inyección de dependencia

    La manera más fácil sería para inyectar servlet solicitud directamente en su UserDetailsService: clase:

    public MyDetailsService implements UserDetailsService {
    
      @Autowired
      private HttpServletRequest request;
    
      //...
    
    }

    (como sugiere OP) Recuerde agregar la siguiente escucha a su web.xml:

    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>

    ACTUALIZACIÓN: Esto funciona porque la Primavera inyecta especial en el ámbito de proxy de la aplicación de HttpServletRequest, por lo que son capaces de solicitud de acceso en el ámbito de la petición de «bean» de singleton ámbito de MyDetailsService. Bajo el capó de cada llamada a request‘s parámetros se enruta a org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal cual también se puede acceder directamente. Como se puede ver la Primavera es muy flexible cuando se trata de reglas de ámbito. Simplemente funciona.

    RequestContextHolder

    Otro enfoque es el uso de RequestContextHolder:

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

    Lectura adicional:

    • gracias por la respuesta Tomasz, no he probado tu solución, pero una pregunta.. no es personalizado UserDetailsService una sesion de ámbito bean? Pensé que un objeto de este tipo que se crea sólo cuando hay una nueva sesión o la sesión existente caduca. Si es de hecho un ámbito de sesión de frijol entonces ¿cómo podemos inyectar HttpServletRequest que es una solicitud de ámbito? Si UserDetailsService es la solicitud y, a continuación, cómo es que llame a la loadUser..() método no está hecha para cada solicitud?
    • ¿serviría de algo? Es UserDetailsService normalmente una solicitud de ámbito bean?
    • @rrkwells, @Pedro Mularien: UserDetailsService siempre debe ser un singleton y HttpServletRequest es un ámbito de petición. Esto funciona gracias a la prórroga de la Primavera scoped-proxy magia aplica de forma transparente. También ver mis actualizaciones. No te preocupes y probarlo :-).
    • lo siento por no responder antes.. acabo de probar tu primera solución hoy en día y está funcionando como se esperaba. Yo sólo tenía que añadir el contexto de la solicitud de escucha en el web.xml archivo. Muchas gracias por tu ayuda.
    • Me alegra poder ayudar, he añadido RequestContextListener a mi respuesta sea completa, gracias!
  2. 5

    Este puede ser un buen enfoque:

    1) Crear una clase que extienda SavedRequestAwareAuthenticationSuccesshandler

    public class MyCustomSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
    
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                Authentication authentication) throws ServletException, IOException {

    2) Asignar el «éxito » controlador» a su filtro de seguridad:

    <beans:bean id="myFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
            <beans:property name="authenticationManager" ref="authenticationManager"/>
            <beans:property name="authenticationFailureHandler" ref="failureHandler" />
                   <beans:property name="authenticationSuccessHandler" ref="successHandler" />
        </beans:bean>
    
    <beans:bean id="successHandler" class="yourPackage.MyCustomSuccessHandler" >
            <beans:property name="defaultTargetUrl" value="/index.html" /> 
            <beans:property name="alwaysUseDefaultTargetUrl" value="true"/> 
        </beans:bean>

Dejar respuesta

Please enter your comment!
Please enter your name here