You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单Spring Boot后端处理多Angular应用的OAuth2/OIDC登录?

单个Spring Boot OAuth2后端支持多Angular前端登录重定向方案

针对你的场景,核心问题是让后端识别登录请求来自哪个前端应用,登录成功后精准重定向回去。以下是两种实用的实现方案:


方案一:通过请求参数传递前端地址并验证

步骤1:修改Angular前端登录逻辑

在登录按钮的点击事件中,将当前应用的根地址作为redirect_uri参数传递给后端的OAuth2授权接口:

// Angular组件中的登录方法
login() {
  const frontendOrigin = window.location.origin;
  // 编码参数避免特殊字符问题
  const encodedRedirectUri = encodeURIComponent(frontendOrigin);
  // 替换company-idp为你的OAuth2客户端注册ID
  window.location.href = `http://localhost:8080/oauth2/authorization/company-idp?redirect_uri=${encodedRedirectUri}`;
}

步骤2:配置Spring Security过滤链

自定义OAuth2登录成功处理器,获取前端传递的地址并验证合法性后完成重定向:

@Configuration
public class SecurityConfig {

    @Value("${app.allowed-frontend-uris}")
    private List<String> allowedFrontendUris;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/public/**").permitAll()
                        .anyRequest().authenticated()
                )
                .requestCache(cache -> cache.requestCache(new HttpSessionRequestCache()))
                .cors(Customizer.withDefaults())
                .csrf(AbstractHttpConfigurer::disable)
                .oauth2Login(oauth2 -> oauth2
                        .successHandler((request, response, authentication) -> {
                            // 获取前端传递的redirect_uri参数
                            String redirectUri = request.getParameter("redirect_uri");
                            // 验证地址是否在白名单中,默认跳转到第一个前端地址
                            String targetUri = allowedFrontendUris.contains(redirectUri) 
                                    ? redirectUri 
                                    : allowedFrontendUris.get(0);
                            response.sendRedirect(targetUri);
                        })
                )
                .build();
    }

    // 配置CORS允许前端域名跨域
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(allowedFrontendUris);
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        config.setAllowedHeaders(Collections.singletonList("*"));
        config.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

步骤3:配置前端地址白名单

在application.yml中添加允许的前端域名列表:

app:
  allowed-frontend-uris:
    - http://localhost:4200
    - http://localhost:4300

spring:
  security:
    oauth2:
      client:
        registration:
          company-idp: # 替换为你的OAuth2客户端ID
            client-id: your-client-id
            client-secret: your-client-secret
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope: openid,profile,email
        provider:
          company-idp:
            issuer-uri: https://your-company-oidc-server-url # 替换为公司OIDC服务器地址

方案二:通过会话存储前端地址(更安全)

如果担心redirect_uri参数被篡改,可以先通过后端接口将前端地址存入会话:

步骤1:修改前端登录逻辑

跳转至后端初始化登录接口,传递当前应用地址:

login() {
  const frontendOrigin = window.location.origin;
  const encodedRedirectUri = encodeURIComponent(frontendOrigin);
  window.location.href = `http://localhost:8080/api/init-login?redirect_uri=${encodedRedirectUri}`;
}

步骤2:添加后端初始化登录接口

验证地址合法性后存入会话,再重定向到OAuth2授权页面:

@RestController
@RequestMapping("/api")
public class LoginController {

    @Value("${app.allowed-frontend-uris}")
    private List<String> allowedFrontendUris;

    @GetMapping("/init-login")
    public String initLogin(@RequestParam String redirectUri, HttpSession session) {
        if (allowedFrontendUris.contains(redirectUri)) {
            session.setAttribute("frontendRedirectUri", redirectUri);
        }
        return "redirect:/oauth2/authorization/company-idp";
    }
}

步骤3:修改登录成功处理器

从会话中取出存储的地址完成重定向:

// 在SecurityConfig的oauth2Login配置中替换successHandler
.successHandler((request, response, authentication) -> {
    HttpSession session = request.getSession();
    String redirectUri = (String) session.getAttribute("frontendRedirectUri");
    String targetUri = allowedFrontendUris.contains(redirectUri) 
            ? redirectUri 
            : allowedFrontendUris.get(0);
    response.sendRedirect(targetUri);
    // 清除会话中的地址,避免重复使用
    session.removeAttribute("frontendRedirectUri");
})

关键注意事项

  • 合法性验证:必须对前端传递的重定向地址做白名单校验,防止恶意跳转攻击。
  • CORS配置:确保后端允许所有前端域名的跨域请求,且开启allow-credentials以支持会话共享。
  • OAuth2回调地址:后端配置的redirect-uri是OIDC服务器回调后端的地址,和前端的重定向地址是两个独立的概念,不要混淆。

内容的提问来源于stack exchange,提问作者MKaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:35:54