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 不仅仅是一个工具框架,更像是一个艺术品。


对于 Spring Cloud Feign 入门示例的一点思考

Spring Cloud Feign

Spring Cloud Feign 是一套基于 Netflix Feign 实现的声明式服务调用客户端。它使得编写 Web 服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对 Web 服务接口的绑定。它具备可插拔的注解支持,包括 Feign 注解、JAX-RS 注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign 还扩展了对 Spring MVC 注解的支持,同时还整合了 Ribbon 和 Eureka 来提供均衡负载的 HTTP 客户端实现。

分布式应用早在十几年前就开始出现,各自的应用运行在各自的 tomcat,jboss 一类的容器中,他们之间的相互调用变成了一种远程调用,而实现远程调用的方式很多。按照协议划分,可以有 RPC,Webservice,http。不同的框架也对他们有了各自的实现,如 dubbo(x),motan 就都是 RPC 框架,本文所要讲解的 Feign 便可以理解为一种 http 框架,用于分布式服务之间通过 Http 进行接口交互。说他是框架,有点过了,可以理解为一个 http 工具,只不过在 spring cloud 全家桶的体系中,它比 httpclient,okhttp,retrofit 这些 http 工具都要强大的多。

入门

先用一个简单的例子,看看如何在项目中使用 Feign。示例项目使用 maven 多 module 构建,采用 springcloud 的 Dalston.SR1 版本


spring 中的懒加载与事务 -- 排坑记录

案例描述

本文主要描述了开发中常见的几个与 spring 懒加载和事务相关的案例,描述常见的使用场景,以及如何规避他们,给出具体的代码。

  1. 在新的线程中,访问某个持久化对象的懒加载属性。
  2. 在 quartz 定时任务中,访问某个持久化对象的懒加载属性。
  3. 在 dubbo,motan 一类 rpc 框架中,远程调用时服务端 session 关闭的问题。

上面三个案例,其实核心都是一个问题,就是牵扯到 spring 对事务的管理,而懒加载这个技术,只是比较容易体现出事务出错的一个实践,主要用它来引发问题,进而对问题进行思考。


Transactional 注解使用注意点

@Transactional 可以说是 spring 中最常用的注解之一了,通常情况下我们在需要对一个 service 方法添加事务时,加上这个注解,如果发生 unchecked exception,就会发生 rollback,最典型的例子如下。


Your browser is out-of-date!

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

×