Spring Boot 单点登录到 Python 实现指南

文章概述

在这篇文章中,我们将介绍如何使用 Spring Boot 实现单点登录 (SSO) 功能,通过 OAuth2 将用户的身份验证信息传递给 Python 后端服务。我们将从流程图开始,详细描述每个步骤所需的代码,以及相关注释,以帮助小白开发者快速上手。

设计流程

我们将整个实现过程分为以下几个步骤:

步骤 描述
1 设置 Spring Boot OAuth2 认证服务
2 设置 Python 后端应用
3 配置 Spring Boot 与 Python 的连接
4 测试单点登录功能
flowchart TD
    A[开始] --> B[设置Spring Boot OAuth2认证服务]
    B --> C[设置Python后端应用]
    C --> D[配置Spring Boot与Python的连接]
    D --> E[测试单点登录功能]
    E --> F[结束]

步骤详解

1. 设置 Spring Boot OAuth2 认证服务

首先,我们需要设置一个 Spring Boot 项目,添加必要的依赖。

pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

接下来,我们需要创建一个 WebSecurityConfig 类来配置安全性。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/login").permitAll() // 允许访问登录接口
            .anyRequest().authenticated() // 其他请求需要认证
            .and()
            .oauth2Login(); // 启用OAuth2登录
    }
}
  • @EnableWebSecurity:启用 Spring Security。
  • antMatchers("/login").permitAll():允许所有用户访问登录页面。
  • oauth2Login():启用 OAuth2 登录。

2. 设置 Python 后端应用

接着,我们需要设置一个简单的 Python Flask 应用,处理来自 Spring Boot 的用户身份验证。

首先,安装 Flask 和 Flask-OAuthlib:

pip install Flask Flask-OAuthlib

然后,创建一个 app.py 文件:

from flask import Flask, jsonify, request
from flask_oauthlib.provider import OAuth2Provider

app = Flask(__name__)
oauth = OAuth2Provider(app)

@app.route('/api/user', methods=['GET'])
@oauth.require_oauth('email')  # 需要OAuth2邮箱权限
def user_info():
    user = request.oauth.user
    return jsonify({'status': 'success', 'user': user.username})

if __name__ == '__main__':
    app.run(debug=True)
  • @oauth.require_oauth('email'):确保请求者有邮箱权限。

3. 配置 Spring Boot 与 Python 的连接

在 Spring Boot 应用中,我们可以在 application.properties 中配置 Python 后端服务的 URL,使用 RestTemplate 进行请求。

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

创建一个服务调用 Python API:

@Service
public class UserService {
    @Autowired
    private RestTemplate restTemplate;

    public String getUserInfo(String token) {
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        HttpEntity<String> entity = new HttpEntity<>(headers);
        ResponseEntity<String> response = restTemplate.exchange("http://localhost:5000/api/user", HttpMethod.GET, entity, String.class);
        return response.getBody();
    }
}
  • setBearerAuth(token):设置请求头中的 Bearer 令牌。

4. 测试单点登录功能

现在,我们已经完成了所有的设置。启动 Spring Boot 应用和 Python Flask 应用,然后访问 /login 路由进行测试。

UML 类图

以下是我们系统的类图,以便更好地理解我们程序中的类与关系。

classDiagram
class WebSecurityConfig {
    +configure(HttpSecurity http) void
}

class UserService {
    +getUserInfo(String token) String
}

class FlaskApp {
    +user_info() JSON
}

结论

通过以上步骤,我们成功实现了通过 Spring Boot 进行单点登录到 Python 后端的功能。文章中包含了详细的代码和注释,帮助您理解每一步的操作。希望这篇指南能够为您提供实际的帮助,顺利完成项目!