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?
davy.ai
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:
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.