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

基于Okta OIDC的Spring传统应用SSO用户信息获取求助

解决方案

核心问题说明

你当前使用的Okta Bookmark App本质只是跳转链接,默认不会携带用户身份信息。必须将应用配置为OIDC Web应用,通过OAuth2 Authorization Code Flow完成身份传递,才能在Spring后端获取到用户的邮箱、用户名及自定义声明等信息。

步骤1:重新配置Okta应用

  • 登录Okta控制台,删除原Bookmark App,创建新的OIDC - Web Application
  • 配置关键参数:
    • 登录重定向URI:填写Spring应用的回调地址,示例:http://localhost:8080/login/oauth2/code/okta
    • 授予类型:勾选Authorization Code
    • 可选配置注销重定向URI,示例:http://localhost:8080/logout
  • 保存后,记录下Client ID、Client Secret及你的Okta域名(https://dev-XXXXXXX.okta.com)

步骤2:Spring后端集成配置(非Spring Boot)

2.1 添加依赖

在Maven的pom.xml中加入Spring Security OAuth2相关依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-client</artifactId>
    <version>5.0.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
    <version>5.0.0.RELEASE</version>
</dependency>

2.2 配置Spring Security

创建Spring Security配置类,启用OAuth2客户端认证:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
import org.springframework.security.oauth2.core.oidc.IdTokenClaimNames;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .oauth2Login()
                .defaultSuccessUrl("/oktalogin", true); // 认证成功后跳转至你的目标路径
    }

    // 配置Okta客户端注册信息
    public ClientRegistrationRepository clientRegistrationRepository() {
        return new InMemoryClientRegistrationRepository(oktaClientRegistration());
    }

    private ClientRegistration oktaClientRegistration() {
        return ClientRegistration.withRegistrationId("okta")
            .clientId("你的Okta Client ID")
            .clientSecret("你的Okta Client Secret")
            .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
            .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
            .redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
            .scope("openid", "profile", "email") // 请求用户基础信息、邮箱权限
            .authorizationUri("https://dev-XXXXXXX.okta.com/oauth2/v1/authorize")
            .tokenUri("https://dev-XXXXXXX.okta.com/oauth2/v1/token")
            .userInfoUri("https://dev-XXXXXXX.okta.com/oauth2/v1/userinfo")
            .userNameAttributeName(IdTokenClaimNames.SUB)
            .jwkSetUri("https://dev-XXXXXXX.okta.com/oauth2/v1/keys")
            .clientName("Okta")
            .build();
    }
}

步骤3:在oktalogin控制器中获取用户信息

认证成功后,Spring Security会自动将用户身份信息封装到OAuth2User对象中,你可以直接通过注解获取:

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;

@Controller
public class OktaLoginController {

    @GetMapping("/oktalogin")
    public String handleOktaLogin(@AuthenticationPrincipal OAuth2User oauth2User, HttpServletRequest request) {
        // 获取用户名
        String username = oauth2User.getAttribute("preferred_username");
        // 获取邮箱
        String email = oauth2User.getAttribute("email");
        // 获取自定义声明属性(替换为你的自定义声明字段名)
        String customAttr = oauth2User.getAttribute("你的自定义声明名");

        // 将用户信息存入request,供JSP页面使用
        request.setAttribute("userInfo", oauth2User.getAttributes());

        return "你的目标JSP页面名称"; // 跳转至业务页面
    }
}

额外说明

  • 若需要获取自定义声明,需在Okta控制台的OIDC应用配置中,添加ID Token Claims,确保自定义字段在授权时返回给客户端。
  • 不推荐继续使用Bookmark App传递用户信息,因为无法保证安全性;若坚持使用,需手动在跳转URL中拼接明文id_token,但存在泄露风险。

内容的提问来源于stack exchange,提问作者ma hei pang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:50:18