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

Okta与Spring MVC集成:传统非Spring Boot项目Okta OAuth2实现咨询

Okta OAuth2 对接传统Spring MVC应用实现示例

1. 依赖引入

首先移除项目中原有Spring Boot专属的Okta Starter依赖,引入通用的Spring Security OAuth2及Okta SDK依赖,Maven配置如下:

<dependencies>
    <!-- Spring Security 核心 -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>5.7.10</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>5.7.10</version>
    </dependency>
    <!-- OAuth2 资源服务器 + JWT 支持 -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-resource-server</artifactId>
        <version>5.7.10</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
        <version>5.7.10</version>
    </dependency>
    <!-- Okta 通用配置工具 -->
    <dependency>
        <groupId>com.okta.commons</groupId>
        <artifactId>okta-config-check</artifactId>
        <version>1.3.0</version>
    </dependency>
    <!-- 原有Spring MVC、Servlet等依赖保持不变 -->
</dependencies>

注意依赖版本需要和你现有Spring MVC的版本匹配,上述版本适配Spring 5.3.x系列

2. 配置参数加载

在src/main/resources下新增okta.properties配置文件,填入你的Okta租户信息:

okta.oauth2.issuer=https://<你的Okta租户域名>.okta.com/oauth2/default
okta.oauth2.client-id=<你的Okta应用客户端ID>
okta.oauth2.client-secret=<你的Okta应用客户端密钥>
okta.oauth2.redirect-uri=http://localhost:8080/<你的项目上下文路径>/login/oauth2/code/okta

在Spring配置文件中加载该配置:

@Configuration
@PropertySource("classpath:okta.properties")
public class OktaPropertyConfig {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

3. Spring Security OAuth2 核心配置

创建Security配置类,完成Okta JWT校验、权限拦截的配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class OktaOAuth2SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${okta.oauth2.issuer}")
    private String oktaIssuer;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests(auth -> auth
                .antMatchers("/public/**", "/oauth2/authorization/okta").permitAll()
                .anyRequest().authenticated()
            )
            // 配置OAuth2登录逻辑
            .oauth2Login(oauth2 -> oauth2
                .redirectionEndpoint(redir -> redir
                    .baseUri("/login/oauth2/code/*")
                )
            )
            // 配置OAuth2资源服务器JWT校验逻辑
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(jwt -> jwt
                    .jwtAuthenticationConverter(jwtAuthenticationConverter())
                    .decoder(JwtDecoders.fromIssuerLocation(oktaIssuer))
                )
            );
    }

    // JWT权限映射,将Okta返回的scope、groups转换为Spring Security的权限标识
    private JwtAuthenticationConverter jwtAuthenticationConverter() {
        JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
        grantedAuthoritiesConverter.setAuthoritiesClaimName("groups");
        grantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");

        JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
        converter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);
        return converter;
    }
}

如果你的项目是基于XML配置的Spring项目,可以将上述配置转换为对应的<bean>声明注册到Spring上下文即可。

4. 接口测试示例

创建测试接口验证配置是否生效:

@RestController
@RequestMapping("/test")
public class OktaTestController {

    @GetMapping("/userinfo")
    @PreAuthorize("hasAnyRole('USER')")
    public Map<String, Object> getUserInfo(@AuthenticationPrincipal Jwt jwt) {
        Map<String, Object> result = new HashMap<>();
        result.put("userId", jwt.getSubject());
        result.put("userName", jwt.getClaim("name"));
        result.put("email", jwt.getClaim("email"));
        return result;
    }
}

启动项目后访问/test/userinfo会自动跳转到Okta登录页,登录成功后即可返回当前用户的JWT信息。

注意事项

  • 确保你在Okta管理后台配置的应用重定向URI、登出URI和项目中的配置完全一致,否则会出现授权失败错误
  • 若你原有项目已经存在自定义的Spring Security过滤器链,需要将OAuth2相关过滤器放在自定义身份认证过滤器之前执行
  • JWT校验默认会校验令牌的签发方、有效期,确保你的服务服务器时间和Okta服务时间偏差不超过5分钟

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:36:00