MethodSecurity; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain;

@EnableWebFluxSecurity @EnableReactiveMethodSecurity public class SecurityConfiguration {

@Bean 
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
    http
        .authorizeExchange()
            .anyExchange().authenticated()
            .and()
        .oauth2ResourceServer()
            .jwt();
            
    // 向浏览器发送401消息(没有这个,您将看到一个空白页面)
    Okta.configureResourceServer401ResponseBody(http);
            
    return http.build();
} } ```

如果您想在同一应用程序中支持SSO和资源服务器,也可以做到!

@EnableWebFluxSecurity 
@EnableReactiveMethodSecurity 
public class SecurityConfiguration {

    @Bean 
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http
            .authorizeExchange()
                .anyExchange().authenticated()
                .and()
            .oauth2Login()
            .and()
            .oauth2ResourceServer()
                .jwt();
        return http.build();
    }
}

使用Spring WebFlux、WebSockets和React的全栈响应式 使用了SSO和资源服务器。其当前代码使用了Spring Security的OIDC支持。更改为使用Okta Spring Starter 大大减少了代码行数。

支持服务器端应用程序 - OAuth代码流

正在构建服务器端应用程序,只需要重定向到登录页面?这个OAuth 2.0代码流适合您。

在Okta上创建Web应用程序

要在Okta上为Spring Boot创建新的OIDC应用程序:

  1. 登录到您的开发者账户,导航到应用程序,点击添加应用程序
  2. 选择Web,然后点击下一步
  3. 给应用程序命名,并添加 http://localhost:8080/login/oauth2/code/okta 作为登录重定向URI。
  4. 点击完成

配置属性

您可以使用环境变量、系统属性或配置文件配置应用程序属性。查看Spring Boot文档了解更多详情。

属性 必需 详情
okta.oauth2.issuer 授权服务器发行者URL,例如:https://{yourOktaDomain}/oauth2/default
okta.oauth2.clientId 您的Okta OIDC应用程序的客户端ID
okta.oauth2.clientSecret 您的Okta OIDC应用程序的客户端密钥
okta.oauth2.postLogoutRedirectUri 设置为相对或绝对URI以启用RP-Initiated (SSO)登出

注意:设置postLogoutRedirectUri后,您的会话结束后将被重定向到它。因此,此资源必须是匿名可访问的,因此请确保将其添加到您的HttpSecurity配置中。

查看 postLogoutRedirectUri 示例: ```yaml okta: oauth2: postLogoutRedirectUri: "http://localhost:8080/logout/callback" ``` ```java import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() // 允许匿名访问根和登出页面 .antMatchers("/", "/logout/callback").permitAll() // 所有其他请求 .anyRequest().authenticated(); return http.build(); } } ```

创建简单应用程序

创建一个最小的Spring Boot应用程序:

@RestController
@SpringBootApplication
public class ExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }

    @GetMapping("/")
    public String getMessageOfTheDay(@AuthenticationPrincipal OidcUser user) {
        return user.getName() + ", 今天的消息很无聊";
    }
}

如果您想允许特定路由的匿名访问,可以添加一个SecurityFilterChain bean:

@Configuration
static class SecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/my-anon-page").permitAll()
                .anyRequest().authenticated()
            .and().oauth2Client()
            .and().oauth2Login();
        return http.build();
    }
}

如果您想为自定义授权服务器中的JWT令牌添加自定义声明,请参阅为令牌添加自定义声明以获取更多信息。

然后,您可以通过以下方式从令牌中提取属性:

@RestController
public class ExampleController {

    @GetMapping("/email")
    public String getUserEmail(AbstractOAuth2TokenAuthenticationToken authentication) {
        // AbstractOAuth2TokenAuthenticationToken适用于JWT和不透明访问令牌
        return (String) authentication.getTokenAttributes().get("sub");
    }
}

在Web服务器之间共享会话

授权代码流(典型的OAuth重定向)使用会话。如果您的应用程序有多个实例,您必须配置Spring Session实现,例如Redis、Hazelcast、JDBC等。

就是这样!

在您喜欢的浏览器中打开 http://localhost:8080

您将自动重定向到Okta登录页面。成功登录后,您将被重定向回您的应用程序,您将看到每日消息!

此模块与Spring Security的OAuth支持集成,您所需要做的就是用标准的@EnableOAuth2Client注释标记您的应用程序。

使用Spring Native

您可以将此启动器与Spring Native一起使用。但是,您需要在主Spring Boot应用程序类中启用HTTPS。例如:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.nativex.hint.NativeHint;

@NativeHint(options = "--enable-https")
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

您也可以在pom.xmlbuild.gradle中配置此设置。查看Spring Native文档了解更多信息。

代理

如果您的应用程序(带有此okta-spring-boot依赖项)在网络代理后面运行,您可以在application.yml中为其设置属性:

okta:
  oauth2:
    proxy:
      host: "proxy.example.com"
      port: 7000
      username: "your-username"             # 可选
      password: "your-secret-password"      # 可选

或者,您可以像这样向应用程序添加JVM参数:

-Dokta.oauth2.proxy.host=proxy.example.com
-Dokta.oauth2.proxy.port=port
-Dokta.oauth2.proxy.username=your-username
-Dokta.oauth2.proxy.password=your-secret-password

或者,您可以像这样以编程方式设置它:

System.setProperty("okta.oauth2.proxy.host", "proxy.example.com");
System.setProperty("okta.oauth2.proxy.port", "7000");
System.setProperty("okta.oauth2.proxy.username", "your-username");
System.setProperty("okta.oauth2.proxy.password", "your-secret-password");

查看这里获取属性的完整列表。

注意: Spring WebFlux(和WebClient)不支持这些属性。(见spring-projects/spring-security#8882)。

如果您在反向代理后面运行Spring Boot应用程序,请务必阅读指南。

在应用程序中注入Okta Java SDK

要将Okta Java SDK集成到您的Spring Boot应用程序中,您只需要添加一个依赖项:

<dependency>
    <groupId>com.okta.spring</groupId>
    <artifactId>okta-spring-sdk</artifactId>
</dependency>

然后定义okta.client.token属性。查看创建API令牌了解更多信息。

剩下的就是注入客户端(com.okta.sdk.client.Client)了!查看这篇文章了解更多关于以最佳方式注入您的bean的信息。

额外学分

想构建这个项目吗?

只需克隆它并运行:

$ git clone https://github.com/okta/okta-spring-boot.git 
$ cd okta-spring-boot
$ mvn install