这一期讲讲解如何搭建一个资源服务器跟认证中心结合起来使用,资源服务器同样是基于 springboot3+spring security 来搭建的。
创建工程:
跟认证中心需要的依赖包类似,但是需要额外添加一个 spring-security-oauth2-resource-server 的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-authorization-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-resource-server</artifactId>
</dependency>
复制代码
配置认证中心:
这里我都是使用 JWT 来做认证的,所以资源服务器需要从认证中心获取到 jwt 的配置,用来解析 JWT。
1、添加一个 filter,配置需要认证的 URL。
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated()
)
.cors(Customizer.withDefaults())
.oauth2ResourceServer(resourceServer -> resourceServer.jwt(jwtConfigurer -> {
log.info(jwtConfigurer.toString());
}));
return http.build();
}
复制代码
2、配置 JWT 的 decoder,指定从认证中心读取 JWT 的配置。
@Bean
JwtDecoder jwtDecoder() {
return NimbusJwtDecoder.withJwkSetUri("http://localhost:8000/oauth2/jwks").build();
}
复制代码
3、第一步配置的是所有请求都需要认证,所以任何请求都是需要认证的,如果还需要认证 scope,需要添加两个注解,一个是 @EnableMethodSecurity,一个是 @PreAuthorize("hasAuthority('SCOPE_user:all')"),hasAuthority 的 value 是需要以'SCOPE_'开头的,实例代码如下。
@RestController
@EnableMethodSecurity
public class ResourceDemo {
@GetMapping("/greet")
@PreAuthorize("hasAuthority('SCOPE_user:all')")
public Mono<String> getGreeting(Authentication auth) {
if(auth!=null){
return Mono.just(auth.getName());
}
return Mono.just("guest");
}
@GetMapping("/greet2")
public Mono<String> noAuth(Authentication auth) {
if(auth!=null){
return Mono.just(auth.getName());
}
return Mono.just("guest");
}
}
复制代码
完成上述步骤以后,整个资源服务器搭建完成了,同时/greet 接口是需要有"user:all"的授权,而/greet 接口只要通过认证就可以了。
在视频如何搭建一个专属的认证中心(三)_哔哩哔哩_bilibili中有讲解如何从前端以及后端来访问资源服务器,感兴趣的可以移步前往。
评论