Authorization Server 认证服务

article/2025/10/12 2:39:27

Hi Auth

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,谢谢!

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

目录结构

├─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

  • UMC

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

LIVE DEMO

  • Hiauth HiMall:http://himall.hiauth.cn
  • Hiauth Manger:http://mgr.hiauth.cn
  • Hiauth Server:http://auth.hiauth.cn

快速启动

环境需求

  • 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.propertiesapp.host=http://127.0.0.1:8080database.url=jdbc:mysql://mysql-server:3306/hiauth3?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
database.username=dev
database.password=123456redis.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

  • 访问HiAuth的Swagger地址:http://127.0.0.1:8080/swagger-ui.html
  • 直接测试接口,显示未认证
{"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 协议

社区与作者

如果群二维码失效了,请先添加我的微信,然我我拉你入群。


http://chatgpt.dhexx.cn/article/v1Zmis58.shtml

相关文章

java authorization_OkHttp3 之 Authorization处理认证(四)

处理验证 这部分和HTTP AUTH有关. HTTP AUTH 使用HTTP AUTH需要在server端配置http auth信息, 其过程如下:客户端发送http请求 服务器发现配置了http auth, 于是检查request里面有没有”Authorization”的http header 如果有, 则判断Authorization里面的内容是否在用户列表里面…

shiro授权过程

一、授权的核心概念 授权&#xff0c;也就是权限认证或访问控制&#xff0c;即在应用中控制谁能访问哪些资源 授权中的核心要素&#xff1a; 1 用户&#xff0c;在shiro中代表访问系统的任何客户端&#xff0c;即subject 2 角色&#xff0c;是权限的集合&#xff0c;或字符串值…

安全-认证授权、数据脱敏

一、认证授权 JWT &#xff1a;JWT&#xff08;JSON Web Token&#xff09;是一种身份认证的方式&#xff0c;JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的&#xff0c;因此接收者便可以验证它的真实性。 SSO(单点登录) &#xff1a;SSO(Single Sign On) 即单…

认证 (authentication) 和授权 (authorization) 的区别

以前一直傻傻分不清各种网际应用中 authentication 和 authorization, 其实很简单: 这两个术语通常在安全性方面相互结合使用&#xff0c;尤其是在获得对系统的访问权限时。两者都是非常重要的主题&#xff0c;通常与网络相关联&#xff0c;作为其服务基础架构的关键部分。然而…

Authorization—权限控制流程

本篇是对Shiro体系架构的介绍&#xff0c;本栏目大部分内容来自于Shiro官网。翻译过程中已经尽量保证用词的准确性和易懂性&#xff0c;如有不准确或者不确切的地方&#xff0c;请联系作者加以修改。本篇内容翻译自Authorization特征与Authorization官方指南。 Authorization&…

认证 (Authentication) 和授权 (Authorization)的区别是什么?

说简单点就是&#xff1a; 认证 (Authentication)&#xff1a; 你是谁。 授权 (Authorization)&#xff1a; 你有哪些权限 干什么事情。 稍微正式点&#xff08;啰嗦点&#xff09;的说法就是&#xff1a; Authentication&#xff08;认证&#xff09; 是验证您的身份的凭据&a…

变量定义与类型

命名 保留字与关键字 关键字是系统已经用的&#xff0c;保留字是系统自带的的保留 为以后使用做准备 查看关键字方法 import keyword #引入关键字模块 print &#xff08;keyword.kwlist&#xff09; #打印系统全部关键字 变量声明 三种格 #格式1 s1 &#xff02;北京图灵学…

Java变量定义时候的注意事项

常量定义的基本注意事项 在JAVA语言中&#xff0c;主要利用final关键字&#xff0c;&#xff08;在java类中灵活使用Static关键字&#xff09;来定义常量。 当常量被设定后&#xff0c;一般情况下就不允许在进行修改&#xff0c;如可以利用以下形式来定义一个常量:final doubl…

变量的定义和使用

目录 一、变量的定义 二、变量的组成 1.标识 2.类型 3.值 三、变量的多次赋值 一、变量的定义 变量名(name) 赋值运算符() 值(小王) name 小王 二、变量的组成 1.标识 表示对象所存储的物理地址&#xff0c;使用内置函数 id(obj) 来获取。 print(id(name)) 运行…

C语言中变量声明和变量定义的区别

本文转载至CSDN博客JeanCheng 变量声明和变量定义 变量定义&#xff1a;用于为变量分配存储空间&#xff0c;还可为变量指定初始值。程序中&#xff0c;变量有且仅有一个定义。变量声明&#xff1a;用于向程序表明变量的类型和名字。定义也是声明&#xff0c;extern声明不是定义…

C++ 中的变量定义

变量定义就是告诉编译器在何处创建变量的存储&#xff0c;以及如何创建变量的存储。 变量定义指定一个数据类型&#xff0c;并包含了该类型的一个或多个变量的列表&#xff0c;如下所示&#xff1a; type variable_list; 在这里&#xff0c;type 必须是一个有效的 C 数据类型…

十:变量的定义和声明的区别?

1. 变量的声明&#xff1a; 声明是用来告诉编译器变量的名称和类型&#xff0c;而不分配内存。变量的声明有两重含义&#xff1a; 告诉编译器&#xff0c;这个名字已经匹配到一块内存上&#xff0c;下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。 告诉编译…

C语言基础教程 之 如何定义变量!

变量定义就是告诉编译器在何处创建变量的存储&#xff0c;以及如何创建变量的存储。变量定义指定一个数据类型&#xff0c;并包含了该类型的一个或多个变量的列表&#xff0c;如下所示&#xff1a; type variable_list; 在这里&#xff0c;type 必须是一个有效的 C 数据类型&…

变量的定义

变量 变量用于存储编程所使用的数据和方法。 声明一般变量的关键字&#xff1a;var,let,const.其中let和const是es6的语法。 声明其他特殊变量的关键字&#xff1a;function,class,improt&#xff08;先了解&#xff09;等 声明变量 变量用于存储数据,因此可以把变量实际上就…

03-变量的定义

一、变量的定义 1.变量是什么&#xff1f; 一句话概括&#xff1a;变量是用来临时保存数据的&#xff0c;该数据是可以变化的数据。 2.什么时候需要定义变量&#xff1f; 如果某个内容需要多次使用&#xff0c;并且在代码中重复出现&#xff0c;那么可以用变量代表该内容。…

【论文阅读】ICRA2021: VDB-EDT An Efficient Euclidean Distance Transform Algorithm Based on VDB Data Struct

参考与前言 Summary: 浩哥推荐的一篇 无人机下的建图 and planning实验 Type: ICRA Year: 2021 论文链接&#xff1a;https://arxiv.org/abs/2105.04419 youtube presentation video&#xff1a;https://youtu.be/Bojh6ylYUOo 代码链接&#xff1a;https://github.com/zhud…

scipy.ndimage.distance_transform_edt 和 cv2.distanceTransform用法

scipy.ndimage.distance_transform_edt 和 cv2.distanceTransform 的作用都是计算一张图上每个前景像素点到背景的最近距离。 import cv2 import numpy as np from scipy.ndimage import distance_transform_edta np.array(([0, 1, 1, 1, 1],[0, 0, 1, 1, 1],[0, 1, 1, 1, 1]…

java edt,java并发之EDT测试

测试代码如下&#xff1a; 1、耗时计算没有单独起线程处理&#xff0c;耗时计算在EDT线程执行&#xff0c;导致界面没有响应&#xff0c;处于卡死状态 package thread; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent…