前段时间写了一篇博客,spring boot restful API 从零到一完整实践 ,通过上篇文章构建了两个版本的 restful api,这篇博客,则是要在这基础上面,添加一个安全措施,我选择的是 oauth2 和 jwt 进行保护我们的 API,通过 spring security oauth2 进行一步一步的配置我们的安全 API 接口服务。
博客地址:https://echocow.cn
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}")
同时你必须具备如下知识:
- oauth2 中什么是 授权服务器
- oauth2 中什么是 资源服务器
- oauth2 中的四种授权模式(我们会使用到 授权码 模式和 密码 模式)
- spring security 的部分知识
- 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
4、 访问报错,这是因为我们没有配置 spring security 造成的,所以需要回去配置一下,使用默认配置即可
5、 再次运行,跳转登录界面
6、 用户名 user
,密码为刚才生成的 随机密码,登录
7、 修改配置文件。注册一下回调地址
8、 重启,使用新生成的 client id ,重新访问以及登录
9、 选择 Approve 同意授权,获取到授权码
10、 使用授权码请求 token
这就是使用他的自动配置的认证过程,接下来我们通过配置文件进行控制他的自动配置
自定义配置
1、 修改 spring boot 的一些默认配置
2、 配置两个用户
3、 现在我们拥有两个用户了,就可以去使用密码模式获取 token 了。
测试访问
1、 直接访问我们已有的资源
2、 携带上一步获取的 token 访问
发现还是失败,为什么呢?因为我么并没有开启 资源服务器 他没办法进行验证,所以我们接下来就是开启一个资源服务器
开启 资源服务器
同样,一个注解即可
重新获取 token 后,携带 token 访问
解析 token
1、 尝试解析 token
2、 403,我们需要配置以支持 token 解析。
3、 重启后获取 token 再次解析
刷新 token
遗憾的是,如果只是用配置文件,是不能够 刷新 token 的,至少我没有成功。
发现不行,查看原因
可惜通过尝试各种办法都不行(在不增加类的情况下)解决办法参见
- stackoverflow:spring-security-oauth2 2.0.7 refresh token UserDetailsService Configuration - UserDetailsService is required
- segmentfault: spring security oauth2 之 refresh token
使用他的配置文件,我们不需要写任何代码,就完成了一个简单的内存认证,甚至我们可以直接通过修改 userDetailsService 完成用户的认证,不过也发现了,他使用配置文件的方式功能很有限,局限性很强,不能够刷新 token 是一个痛点啊,所以我们更期望于手动配置。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于