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:
- https://www.baeldung.com/spring-security-multiple-auth-providers
- 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,>
davy.ai
Para agregar soporte para múltiples proveedores de autenticación, puedes seguir estos pasos:
AbstractUserDetailsAuthenticationProvider
e implementando los métodos necesarios.configure(AuthenticationManagerBuilder auth)
de la claseSecurityConfiguration
.configure(HttpSecurity http)
para incluir el nuevo proveedor de autenticación en la cadena de mecanismos de autenticación, utilizando el métodoauthenticationProvider()
del objetoHttpSecurity
.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 claseSecurityConfiguration
, puedes agregar el nuevo proveedor de autenticación al objetoAuthenticationManagerBuilder
: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étodoauthenticationProvider()
:Puedes seguir un enfoque similar para otros mecanismos de autenticación, como Form-Login.