Re:从零开始的 Spring Security OAuth2(三)

上一篇文章中我们介绍了获取 token 的流程,这一篇重点分析一下,携带 token 访问受限资源时,内部的工作流程。

@EnableResourceServer 与 @EnableAuthorizationServer

还记得我们在第一节中就介绍过了 OAuth2 的两个核心概念,资源服务器与身份认证服务器。我们对两个注解进行配置的同时,到底触发了内部的什么相关配置呢?

上一篇文章重点介绍的其实是与身份认证相关的流程,即如果获取 token,而本节要分析的携带 token 访问受限资源,自然便是与 @EnableResourceServer 相关的资源服务器配置了。

我们注意到其相关配置类是 ResourceServerConfigurer,内部关联了 ResourceServerSecurityConfigurer 和 HttpSecurity。前者与资源安全配置相关,后者与 http 安全配置相关。(类名比较类似,注意区分,以 Adapter 结尾的是适配器,以 Configurer 结尾的是配置器,以 Builder 结尾的是建造器,他们分别代表不同的设计模式,对设计模式有所了解可以更加方便理解其设计思路)

1
2
3
4
5
6
7
8
9
10
11
public class ResourceServerConfigurerAdapter implements ResourceServerConfigurer {
@Override
public void configure(ResourceServerSecurityConfigurer resources <1>) throws Exception {
}

@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
}

}

<1> ResourceServerSecurityConfigurer 显然便是我们分析的重点了。


Re:从零开始的 Spring Security OAuth2(二)

本文开始从源码的层面,讲解一些 Spring Security Oauth2 的认证流程。本文较长,适合在空余时间段观看。且涉及了较多的源码,非关键性代码以… 代替。

准备工作

首先开启 debug 信息:

1
2
3
logging:
level:
org.springframework: DEBUG

可以完整的看到内部的运转流程。

client 模式稍微简单一些,使用 client 模式获取 token
http://localhost:8080/oauth/token?client_id=client_1&client_secret=123456&scope=select&grant_type=client_credentials

由于 debug 信息太多了,我简单按照顺序列了一下关键的几个类:

1
2
3
4
ClientCredentialsTokenEndpointFilter
DaoAuthenticationProvider
TokenEndpoint
TokenGranter

Re:从零开始的 Spring Security OAuth2(一)

前言

今天来聊聊一个接口对接的场景,A 厂家有一套 HTTP 接口需要提供给 B 厂家使用,由于是外网环境,所以需要有一套安全机制保障,这个时候 oauth2 就可以作为一个方案。

关于 oauth2,其实是一个规范,本文重点讲解 spring 对他进行的实现,如果你还不清楚授权服务器,资源服务器,认证授权等基础概念,可以移步 理解 OAuth 2.0 - 阮一峰,这是一篇对于 oauth2 很好的科普文章。

需要对 spring security 有一定的配置使用经验,用户认证这一块,spring security oauth2 建立在 spring security 的基础之上。第一篇文章主要是讲解使用 springboot 搭建一个简易的授权,资源服务器,在文末会给出具体代码的 github 地址。后续文章会进行 spring security oauth2 的相关源码分析。java 中的安全框架如 shrio,已经有 跟我学 shiro - 开涛,非常成体系地,深入浅出地讲解了 apache 的这个开源安全框架,但是 spring security 包括 oauth2 一直没有成体系的文章,学习它们大多依赖于较少的官方文档,理解一下基本的使用配置;通过零散的博客,了解一下他人的使用经验;打断点,分析内部的工作流程;看源码中的接口设计,以及注释,了解设计者的用意。spring 的各个框架都运用了很多的设计模式,在学习源码的过程中,也大概了解了一些套路。spring 也在必要的地方添加了适当的注释,避免了源码阅读者对于一些细节设计的理解产生偏差,让我更加感叹,spring 不仅仅是一个工具框架,更像是一个艺术品。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×