Spring Boot集成Auth0时如何指定connection参数?
解决方案:Spring Boot集成Auth0时添加connection参数
要在Spring Boot的OAuth2授权请求中添加connection参数,可通过自定义OAuth2AuthorizationRequestResolver实现,具体步骤如下:
1. 自定义授权请求解析器
创建继承DefaultOAuth2AuthorizationRequestResolver的类,重写解析方法,在授权请求中注入connection参数:
import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver; import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; import jakarta.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; public class CustomAuth0AuthorizationRequestResolver extends DefaultOAuth2AuthorizationRequestResolver { private static final String CONNECTION_PARAM = "connection"; private final String connectionValue; public CustomAuth0AuthorizationRequestResolver(OAuth2AuthorizationRequestResolver delegate, String connectionValue) { super(delegate); this.connectionValue = connectionValue; } @Override public OAuth2AuthorizationRequest resolve(HttpServletRequest request) { OAuth2AuthorizationRequest authorizationRequest = super.resolve(request); return addConnectionParameter(authorizationRequest); } @Override public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) { OAuth2AuthorizationRequest authorizationRequest = super.resolve(request, clientRegistrationId); return addConnectionParameter(authorizationRequest); } private OAuth2AuthorizationRequest addConnectionParameter(OAuth2AuthorizationRequest authorizationRequest) { if (authorizationRequest == null) { return null; } Map<String, Object> additionalParameters = new HashMap<>(authorizationRequest.getAdditionalParameters()); additionalParameters.put(CONNECTION_PARAM, connectionValue); return OAuth2AuthorizationRequest.from(authorizationRequest) .additionalParameters(additionalParameters) .build(); } }
2. 配置SecurityFilterChain
在Spring Security配置类中,替换默认授权请求解析器,注入自定义实现并指定connection值:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { private final ClientRegistrationRepository clientRegistrationRepository; public SecurityConfig(ClientRegistrationRepository clientRegistrationRepository) { this.clientRegistrationRepository = clientRegistrationRepository; } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 .authorizationEndpoint(authEndpoint -> authEndpoint .authorizationRequestResolver(auth0AuthorizationRequestResolver()) ) ); return http.build(); } private OAuth2AuthorizationRequestResolver auth0AuthorizationRequestResolver() { DefaultOAuth2AuthorizationRequestResolver defaultResolver = new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, "/oauth2/authorization"); // 替换为你的Auth0 connection名称 return new CustomAuth0AuthorizationRequestResolver(defaultResolver, "[your-connection-name]"); } }
3. 可选:从配置文件读取connection值
若想将connection值存入配置文件,可在application.properties中添加:
auth0.connection=[your-connection-name]
再修改配置类,通过@Value注入该值:
import org.springframework.beans.factory.annotation.Value; // ... @Configuration @EnableWebSecurity public class SecurityConfig { private final ClientRegistrationRepository clientRegistrationRepository; @Value("${auth0.connection}") private String auth0Connection; public SecurityConfig(ClientRegistrationRepository clientRegistrationRepository) { this.clientRegistrationRepository = clientRegistrationRepository; } // ... private OAuth2AuthorizationRequestResolver auth0AuthorizationRequestResolver() { DefaultOAuth2AuthorizationRequestResolver defaultResolver = new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, "/oauth2/authorization"); return new CustomAuth0AuthorizationRequestResolver(defaultResolver, auth0Connection); } }
补充说明
Auth0支持团队提到的开启“显示为按钮”选项是快速解决方案,但通过自定义授权请求解析器,可直接在Spring Boot层面添加connection参数,实现直接跳转至指定连接的登录页,无需用户手动点击按钮。
内容的提问来源于stack exchange,提问作者rphello101
相关产品推荐
相关产品推荐

