Authorization Server 认证服务

HiAuth是一个开源的基于Oauth2协议的认证、授权系统,除了标准的Oauth2授权流程功能外,还提供了应用管理、用户管理、权限管理等相关功能。

在这个项目中你能够了解到如何基于spring-security-oauth2-authorization-server实现自己的Authorization Server 认证服务、资源服务器以及如何第三方集成,本项目基于SpringBoot 3.0 版本开发。

项目源码地址:https://github.com/bestaone/HiAuth

介绍

除了认证相关功能外,还提供了hiauth-mall、hiauth-mgr-svc项目,供用户参考如何集成。

  • 参考hiauth-mall,你可以了解如何在第三方应用中集成hiauth授权服务;
  • 参考hiauth-mgr-svc项目,你可以快速的启动一个微服务项目的框架搭建,亦可以在这里找到一些技术的最佳实践,为你的项目开发提供参考;

HiAuth 2.0 升级到 3.0 的升级内容

  • SpringBoot 3.0.2
  • spring-security-oauth2-authorization-server 1.0.0
  • mybatis-plus 3.5.3.1

调整比较大的地方

  • SpringSecurity升级到6.0版本后,用法有不少改动
  • SpringSecurity5以后已不再支持Authorization Server,取而代之的事spring-security-oauth2-authorization-server 项目
  • 前端从vue-element-admin换成了AntDesignPro

如果你觉得此项目有价值,请给我点个star,谢谢!

目录结构

├─doc                  文档目录,架构设计、数据库设计...
├─cicd                 持续集成相关脚本
├─hiauth-parent        统一管理依赖(必选)
├─hiauth-server        hiauth认证服务(必选)
├─hiauth-resource      hiauth资源管理服务,参考如何集成资源服务(参考)
├─hiauth-himall        himall是一个demo,参考此项目了解如何集成hiauth(参考)
├─hiauth-mgr-svc       hiauth管理端后台服务,基于SpringBoot(可选)
├─hiauth-mgr-fornt     hiauth管理端前端代码,基于AntDesignPro(可选)

功能

  • 这个项目可以帮你实现基于Oauth2协议的统一认证、授权系统;
  • 这个项目可以帮助你快速的启动一个基于SpringBoot技术栈的微服务框架搭建;
  • 如果你仅仅使用到了Oauth2协议的统一认证、授权系统功能,那么你用技术可以是除java外的技术栈;
  • himall演示了authorization_code模式,HiAuth支持了用户名密码、手机号短信两种认证方式;
  • 发送短信、登录接口实现了图形验证码防刷功能;
  • HiAuth是一个前后端分离项目,前端使用了ReactAntDesign技术,参考这个项目,你可以自定义开发管理后端;
  • 基于SpringBoot项目更容易集成到多个平台(SpringCloud、K8S、Istio);
  • 演示了如何统一控制接口规范;
  • 演示了如何规范异常处理;
  • 演示了如何规范使用MyBaits-Plus、分页;
  • 演示了单元测试、mock测试、测试数据回滚,包括对controller、service的测试;

截图

  • HiMall


    HiMall
  • UMC

前端从vue-element-admin换成了AntDesignPro截图还没来得及做新的

UMC

LIVE DEMO

快速启动

环境需求

  • JDK17+
  • Maven 3.8.6
  • MySQL 8
  • Redis
  • NodeJS v16+(<v18)
  • Yarn 1.22.4

下载源码

>git clone https://github.com/bestaone/HiAuth.git

创建数据库

在你的mysql数据库中创建库hiauth,并执行下面脚本:

> HiAuth\doc\hiauth.sql

# 也可以从JAR自己提取相关表结构
# org.springframework.security.oauth2.server.authorization.client/oauth2-registered-client-schema.sql
# org.springframework.security.oauth2.server.authorization/oauth2-authorization-consent-schema.sql
# org.springframework.security.oauth2.server.authorization/oauth2-authorization-schema.sql

调整配置

需要调整的配置有数据库、redis,默认会使用native.properties配置,如果和你的环境不一致。

请修改:

# 需要将如下两个文件中的mysql、redis的配置改成自己的
# HiAuth\hiauth-server\src\main\properties\native.properties
# HiAuth\hiauth-mgr-svc\src\main\properties\native.properties

app.host=http://127.0.0.1:8080

database.url=jdbc:mysql://mysql-server:3306/hiauth3?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
database.username=dev
database.password=123456

redis.host=redis-server
redis.port=6379
redis.database=8
redis.password=

添加host

