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.

Seguridad de Primavera – La integración de autenticación de la base de datos local y LDAP genera: La excepción es java.lang.ClassCastException.

Soy un traductor de documentos de TI al español. Traduzca lo siguiente al español. No traduzca el código y lo que se muestra en markdown.

Soy nuevo en Spring.

En mi aplicación SpringBoot, tenía autenticación DB-local. El nuevo requisito es implementar una autenticación LDAP. La autenticación local funciona correctamente y se devuelven los detalles del usuario local para generar el JWT, pero cuando un usuario de LDAP intenta autenticarse, se devuelve la siguiente excepción de Java:

Servlet.service () para el servlet [dispatcherServlet] en el contexto con la ruta []
[] lanzó una excepción [Fallo en el procesamiento de solicitudes; excepción anidada
java.lang.ClassCastException: clase
org.springframework.security.ldap.userdetails.LdapUserDetailsImpl
no se puede convertir en clase
semicore.rest.security.documents.UserDetailsImpl
(org.springframework.security.ldap.userdetails.LdapUserDetailsImpl y
semicore.rest.security.
 

documents.UserDetailsImpl están en el módulo sin nombre del cargador
org.springframework.boot.loader.LaunchedURLClassLoader @ 21b8d17c)]
con causa raíz

java.lang.ClassCastException: clase
org.springframework.security.ldap.userdetails.LdapUserDetailsImpl
no se puede convertir en clase semicore.rest.security.documents.
 
UserDetailsImpl (org.springframework.security.ldap.userdetails.LdapUserDetailsImpl y
semicore.rest.security.documents.UserDetailsImpl están en el módulo sin nombre
del cargador org.springframework.boot.loader.LaunchedURLClassLoader
@ 21b8d17

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la conversión de LdapUserDetailsImpl a UserDetailsImpl en el archivo JwtUtils.java. Esto se debe probablemente a que los detalles del usuario en LDAP contienen diferentes campos o atributos en comparación con los detalles del usuario local.

    Para solucionar el problema, puede crear una implementación separada de UserDetails que esté específicamente diseñada para la autenticación LDAP. Esta implementación debe implementar la interfaz UserDetails y contener los atributos necesarios para la generación de JWT.

    Luego, puede modificar el método getGrantedAuthorities en la clase LdapUserAuthoritiesPopulator para que devuelva el objeto UserDetails personalizado en su lugar, el cual luego puede ser convertido a la clase correcta en JwtUtils.java. De esta manera, puede manejar tanto la autenticación local como la LDAP, sin conflictos.

    Aquí hay un ejemplo de cómo podría ser la nueva clase UserDetails:

    public class LdapUserDetails implements UserDetails {
        private String username;
        private String firstName;
        private String lastName;
        private String email;
        private List<grantedauthority> authorities;
    
        // Constructor, getters y setters
    }
    

    Y aquí hay un ejemplo de cómo se podría modificar el método getGrantedAuthorities:

    @Override
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) {
        LdapUserDetails userDetails = new LdapUserDetails();
        userDetails.setUsername(username);
        userDetails.setFirstName(userData.getStringAttribute("givenName"));
        userDetails.setLastName(userData.getStringAttribute("sn"));
        userDetails.setEmail(userData.getStringAttribute("mail"));
        List<grantedauthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority("ROLE_USER")); // Puede agregar roles adicionales según los atributos de LDAP
        userDetails.setAuthorities(authorities);
        return authorities;
    }
    

    Finalmente, asegúrese de modificar el archivo JwtUtils.java para convertir el principal de autenticación a la nueva clase LdapUserDetails en lugar de UserDetailsImpl. Esto debería resolver el problema de ClassCastException.

    ¡Espero que esto ayude!

Comments are closed.