一、源码代码介绍
上一篇已经大致介绍了一下Spring cloud oauth2.0,点此查看上一篇,现在再来大致分析一下它的源码结构,Spring cloud oauth2.0的代码结构图如下:
可以看到Spring oauth2.0的代码结构分为了五层,client层负责应用客户端的管理。common层为公共类的所在地。config层为配置层。http.converter层为转换层。provider层是最重要的一层,它负责管理认证服务器和资源服务器。下面大致介绍每一层,欢迎一起讨论:
1.client层:如图
这里只讲其中的几个比较典型的类:
(1)OAuth2ClientAuthenticationProcessingFilter:负责对客户端的访问进行过滤,验证token处理等操作。
(2)JdbcClientTokenServices:里面封装了对oauth_client_token表的一系列操作(如增删改查),此表保存的是此client的token信息。
(3)OAuth2RestTemplate:实现了OAuthRestOperations接口,主要是用来去调用受保护资源,会自己带上当前的token信息。
当然还有其它的一些类,比如DefaultOAuth2ClientContext实现了OAuth2ClientContext接口,里面存储了client的上下文信息。
2.common公共层:如图
可见这一层主要是对json字符串处理、解析和实例化等操作,
3.config层:
注解的定义,以及认证服务器和资源服务器的各个配置类的定义都在这个包,是贯穿整个代码非常核心的一层。如图:
可见,我们在代码里所用的三个基本注解EnableAuthorizationServer、EnableOAuth2Client、EnableResourceServer都在这里。还有
AuthorizationServerConfigurerAdapter、ResourceServerConfigurerAdapter这两个最核心的配置类也在这里,只要实现这两个核心配置类,复写他们的函数便可以实现
个性化的配置。(当然是按照自己的需求进行实际的复写喽~~~)具体的使用可以参照我Demo里面的代码~
(4)converter层:略。
(5)provider层:
最核心的一层,里面包含了endpoint、认证、以及四种授权方式的管理。如图:
可见,此层的代码包数量比较多。下面拆解分析进行分析:
(1)关于approval包:里面包含了授权的信息,如果想要自定义展示页面上的元素,需要研读此包里面的代码进行改写,如图:
(2)authentication包:这一层只讲一个类,就是OAuth2AuthenticationProcessingFilter类,他主要负责当资源服务器接收到请求,此类将进行过滤校验等操作。
(3)client包:这里只讲一个JdbcClientDetailsService一个类,打开此类的源码可以看到它里面声明了很多的sql语句。此类主要是关系着client信息的管理。以jdbc的方式进行读取。
(4)code、implicit、password、refresh层这里就不再展开,就是对应着四种授权方式的管理。
(5)endpoint层:此层很重要,代码里面定义了基本的接口地址,如/oauth/authorize、/oauth/token、/oauth/confirm_access等等。如下图,这里只说一下WhitelabelApprovalEndpoint类,此类里面声明了@RequestMapping({"/oauth/confirm_access"})这个endpoint,这个endpoint就是生成我们的授权页面,就是那个有很多选项,让你选择允许还是拒绝的那个页面,这里此类并没有对应的web页面,而是在java代码里创建了一个html的ModelAndView视图,然后展示出来。所以如果你想要自定义授权页,最简单的方法就是把这个类copy到你的controller包里面,然后修改成你自己想要的。
二、Demo
代码层面就介绍这么多,如果有哪里不对,欢迎一起讨论。下面将给大家提供一些我写的三个Demo,希望能给大家帮助。
Spring cloud oauth2.0的源码解析和本人实现的三个Demo,第一个Demo是使用Spring cloud oauth2.0来实现单点登陆;第二个Demo是使用Jdbc来做token的存储,其中我又分别实现了一个是资源服务器自己去校验token,另一个是资源服务器转到认证服务器去进行校验token;第三个Demo是使用jwt的方式进行token授权和校验。以上每种方式我都实现了认证服务器和资源服务器的分离,代码也没有冗余任何业务逻辑,以便读者可以更快速的使用到自己的生产环境中,如果代码对大家有帮助,还望github上给个星星呐
1.Demo 1:
使用Spring cloud oauth2.0来实现单点登陆: https://github.com/jiangchao123/oauthserver
2.Demo 2:
使用Jdbc来做token的存储,其中我又分别实现了一个是资源服务器自己去校验token,另一个是资源服务器转到认证服务器去进行校验token: https://github.com/jiangchao123/spring-cloud-security-oauth2-jdbc
3.Demo 3:
使用jwt的方式进行token授权和校验: https://github.com/jiangchao123/spring-cloud-security-oauth2-jwt
三、总结