# IP 换成你自己的
127.0.0.1 redis-server
127.0.0.1 mysql-server

构建、启动

# 编译后台,会执行单元测试,需要正确配置数据库和redis
>cd HiAuth
>mvn clean install

# 构建前端并启动
>cd HiAuth\hiauth-mgr-front
>yarn install
>yarn start

# 启动hiauth授权服务端
>cd HiAuth\hiauth-server
>mvn spring-boot:run

# 启动hiauth资源服务端
>cd HiAuth\hiauth-resource
>mvn spring-boot:run

# 启动himall
>cd HiAuth\hiauth-himall
>mvn spring-boot:run

# 启动hiauth管理后端
>cd HiAuth\hiauth-mgr-svc
>mvn spring-boot:run

验证

验证登录

  • 访问HiMall:http://127.0.0.1:8081
  • 访问Server:http://127.0.0.1:8080
  • 访问Manager:http://127.0.0.1:8080 (具体端口看前端项目启动后的控制台输出)

验证Swagger

{
  "error": "unauthorized",
  "error_description": "Full authentication is required to access this resource"
}
  • 点击认证按钮,会被重定向到登录,输入账号登录进行认证
  • 认证成功后被重定向回swagger页面
  • 再次测试接口,获取正确数据

验证Oauth2流程

authorization_code 认证流程

  • 在浏览器中输入如下地址,会调到登录页,登录完成后会跳转到百度,在浏览器url中把code码复制出来
http://127.0.0.1:8080/oauth2/authorize?client_id=demo-client-id&response_type=code&scope=user_info&redirect_uri=http://www.baidu.com
  • 使用上面获取的code换取accessToken
curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=authorization_code&code=code&redirect_uri=http://www.baidu.com' \
  --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
{
    "access_token": "xxxxxx",
    "refresh_token": "yyyyy",
    "scope": "user_info",
    "token_type": "Bearer",
    "expires_in": 7199
}

Authorization = Basic base64.encode(client_id:client_secret)可以在网上找个在线工具生成,或者直接用postman测试,Authorization选择Basic Auth,填入对应值即可

  • 访问受控接口,不带accessToken,返回401,未授权
>curl --location --request POST 'http://127.0.0.1:8082/user/info'
{
    "error": "unauthorized",
    "error_description": "Full authentication is required to access this resource"
}
  • 访问受控接口,携带accessToken,返回数据
curl --location --request POST 'http://127.0.0.1:8082/user/info' --header 'Authorization: Bearer token'
{
    "name":"Resource"
}

refresh_token

curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=refresh_token&refresh_token=refresh_token' \
  --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
{
    "access_token": "xxxxxx",
    "refresh_token": "yyyyy",
    "scope": "user_info",
    "token_type": "Bearer",
    "expires_in": 6152
}
client_credentials 认证流程
  • 使用POST访问获取access_token接口,设置grant_type=client_credentials
curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=client_credentials&scope=user_info' \
    --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
{
    "access_token": "xxxxxx",
    "scope": "user_info",
    "token_type": "Bearer",
    "expires_in": 7199
}
scop权限范围验证
  • 使用POST访问获取access_token接口,设置grant_type=client_credentialsscope=message.read
> curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=client_credentials&scope=message.read' --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
# 返回的 token 的权限范围是 message.read
{
    "access_token": "xxxxxx",
    "scope": "message.read",
    "token_type": "Bearer",
    "expires_in": 7199
}
  • 使用拥有message.read权限的toke访问用户接口,被拒绝,提示无权限
curl --location --request POST 'http://127.0.0.1:8082/user/info' --header 'Authorization: Bearer token'
{
    "error": "insufficient_scope",
    "error_description": "Insufficient scope for this resource",
    "scope": "user_info"
}

所有的127.0.0.1不能使用localhost代替,因为auth会检查域名的合法性,数据库中登记的是127.0.0.1

集成认证、授权服务

这里为了演示如何集成HiAuth、提供了一个Demo项目HiMall

HiMall

HiMall是基于SpringBoot技术的微服务项目,其集成了HiAuth的认证、授权。

环境需求

  • JDK17+
  • HiAuth3

安装、启动

#编译、构建项目
>cd HiAuth\hiaut-himall
>mvn clean install
>mvn spring-boot:run

验证authorization_code模式认证

  • 访问地址:http://127.0.0.1:8081
  • 点击Login,会被重定向到HiAuth系统进行认证
  • 认证通过后会被重定向回HiMall,此时HiMall也将持有登录状态

授权协议

本项目执行 MIT 协议

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容