资源认证模块基于 Spring Security OAuth2 Resource Server,保护 API 资源端点。

支持两种 Token 校验模式:

  • 远程校验:通过 spring.security.oauth2.resourceserver.jwt.jwk-set-uri 配置,向授权服务器实时校验 Token

  • 本地校验:实现 LocalTokenService 接口,在本地完成 Token 解析和校验,减少网络开销

配置

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          # 远程校验模式:JWK Set URI
          jwk-set-uri: http://auth-server/oauth2/jwks
如果同时配置了 LocalTokenService Bean,将优先使用本地校验模式。

Gradle 引用

// 资源保护
implementation 'com.luamas.thinkbridge:authorization-resource-spring-boot-starter'

完整代码如下:

plugins {
  id 'org.springframework.boot' version '4.1.1'
  id 'io.spring.dependency-management' version '1.1.7'
  id 'java'
}

group = 'com.thinkbridge.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '25'

ext {
  set('springCloudVersion', "2025.1.3")
  set('thinkBridgeVersion', "2025.1.2")
}

configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'com.luamas.thinkbridge:authorization-resource-spring-boot-starter'
  implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
  implementation "org.springframework.boot:spring-boot-starter-actuator"

  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    mavenBom "com.luamas.thinkbridge:thinkbridge-bom:${thinkBridgeVersion}"
  }
}

test {
  useJUnitPlatform()
}

自定义token认证

当需要自定义本地 Token 认证逻辑时,必须实现 com.luamas.thinkbridge.common.security.oauth2.resource.local.LocalTokenService 接口。

接口说明

LocalTokenService 接口用于自定义资源服务器的本地 Token 校验逻辑,适用于需要从自定义存储中验证 Token 的场景。

实现示例

以下示例展示了如何实现自定义的本地 Token 认证服务:

package com.thinkbridge.demo.servicea;

import com.luamas.thinkbridge.common.security.oauth2.resource.local.LocalTokenService;
import com.luamas.thinkbridge.common.security.vo.AuthAuthority;
import com.luamas.thinkbridge.common.security.vo.UserInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Component;

import java.util.*;

@Component
@RequiredArgsConstructor
public class MyLocalTokenService implements LocalTokenService {
    @Override
    public UserInfo verify(String token) {
        return new UserInfo() {
            @Override
            public String getUserId() {
                return "123";
            }

            @Override
            public Collection<? extends GrantedAuthority> getAuthorities() {
                return Collections.singleton(new AuthAuthority("qas"));
            }
            @Override
            public List<String> getRoleIds() {
                return new ArrayList<>();
            }

            @Override
            public Map<String, Object> getExtend() {
                return new HashMap<>();
            }

            @Override
            public String getName() {
                return "123";
            }
        };
    }
}
如果有自定义本地认证需要的使用者,建议将其放在自己所有服务的 common 模块内,并进行依赖共享。