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
相关产品推荐
相关产品推荐

