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ízjava.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
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:
Y aquí hay un ejemplo de cómo se podría modificar el método getGrantedAuthorities:
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!