创建Spring Boot Servlet Web项目
我们要搭建一个Spring Boot Servlet Web项目,这个过程相对简单,这里就不再赘述了。接下来,我们要集成Spring Authorization Server,这需要我们引入一些必要的依赖。
集成Spring Authorization Server
在项目中,我们需要将OAuth2.0 Client注册到授权服务器并持久化其信息。Spring Authorization Server提供了JDBC的实现方式,具体实现可以参考`JdbcRegisteredClientRepository`。为了演示方便,这里我们选择了H2数据库作为数据存储媒介,需要引入相应的依赖。
在实际生产环境中,你可以根据需要切换到其他的关系型数据库,相应的数据库脚本可以在Spring Authorization Server的入门教程DEMO中找到。
配置Spring Authorization Server
接下来,我们要对Spring Authorization Server进行配置。根据之前对过滤器链的拆解,我们需要在Spring Security的过滤器链中注入一些特定的过滤器。这些过滤器的配置由`OAuth2AuthorizationServerConfigurer`来完成。
默认情况下,我们可以调用`OAuth2AuthorizationServerConfigurer`提供的配置方法进行一些个性化的配置。这些配置信息将被持久化到数据库中。
Spring Authorization Server提供了三个DDL脚本,用于定义授权服务器的数据结构。在入门教程的DEMO中,H2数据库会自动初始化并执行这些DDL脚本。如果你选择使用Mysql等其他数据库,可能需要你手动执行这些脚本。
为了确保授权服务器的安全性,必须确保客户端是已经注册过的,以避免非法的客户端发起授权申请。这就像你在一些开放平台申请ClientID和Secret一样。
定义和持久化客户端信息
对应的Java类为`RegisteredClient`,你可以通过提供的Builder方法定义一个客户端。定义的客户端信息将被持久化到数据库中,以JSON格式表示。
请注意,上面的配置与你OAuth2.0客户端应用的配置是息息相关的。别忘了调用`save(RegisteredClient)`方法,将需要注册的客户端信息持久化到数据库中。
该实现依赖于`spring-boot-starter-jdbc`类库,当然你也可以选择使用Mybatis等其他框架来实现持久层的功能。
记录授权记录和授权同意信息
除了客户端信息,我们还需要记录授权的资源拥有者对某个客户端的授权记录,以及授权的确认信息。这些信息分别由`OAuth2Authorization`和`OAuth2AuthorizationConsent`类来表示,并有相应的持久化服务接口需要进行实现和注入到Spring IoC容器中。
在持久化这些信息时,我们会使用JSON格式来表示数据库中的数据。为了方便理解和操作,这些数据甚至包括了Java类的序列化信息。
JWK的相关知识和实现
我们还需了解JWK(JSON Web Key)的相关知识和实现。JWK是一个将加密的密钥用JSON对象描述的规范,与JWT(JSON Web Token)一起是JOSE规范的重要组成部分。在Spring Security中,我们通常使用RSASHA256算法作为加密算法,并使用Keytool工具或openssl来生成公私钥文件。
在Spring Security中,JOSE的实现依赖于`nimbus-jose-jwt`这个库。我们需要实现`JWKSource `接口并将其注入到Spring IoC容器中。
完成上述所有配置后,一个基于Spring Authorization Server的授权服务器就搭建好了。下一篇我们将继续讲解如何实现OAuth2.0的登录功能,敬请期待。