写点什么

如何搭建一个专属的认证中心(三)

作者:Kevin_913
  • 2023-10-01
    广东
  • 本文字数:1388 字

    阅读完需:约 5 分钟

这一期讲讲解如何搭建一个资源服务器跟认证中心结合起来使用,资源服务器同样是基于 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。

@Beanpublic 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 的配置。

@BeanJwtDecoder jwtDecoder() {    return NimbusJwtDecoder.withJwkSetUri("http://localhost:8000/oauth2/jwks").build();}
复制代码

3、第一步配置的是所有请求都需要认证,所以任何请求都是需要认证的,如果还需要认证 scope,需要添加两个注解,一个是 @EnableMethodSecurity,一个是 @PreAuthorize("hasAuthority('SCOPE_user:all')"),hasAuthority 的 value 是需要以'SCOPE_'开头的,实例代码如下。

@RestController@EnableMethodSecuritypublic 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中有讲解如何从前端以及后端来访问资源服务器,感兴趣的可以移步前往。

发布于: 11 分钟前阅读数: 7
用户头像

Kevin_913

关注

纸上得来终觉浅,绝知此事要躬行。 2019-02-25 加入

专注于代码和设计15+年。 主要涉及Java,Golang,云平台。

评论

发布
暂无评论
如何搭建一个专属的认证中心(三)_springboot_Kevin_913_InfoQ写作社区