es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Inicio de sesión, cierre de sesión y validación de token después de inicio de sesión con Spring Boot y LDAP.

Estoy integrando spring boot con LDAP para autenticar un usuario. De esta forma, solo los usuarios autenticados pueden acceder a la API.

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    LdapAuthenticationProvider authenticationProvider(final LdapAuthenticator authenticator) {
        return new LdapAuthenticationProvider(authenticator);
    }

    @Bean
    BindAuthenticator authenticator(final BaseLdapPathContextSource contextSource) {
        final BindAuthenticator authenticator = new BindAuthenticator(contextSource);
        authenticator.setUserDnPatterns(new String[] {
                "xx" });
        return authenticator;
    }

    @Override
    public void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication().userSearchFilter("(sAMAccountName={0})")
        .contextSource(contextSource());
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
        .csrf()
        .disable()
                .formLogin().and()
        .authorizeRequests()
        .anyRequest().fullyAuthenticated().and().logout()
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        .logoutSuccessUrl("/login");

    }

    @Override
    public void configure(final WebSecurity web) throws Exception {
        web.debug(true);
    }

    @Bean
    LdapContextSource contextSource() {
        final LdapContextSource contextSource = new LdapContextSource();
        contextSource.setUrl("xx");
        contextSource.setBase("xx");
        contextSource.setUserDn("xx");
        contextSource.setPassword("xx");
        contextSource.setPooled(true);
        contextSource.afterPropertiesSet();
        return contextSource;
    }

    @Bean
    public LdapTemplate ldapTemplate() {
        final LdapTemplate ldapTemplate = new LdapTemplate(
            contextSource());
        ldapTemplate.setIgnorePartialResultException(true);
        return ldapTemplate;
    }
}

Estoy usando el inicio de sesión de formulario incorporado.

Pregunta
1. ¿Quién (qué clase) es responsable de crear un token exitoso y dónde se almacena y en llamadas sucesivas, cómo se valida?
2. Ahora, solo estoy redirigiendo las llamadas no autenticadas a la página de inicio de sesión, debido a esto, está dando respuestas de éxito 200. ¿Cómo puedo anular esto y enviar 401?

Editado:
Tengo una pregunta específica:
Si no hay un token, el usuario se almacena en la sesión -> ¿cómo se validan las solicitudes posteriores? ¿Cuáles son las clases utilizadas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai
    1. El token de éxito es creado por AuthenticationManagerBuilder, específicamente a través del método ldapAuthentication(). En este ejemplo de código, el token de éxito no se almacena explícitamente, sino que se incluye en el HttpHeaders de la respuesta como una cookie llamada “SESSION”. Las solicitudes posteriores incluyen esta cookie en las cabeceras de solicitud y el token de éxito se valida automáticamente por la clase WebSecurityConfig y las clases relacionadas en el marco de seguridad Spring Security.
    2. Para enviar una respuesta de error 401 no autorizada en lugar de redirigir a la página de inicio de sesión, puede agregar el siguiente código al método configure() en la clase WebSecurityConfig:

    http.exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
    

    Esto establece el punto de entrada de autenticación para devolver una respuesta de error 401 no autorizada en lugar de redirigir a la página de inicio de sesión.

    En cuanto a la pregunta editada: si no hay token, el usuario no está exactamente “almacenado” en la sesión, sino que la sesión se marca como no autenticada. Las solicitudes posteriores son validadas por SecurityContextPersistenceFilter, que recupera la información de autenticación de HttpSession y establece el SecurityContext para el subproceso actual. La información de autenticación incluye las credenciales del usuario y los roles de autorización. Cuando se realiza una solicitud, se verifica la información de autenticación para asegurarse de que el usuario esté autenticado y autorizado para acceder al recurso solicitado. Las clases relevantes utilizadas en este proceso incluyen SecurityContextPersistenceFilter, HttpSessionSecurityContextRepository y SecurityContextHolder.

Comments are closed.