修改OAuth2AuthorizationRequestRedirectFilter的BaseURI后重定向异常
根因分析
Spring Security OAuth2 授权请求重定向过滤器OAuth2AuthorizationRequestRedirectFilter的默认路径匹配规则为 baseUri + /{registrationId},其中{registrationId}是必填路径变量,用来定位你配置的对应OAuth客户端注册信息,因此直接访问你配置的baseUri本身无法命中匹配规则。
你手动拼接/github/oauth2/authorization/GitHub后仍提示匹配/github/oauth2/authorization/GitHub/{registrationId},大概率是配置中重复调用了.baseUri()方法,或者常量定义拼接了多余的路径后缀,可先检查配置是否仅设置了一次授权端点基础URI。
解决方案
方案一:适配框架默认规则(改动最小,推荐使用)
无需修改框架逻辑,仅需调整你接口返回的登录地址,在配置的baseUri后拼接你GitHub客户端的registrationId即可。比如你的GitHub客户端注册ID为github,则返回登录地址为/github/oauth2/authorization/github。
同时需要同步配置回调端点的基础URI,避免后续回调匹配失败:
.oauth2Login() .authorizationEndpoint() .baseUri(GitHubRequestPaths.GITHUB_OAUTH_REDIRECT) .and() .redirectionEndpoint() .baseUri("/github/oauth2/code/*") // 需和你在GitHub平台配置的回调地址前缀保持一致
方案二:自定义匹配逻辑(适配固定登录地址需求)
如果业务要求必须使用/github/oauth2/authorization作为固定登录入口,不需要在路径中携带registrationId,可以自定义过滤器替换框架默认实现:
- 自定义重定向过滤器,固定返回GitHub客户端的注册ID:
public class CustomOAuth2AuthRequestRedirectFilter extends OAuth2AuthorizationRequestRedirectFilter { // 替换为你自己的GitHub客户端注册ID private static final String GITHUB_REG_ID = "github"; public CustomOAuth2AuthRequestRedirectFilter(ClientRegistrationRepository clientRepo, String baseUri) { super(clientRepo, baseUri); // 替换默认请求匹配器,直接匹配你的固定登录地址 this.setRequiresAuthorizationRequestMatcher(new AntPathRequestMatcher("/github/oauth2/authorization")); } @Override protected String resolveRegistrationId(HttpServletRequest request) { // 固定返回GitHub的注册ID,无需从路径变量取值 return GITHUB_REG_ID; } }
- 在安全配置类中添加自定义过滤器,替换默认实现:
@Autowired private ClientRegistrationRepository clientRegistrationRepository; @Override protected void configure(HttpSecurity http) throws Exception { http .oauth2Login() .authorizationEndpoint() .baseUri(GitHubRequestPaths.GITHUB_OAUTH_REDIRECT) .and() .redirectionEndpoint() .baseUri("/github/oauth2/code/*") .and() // 其他安全配置省略 .and() // 将自定义过滤器添加到默认过滤器之前,替换原有逻辑 .addFilterBefore( new CustomOAuth2AuthRequestRedirectFilter(clientRegistrationRepository, GitHubRequestPaths.GITHUB_OAUTH_REDIRECT), OAuth2AuthorizationRequestRedirectFilter.class ); }
内容的提问来源于stack exchange,提问作者wyt
相关产品推荐
相关产品推荐

