spring boot security oauth2 构建简单安全的 restful api

本贴最后更新于 1843 天前,其中的信息可能已经时移俗易

u24205958681698952353fm26gp0jpg

前段时间写了一篇博客,spring boot restful API 从零到一完整实践 ,通过上篇文章构建了两个版本的 restful api,这篇博客,则是要在这基础上面,添加一个安全措施,我选择的是 oauth2 和 jwt 进行保护我们的 API,通过 spring security oauth2 进行一步一步的配置我们的安全 API 接口服务。

博客地址:https://echocow.cn

项目地址:github-security-one 分支

Oauth2

OAuth 2.0 关注客户端开发者的简易性。要么通过组织在资源拥有者和 HTTP 服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为 Web 应用,桌面应用和手机,和起居室设备提供专门的认证流程。百度百科。这篇文章同上一篇一样,将会详细记录如何使用 spring security oauth2 进行构建一个安全 restful api ,当然,oauth2 的概念和核心我不再赘述,具体可查看文末的参考链接。在这之前,我们需要先做一番准备。

这篇文章能够带给你什么

使用 spring security oauth2 autoconfigure 自动配置一个简单的 oauth2 认证

在这之前

你需要拥有一个已经能够成功构建起来的 spring boot 的项目,它能够正常启动与访问访问,在这里我们使用上一篇 spring boot restful API 从零到一完整实践 构建的 restful API 作为基础。如果你需要快速体验,你只需要建立一个拥有 Helloworld api 接口的新项目即可。然后你需要加入以下依赖(gradle)

// 提供 spring security 支持
implementation('org.springframework.boot:spring-boot-starter-security')
// 提供 oauth2 自动化配置
implementation("org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:${springBootVersion}")

在这之前

同时你必须具备如下知识:

  1. oauth2 中什么是 授权服务器
  2. oauth2 中什么是 资源服务器
  3. oauth2 中的四种授权模式(我们会使用到 授权码 模式和 密码 模式)
  4. spring security 的部分知识
  5. jpa 的使用

以上概念本文不再提起,如有疑惑可选择去文末的参考链接自行选择性学习。

请求 url

虽然上面说明了需要知道的东西,但是我在这里还是需要对我们需要使用到的 url 进行一个简单说明,但是参数我不再详说。

  • /oauth/authorize GET 授权码模式获取授权码
  • /oauth/token POST 获取 token、刷新 token
  • /oauth/check_token POST 检测 token

自动配置

spring boot 之所以能够如此受欢迎,最大的原因莫过于他提供的模板配置以及自动配置,我们甚至不需要写什么代码,只需要见得修改一下配置文件即可构建一个基于内存的简单的安全服务,所以最重要的,需要先配置一个 授权服务器,通过它下发令牌

使用默认配置

1、 添加注解:你需要为我们启动类添加一个启动的注解

授权服务器

2、 我们通过一个注解就已经完成一个安全的授权的创建,运行查看输出日志。

使用默认配置

3、 携带生成的 client id 进行访问,这里 /api 是我自己添加项目路径,如果没有添加亲直接访问 /oauth/authorize

http://localhost:8080/api/oauth/authorize?response_type=code&client_id=d7003bdc-981c-4745-9eb4-673028b4c4e0&redirect_uri=http://example.com&scope=all

imagepng

4、 访问报错,这是因为我们没有配置 spring security 造成的,所以需要回去配置一下,使用默认配置即可

spring security

5、 再次运行,跳转登录界面

访问

6、 用户名 user,密码为刚才生成的 随机密码,登录

登录

7、 修改配置文件。注册一下回调地址

修改配置文件

8、 重启,使用新生成的 client id ,重新访问以及登录

登录成功

9、 选择 Approve 同意授权,获取到授权码

Approve

10、 使用授权码请求 token

使用授权码请求 token

使用授权码请求 token

获取成功

这就是使用他的自动配置的认证过程,接下来我们通过配置文件进行控制他的自动配置

自定义配置

1、 修改 spring boot 的一些默认配置

imagepng

2、 配置两个用户

imagepng

3、 现在我们拥有两个用户了,就可以去使用密码模式获取 token 了。

imagepng

imagepng

imagepng

测试访问

1、 直接访问我们已有的资源

直接访问我们已有的资源

2、 携带上一步获取的 token 访问

携带上一步获取的 token 访问

发现还是失败,为什么呢?因为我么并没有开启 资源服务器 他没办法进行验证,所以我们接下来就是开启一个资源服务器

开启 资源服务器

同样,一个注解即可

资源服务器

重新获取 token 后,携带 token 访问

携带 token 访问

解析 token

1、 尝试解析 token

尝试解析 token

2、 403,我们需要配置以支持 token 解析。

支持 token 解析

3、 重启后获取 token 再次解析

重启后获取 token 再次解析

刷新 token

遗憾的是,如果只是用配置文件,是不能够 刷新 token 的,至少我没有成功。

imagepng

imagepng

发现不行,查看原因

imagepng

可惜通过尝试各种办法都不行(在不增加类的情况下)解决办法参见

使用他的配置文件,我们不需要写任何代码,就完成了一个简单的内存认证,甚至我们可以直接通过修改 userDetailsService 完成用户的认证,不过也发现了,他使用配置文件的方式功能很有限,局限性很强,不能够刷新 token 是一个痛点啊,所以我们更期望于手动配置。

参考链接

  1. 理解 OAuth 2.0 阮一峰
  2. Oauth2 授权
  3. spring oauth2 auto config
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1458 回帖 • 109 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 16 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...