Spring Boot Nacos API 鉴权实现

引言

在微服务架构中,API 鉴权至关重要。Spring Boot 作为一个流行的微服务开发框架,结合 Nacos 作为服务注册与发现的工具,可以提高我们对 API 的安全性。本文将详细介绍如何使用 Spring Boot 和 Nacos 实现 API 鉴权,并提供代码示例、关系图及甘特图展示。

Nacos 简介

Nacos 是阿里巴巴开源的一个项目,主要用于配置管理和服务发现。它可以帮助微服务架构下的服务进行管理,并支持动态配置和服务治理。

关系图

在开始实现之前,我们需要了解系统的基本关系。下面是微服务与 Nacos 的基本关系图:

erDiagram
    SERVICE {
        string serviceId PK
        string serviceName
        string serviceUrl
    }
    AUTH {
        string authId PK
        string description
    }
    SERVICE ||--o{ AUTH : "has"

在上图中,SERVICE 表示微服务,而 AUTH 则表示与鉴权相关的实体。服务可以拥有多个鉴权规则。

Spring Boot 项目结构

在实现 API 鉴权之前,我们首先搭建基础的 Spring Boot 项目。项目的结构如下:

spring-boot-nacos-auth
 ├── src
 │   ├── main
 │   │   ├── java
 │   │   │   └── com
 │   │   │       └── example
 │   │   │           ├── NacosAuthApplication.java
 │   │   │           ├── config
 │   │   │           │   └── AuthConfig.java
 │   │   │           ├── controller
 │   │   │           │   └── GreetingController.java
 │   │   │           └── service
 │   │   │               └── AuthService.java
 │   │   └── resources
 │   │       └── application.yml
 └── pom.xml

代码实现

1. Maven 依赖

pom.xml 中添加 Nacos 和 Spring Boot 的相关依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 应用配置

application.yml 中配置 Nacos:

spring:
  application:
    name: nacos-auth-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3. 主应用程序

创建主类启动 Spring Boot 应用:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

4. 鉴权配置

AuthConfig.java 中配置简单的鉴权规则:

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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class AuthConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
    }
}

5. 示例控制器

创建一个示例控制器,供外部访问:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    @GetMapping("/greet")
    public String greet() {
        return "Hello, World!";
    }

    @GetMapping("/public/info")
    public String publicInfo() {
        return "This is public information.";
    }
}

甘特图

为了展示项目的执行阶段,下面是项目的甘特图:

gantt
    title Spring Boot Nacos API 鉴权项目计划
    dateFormat  YYYY-MM-DD
    section 项目规划
    需求分析         :done,  des1, 2023-10-01, 10d
    设计方案         :done,  des2, after des1, 10d
    section 开发阶段
    代码主干开发     :active, done, dev1, 2023-10-21, 20d
    集成测试         :dev2, 2023-11-11, 10d
    section 部署阶段
    生产环境部署     :crit, 2023-11-21, 5d

结论

本文介绍了如何结合 Spring Boot 和 Nacos 实现 API 的鉴权功能,从项目结构、代码实现到上下游关系图、项目进度安排等都进行了详细阐释。这种架构不仅提升了微服务的安全性,还增强了服务的可管理性。希望读者能够通过本文所示的方法,在自己的项目中实现更安全、更灵活的 API 鉴权策略。