3行代码快速实现Spring Boot Oauth2服务
这里的3行代码并不是指真的只需要写3行代码,而是基于我已经写好的一个Spring Boot Oauth2服务。仅仅需要修改3行数据库配置信息,即可得到一个Spring Boot Oauth2服务。
项目地址https://github.com/jeesun/oauthserver
oauthserver
简介
oauthserver是一个基于Spring Boot Oauth2的完整的独立的Oauth微服务。仅仅需要创建相关数据表,修改数据库的连接信息,你就可以得到一个Oauth微服务。
支持的关系型数据库:
- PostgreSQL
- MySQL
已实现的功能:
- 集成Spring Boot Oauth2,实现Oauth服务;
- token保存到关系型数据库;
- 获取token时,username允许传用户名、手机号或者邮箱;
- 日志记录保存到文件,并按日归档;
- 数据库连接信息加密;
- 集成Druid数据库连接池;
- 自定义Oauth2Exception异常返回的json信息。
更新日志
v1.1.0(2018-06-01)
- 自定义Oauth2Exception异常返回的json信息。
v1.0.3
- bug修复。
v1.0.1
- 获取token时,username允许传用户名、手机号或者邮箱。
v1.0.0
- 完成基础Oauth服务。
使用流程
1. 建表
- PostgreSQL
请执行src/main/resources/schema-pg.sql,完成数据表的创建和测试数据的导入。 - MySQL
请执行src/main/resources/schema-mysql.sql,完成数据表的创建和测试数据的导入。
2. 修改数据库连接信息
在application.yml中,配置着数据库的连接信息。其中,配置项username和password是要经过jasypt加密的,不能直接填明文。加密密钥由jasypt.encryptor.password配置。你需要使用test目录下的UtilTests工具得到加密字符串。
- PostgreSQL
# PostgreSQL连接信息
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5432/thymelte?useUnicode=true&characterEncoding=UTF-8
username: ENC(hTpbG9fq+7P3SntmXuNtDxbtWDqRuPV+) #明文postgres
password: ENC(abdq6LyOspryFQHCqzEMTxRozyJVjIA4) #明文19961120
- MySQL
# MySQL连接信息
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: ENC(YiYjVwTulDGN//YaB3KbuA==) #明文root
password: ENC(9oaIJkFgGSDFaHH3OXY63RHWQ+amDmiJ) #明文19941017
3. 运行
现在,一切已准备就绪。运行项目,当程序成功启动时,即表明你已配置成功。
4. 测试
在建表时,我已经向表添加了测试数据。以下请求参数的值,均是测试数据,在数据表中可以找得到。请根据需求到数据表中修改对应的值。
在表oauth_client_details表中,已有一条测试数据。列client_id和client_secret的值,分别对应Basic Oauth的请求参数username和password的值。而列access_token_validity和列refresh_token_validity,分别代表access_token和refresh_token的有效期时间,以秒为单位。测试数据7200和5184000,分别代表2个小时和2个月(60天)。这是一个比较合理的有效期时间的设置,可以参考。
token相关的接口,都需要进行Basic Oauth认证。
如下图所示:

1、根据用户名和密码获取access_token
POST http://localhost:8182/oauth/token?grant_type=password&username=jeesun&password=1234567890c
成功示例
status=200,返回的json数据:
{
"access_token": "ca582cd1-be6c-4a5a-82ec-10af7a8e06eb",
"token_type": "bearer",
"refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
"expires_in": 3824,
"scope": "read write trust"
}
失败示例
- 用户名错误
status=400,返回的json数据:
{
"code": 400,
"message": "用户名不存在",
"data": null
}
- 密码错误
status=400,返回的json数据:
{
"code": 400,
"message": "密码错误",
"data": null
}
- 账号被封enabled=false
status=400,返回的json数据:
{
"code": 400,
"message": "您已被封号",
"data": null
}
2、检查access_token
GET http://localhost:8182/oauth/check_token?token=ca582cd1-be6c-4a5a-82ec-10af7a8e06eb
成功示例
即使用户被封enabled=false,access_token未过期仍然可用。
status=200,返回的json数据:
{
"aud": [
"oauth2-resource"
],
"exp": 1524507296,
"user_name": "jeesun",
"authorities": [
"ROLE_ADMIN",
"ROLE_USER"
],
"client_id": "clientIdPassword",
"scope": [
"read",
"write",
"trust"
]
}
失败示例
access_token已过期
status=400,返回的json数据:
{
"code": 400,
"message": "Token was not recognised",
"data": null
}
3、根据refresh_token获取新的access_token
成功示例
status=200,返回的json数据:
{
"access_token": "690ecd7d-f2b7-4faa-ac45-5b7a319478e8",
"token_type": "bearer",
"refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
"expires_in": 7199,
"scope": "read write trust"
}
失败示例
用户被封enabled=false
status=401,返回的json数据:
{
"code": 401,
"msg": "用户已失效",
"data": null
}
app实践指南
app获取到token信息后,需要保存token信息和请求时间。在传access_token之前,需要检查access_token是否过期。为了减少后台压力,检查access_token是否过期应该是在app本地完成。通过token的keyexpires_in(剩余有效期)的值,以及本地记录的请求时间,和当前时间做对比,可以很方便地判断出access_token是否过期。如果过期了,需要通过refresh_token获取新的access_token。因为access_token的有效期只有2个小时,这个验证是必须的。
refresh_token同理。
3行代码快速实现Spring Boot Oauth2服务的更多相关文章
- 2018-08-11 中文代码示例之Spring Boot 2.0.3问好
上次试用Spring Boot还是两年前: 中文代码示例之Spring Boot 1.3.3演示. 打算用在一个讨论组内小项目上, 于是从官网Building an Application with ...
- 想要快速上手 Spring Boot?看这些教程就足够了!| 码云周刊第 81 期
原文:https://blog.gitee.com/2018/08/19/weekly-81/ 想要快速上手 Spring Boot?看这些教程就足够了!| 码云周刊第 81 期 码云周刊 | 201 ...
- 基于 intellij IDEA 快速搭建Spring Boot项目
在<一步步搭建 Spring Boot maven 框架的工程>一文中,已经介绍了如何使用Eclipse快速搭建Spring Boot项目.由于最近将开发工具由Eclipse ...
- 快速搭建Spring Boot + Apache Shiro 环境
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Apache Shiro 介绍及概念 概念:Apache Shiro是一个强大且易用的Java安全框 ...
- 快速体验Spring Boot了解使用、运行和打包 | SpringBoot 2.7.2学习系列
SpringBoot 2.7.2 学习系列,本节内容快速体验Spring Boot,带大家了解它的基本使用.运行和打包. Spring Boot 基于 Spring 框架,底层离不开 IoC.AoP ...
- Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程
使用Intellij中的Spring Initializr来快速构建Spring Boot工程 New---Project 可以看到图所示的创建功能窗口.其中Initial Service Url指向 ...
- thymeltesys-基于Spring Boot Oauth2的扫码登录框架
thymeltesys thymelte是一个基于Spring Boot Oauth2的扫码登录框架,使用PostgreSQL存储数据,之后会慢慢支持其他关系型数据库.即使你不使用整个框架,只使用其中 ...
- Spring Boot Oauth2缓存UserDetails到Ehcache
在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能.该类源 ...
- 【原创】Docker容器及Spring Boot微服务应用
Docker容器及Spring Boot微服务应用 1 什么是Docker 1.1 Docker的出现 问题一:项目实施环境复杂问题 传统项目实施过程中经常会出现“程序在我这跑得好好的,在你那怎么就不 ...
随机推荐
- linux下面根据不同的日期创建不同文件,一般用户数据库的备份的shell编程
[root@www scripts]# vi sh03.sh #!/bin/bash # Program: # Program creates three files, which named by ...
- 数据库 MYSQL操作(一)
数据库 MYSQL操作总结(一) 本文主要介绍一下笔者在使用数据库操作的过程中的一些总结,主要的内容包括一下几个内容: 一.mysql 使用基础(主要包括数据库的安装.基本操作等内容) 二.mysq ...
- ELK学习总结(3-3)elk的组合查询
1.bool 查询: must: 必须 should: 可以满足,也可以不满足. must_not: minimum_should_match: 至少要x个匹配才算匹配成功 disable_coor ...
- 愿奴胁下生双翼——— 详解cookie和session
cookie和session都是基于web服务器的,不同的是cookie存储在客户端而session存储在服务器. 当用户浏览网站时,web服务器会在浏览器上存储一些当前用户的相关信息,在本地Web客 ...
- easygui控件介绍
1.msgbox: 语法:msgbox(text,title, ok_button='OK',image=None,root=None) 实例:msgbox('内容内容','标题标题','确定')返回 ...
- 超级好用的前端开发测试Chrome插件-WEB前端助手(FeHelper)
WEB前端助手(FeHelper)插件概述 WEB前端助手:FeHelper是一款chrome浏览器插件.包含一些前端实用的工具,如字符串编解码.代码美化.JSON格式化查看.二维码生成器.编码规范检 ...
- [LeetCode] Distribute Candies 分糖果
Given an integer array with even length, where different numbers in this array represent different k ...
- SpringIOC学习三
基于注解的注入:就是用注解标签的方式替换掉我们xml配置文件里面bean的注册和依赖关系的描述 a:首先回顾IOC(控制反转),进行依赖注入需要做到两件事情: 1:注册类 2:描 ...
- Java IO(三)
在Java IO提供的类中,除了前面介绍的RandomAccessFile类之外,还有一系列的io操作类. 主要分为两大类.字符流和字节流.关系图如下: 在Java IO的操作中,很好的体现了Java ...
- [SCOI2009]生日快乐
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy ,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的 ...