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.

Servicio de usuario OAUTH2 con proveedores de autenticación personalizados.

Soy nuevo en Spring Security y Oauth2. En mi aplicación de arranque de spring, he implementado la autenticación con Oauth2 con el siguiente conjunto de cambios:

El servicio de usuario Ouath2 personalizado es el siguiente:

@Component
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

private UserRepository userRepository;

@Autowired
public void setUserRepository(UserRepository userRepository) {
    this.userRepository = userRepository;
}

public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
    ...
}

}

La configuración de seguridad es la siguiente:

@EnableWebSecurity
@Import(SecurityProblemSupport.class)
@ConditionalOnProperty(
value = “myapp.authentication.type”,
havingValue = “oauth”,
matchIfMissing = true
)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

private final CustomOAuth2UserService customOAuth2UserService;

public SecurityConfiguration(CustomOAuth2UserService customOAuth2UserService) {
    this.customOAuth2UserService = customOAuth2UserService;
}

@Override
public void configure(WebSecurity web) {
    ...
}

public void configure(HttpSecurity http) throws Exception {
    ...
}

private OAuth2UserService<oauth2userrequest, oauth2user=""> oauth2UserService() {
    return customOAuth2UserService;
}

}

El contenido de application.properties es el siguiente:

spring.security.oauth2.client.registration.keycloak.client-id=abcd
spring.security.oauth2.client.registration.keycloak.client-name=Auth Server
spring.security.oauth2.client.registration.keycloak.scope=api
spring.security.oauth2.client.registration.keycloak.provider=keycloak
spring.security.oauth2.client.registration.keycloak.client-authentication-method=basic
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
myapp.oauth2.path=https://internal.authprovider.com/oauth2/
spring.security.oauth2.client.provider.keycloak.token-uri=${myapp.oauth2.path}token
spring.security.oauth2.client.provider.keycloak.authorization-uri=${myapp.oauth2.path}authorize
spring.security.oauth2.client.provider.keycloak.user-info-uri=${myapp.oauth2.path}userinfo
spring.security.oauth2.client.provider.keycloak.user-name-attribute=name
myapp.authentication.type=oauth

Ahora, con el mecanismo de autenticación existente, me gustaría agregar soporte para múltiples proveedores de autenticación: LDAP, Form-Login, etc.

En este sentido, he leído algunos artículos:

  1. https://www.baeldung.com/spring-security-multiple-auth-providers
  2. https://stackoverflow.com/questions/22606751/custom-authentication-provider-with-spring-security-and-java-config?noredirect=1&lq=1

Pero no estoy recibiendo ninguna idea concreta sobre qué cambios debo hacer en la base de código existente para lograr esto.

¿Podría alguien ayudar aquí? Gracias.</oauth2userrequest,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar soporte para múltiples proveedores de autenticación, puedes seguir estos pasos:

    1. Crea un nuevo proveedor de autenticación para el mecanismo deseado (LDAP, Form-Login, etc.) mediante la extensión de la clase AbstractUserDetailsAuthenticationProvider e implementando los métodos necesarios.
    2. Agrega el nuevo proveedor de autenticación al administrador de autenticación en el método configure(AuthenticationManagerBuilder auth) de la clase SecurityConfiguration.
    3. Modifica el método configure(HttpSecurity http) para incluir el nuevo proveedor de autenticación en la cadena de mecanismos de autenticación, utilizando el método authenticationProvider() del objeto HttpSecurity.

    Por ejemplo, para agregar un proveedor de autenticación LDAP, puedes crear una nueva clase que extienda AbstractUserDetailsAuthenticationProvider e implemente los métodos necesarios para conectarte al servidor LDAP y autenticar al usuario. Luego, en la clase SecurityConfiguration, puedes agregar el nuevo proveedor de autenticación al objeto AuthenticationManagerBuilder:

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(ldapAuthenticationProvider());
    }
    
    @Bean
    public LdapAuthenticationProvider ldapAuthenticationProvider() {
        return new LdapAuthenticationProvider();
    }
    

    Finalmente, en el método configure(HttpSecurity http) puedes incluir el nuevo proveedor de autenticación en la cadena de mecanismos de autenticación, utilizando el método authenticationProvider():

    http
        .authorizeRequests()
            .antMatchers("/protected/**").authenticated()
            .anyRequest().permitAll()
        .and()
        .formLogin()
        .and()
        .ldapAuthentication()
            .userSearchBase("ou=people")
            .userSearchFilter("(uid={0})")
            .groupSearchBase("ou=groups")
            .groupSearchFilter("(member={0})")
            .contextSource(contextSource())
        .and()
        .authenticationProvider(ldapAuthenticationProvider());
    

    Puedes seguir un enfoque similar para otros mecanismos de autenticación, como Form-Login.

Comments are closed.