Quiero pasar algunos parámetros con los detalles de acceso a la primavera de seguridad tales como el id de elemento.
a continuación, después de que quiero redirigir a la página según el tipo de usuario.
Para ello estoy utilizando filtro personalizado para enviar parámetro adicional.
Y a la redirección estoy usando de autenticación-éxito-controlador-ref.
Mi problema es que estoy consiguiendo posición de conflicto como estoy usando junto con filtro personalizado.
Por favor me ayudan a hacer mi tarea.

Aquí es la configuración de mi

<http   use-expressions="true">
        <intercept-url pattern="/login" access="permitAll" />
        <intercept-url pattern="/resources/**" access="permitAll" />
        <intercept-url pattern="/logout" access="permitAll" />
        <intercept-url pattern="/accessdenied" access="permitAll" />

       <custom-filter ref="ddAuthenticationFilter" position="FORM_LOGIN_FILTER" />
        <form-login authentication-failure-url="/accessdenied" 
        authentication-success-handler-ref="ddAuthenticationSuccessHandler"/>



    </http>

    <beans:bean id="ddAuthenticationFilter" class="com.dd.security.ExUsernamePasswordAuthenticationFilter"/>

    <beans:bean id="ddAuthenticationSuccessHandler" class="com.dd.security.DDAuthenticationSuccessHandler" />
InformationsquelleAutor roxite | 2014-05-29

1 Comentario

  1. 7

    Entendí tu pregunta de la siguiente manera: quiero presentar un itemId en el formulario de inicio de sesión que se utiliza después de un inicio de sesión exitoso para la redirección de.

    Con el fin de establecer un proceso que necesita para hacer las siguientes cosas.

    Quitar <form-login ...> de su configuración. Usted debe tener:

    <http use-expressions="true" entry-point-ref="authenticationEntryPoint">
        <intercept-url pattern="/login" access="permitAll" />
        <intercept-url pattern="/resources/**" access="permitAll" />
        <intercept-url pattern="/logout" access="permitAll" />
        <intercept-url pattern="/accessdenied" access="permitAll" />
    
        <custom-filter ref="ddAuthenticationFilter" position="FORM_LOGIN_FILTER" />
        <security:logout />
    </http>

    No se olvide de añadir un <security:logout /> para cerrar la sesión y el entry-point-ref puntos de atributo para un authenticationEntryPoint.

    Agregar un LoginUrlAuthenticationEntryPoint para entry-point-ref que lleva a su página de inicio de sesión:

    <bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <constructor-arg name="loginFormUrl" value="/login" />
    </bean>

    Refactorizar su ddAuthenticationFilter para cumplir con la siguiente configuración:

    <bean id="ddAuthenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <property name="authenticationManager" ref="authenticationManager" />
        <property name="filterProcessesUrl" value="/j_spring_security_check" />
        <property name="authenticationFailureHandler" ref="authenticationFailureHandler" />
        <property name="authenticationSuccessHandler" ref="ddAuthenticationSuccessHandler" />
        <property name="authenticationDetailsSource">
            <bean class="security.CustomWebAuthenticationDetailsSource" />
        </property>
    </bean>
    
    <bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
        <property name="defaultFailureUrl" value="/accessdenied" />
    </bean>

    Crear una nueva clase CustomWebAuthenticationDetailsSource:

    package security;
    
    import org.springframework.security.authentication.AuthenticationDetailsSource;
    import org.springframework.security.web.authentication.WebAuthenticationDetails;
    
    import javax.servlet.http.HttpServletRequest;
    
    public class CustomWebAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
        @Override
        public WebAuthenticationDetails buildDetails(HttpServletRequest context) {
            return new CustomWebAuthenticationDetails(context);
        }
    }

    y los relacionados con la CustomWebAuthenticationDetails:

    package security;
    
    import org.springframework.security.web.authentication.WebAuthenticationDetails;
    import javax.servlet.http.HttpServletRequest;
    
    public class CustomWebAuthenticationDetails extends WebAuthenticationDetails {
    
        private final String itemId;
    
        public CustomWebAuthenticationDetails(HttpServletRequest request) {
            super(request);
            itemId = request.getParameter("itemId");
        }
    
        public String getItemId() {
            return itemId;
        }
    
        //TODO override hashCode, equals and toString to include itemId
        @Override
        public int hashCode() { /* collapsed */ }
        @Override
        public boolean equals(Object obj) { /* collapsed */ }
        @Override
        public String toString() { /* collapsed */ }
    }

    Su ddAuthenticationSuccessHandler debe tener una lógica similar, como en este ejemplo:

    package com.dd.security;
    
    import org.springframework.security.core.Authentication;
    import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
    import org.springframework.util.StringUtils;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class DDAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            CustomWebAuthenticationDetails details = (CustomWebAuthenticationDetails) authentication.getDetails();
            if(StringUtils.hasText(details.getItemId())) {
                //TODO sanity and security check for itemId needed
                String redirectUrl = "item/" + details.getItemId();
                response.sendRedirect(redirectUrl);
            }
            throw new IllegalStateException("itemId in authentication details not found");
        }
    }

    Un ejemplo de trabajo se puede encontrar aquí

    • Gracias @ksokol, su muy útil para mí.
    • me alegro de oír eso. Buena suerte!
    • Después de leer un poco he descubierto que desde la Primavera de 3.1 puede simplificar su configuración mediante el uso de la autenticación de los detalles de la-fuente-ref en el formulario de inicio de sesión de nodo. Tomar alook aquí
    • hola muy útil, pero su me muestra «Error al convertir el valor de la propiedad de tipo de org.springframework.de seguridad.web.la autenticación.UsernamePasswordAuthenticationFilter’ de tipo ‘org.springframework.de seguridad.la autenticación.AuthenticationDetailsSource’ propiedad ‘authenticationDetailsSource’;» can u plz decir qué estoy haciendo mal
    • Desgraciadamente su descripción es demasiado vaga para ayudar a usted. Usted debe publicar su Primavera de configuración de Seguridad, un stacktrace y una guía de cómo reproducir el error. Tal vez usted puede poner en Stackoverflow una nueva pregunta?

Dejar respuesta

Please enter your comment!
Please enter your name here