专业的编程技术博客社区

网站首页 > 博客文章 正文

如何通过SpringBoot 实现一个OAuth2.0的提供者?

baijin 2024-12-14 10:29:21 博客文章 7 ℃ 0 评论

要通过Spring Boot 实现一个 OAuth 2.0 的提供者(Authorization Server)可以通过Spring Authorization Server来实现,下面我们就来通过一个简单的小例子来看看,如何通过SpringBoot来实现OAuth 2.0 授权服务器的功能。

添加依赖

首先,需要在Spring Boot项目中添加必要的依赖配置,例如要添加对于Spring Authorization Server和Spring Security相关依赖,如下所示。

<dependencies>
    <!-- Spring Boot Starter Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    <!-- Spring Authorization Server -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-authorization-server</artifactId>
        <version>1.1.2</version>
    </dependency>
    
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Spring Data JPA (if you want to persist client details) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- H2 Database for development -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

配置授权服务器

接下来,就是需要通过一个配置类来添加相关的授权服务器认证配置操作,如下所示。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.oauth2.server.authorization.config.ProviderSettings;
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;

@Configuration
public class AuthorizationServerConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
        http
            .authorizeHttpRequests(authorizeRequests ->
                authorizeRequests.anyRequest().authenticated()
            )
            .formLogin();
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        var userDetailsService = new InMemoryUserDetailsManager();
        userDetailsService.createUser(
            User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build()
        );
        return userDetailsService;
    }

    @Bean
    public AuthorizationServerSettings providerSettings() {
        return AuthorizationServerSettings.builder()
            .issuer("http://localhost:8080")
            .build();
    }
}

配置OAuth2客户端

接下来就是定义定义授权服务器中的客户端信息,我们可以将这个数据信息存储到内存中或者是通过外部存储进行持久化的存储,如下所示。我们将相关的数据信息添加到了内存中进行存储。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
import org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;

@Configuration
public class ClientConfig {

    @Bean
    public RegisteredClientRepository registeredClientRepository() {
        RegisteredClient registeredClient = RegisteredClient.withId("client-id")
            .clientId("client-id")
            .clientSecret("{noop}client-secret")
            .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
            .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
            .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
            .redirectUri("http://localhost:8080/login/oauth2/code/client-oidc")
            .scope("openid")
            .build();

        return new InMemoryRegisteredClientRepository(registeredClient);
    }
}

启动应用程序

完成上述操作之后,我们的SpringBoot应用就可以作为一个OAuth 2.0 的授权服务器运行了,我们可以通过访问/oauth2/authorize 来进行授权,然后通过通过 /oauth2/token 来获取令牌。

通过 Postman 或其他 OAuth 2.0 客户端工具测试上面这个的授权服务器。我们也可以测试授权码流程、客户端凭据、密码模式等。

总结

通过上面的步骤,我们就可以创建一个简单的OAuth 2.0提供者(授权服务器)。当然,在实际开发过程中我们也可以根据需要扩展和自定义实现,比如使用数据库存储客户端信息、添加更多的授权类型、集成 JWT 令牌等。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表