Vert.x,认证与授权 - HTTP基本认证

几乎所有的线上系统都离不开认证和授权,Vert.x auth相关组件提供了丰富(Session,JTW, OAuth,…),便捷的认证和授权支持。

当前,使用最多是Web应用,所以在后续讨论中,都是关于Vert.x auth在Web应用(Vertx web)中的使用。

基本概念

认证与授权

认证/鉴权(Authentication) 是指验证用户的身份。// Tells who the user is

  • 确认用户或系统的身份,以确保他们是所声称的那个人或系统。
  • 认证通常通过用户名和密码、数字证书、生物识别(如指纹或面部识别)等方式进行。
  • 例如,当你输入用户名和密码登录到某个应用程序时,系统会检查你的凭证以确认你的身份。

授权(Authorization) 授权是在认证之后进行的,它决定已认证用户可以访问哪些资源或执行哪些操作。// Tells what the user is allowed to do

  • 授权通常在认证之后,当在服务器端的身份确认后,会获取对应用户在服务器端的权限,在执行有权限要求的操作前,先用户的权限进行检查。
  • 授权的过程涉及设置权限和访问控制,比如数据库的读取、写入权限,或是特定文件夹的访问权限。
  • 例如,在同一个应用程序中,普通用户可能只能查看信息,而管理员则可以编辑和删除信息。

认证方式

参考来源: https://developer.baidu.com/article/details/3133306

有状态身份验证( Session-Cookie Based Authentication)

有状态身份验证,也称为会话认证,指的是服务端需要记录每次会话的客户端信息以识别客户端身份。常见的有状态认证方式包括使用cookie和session。当用户登录后,服务端会将登录信息保存在session中,并给用户分配一个唯一的session ID。随后,每次用户请求时,都需要携带该session ID,以便服务端能够识别和验证用户身份。

无状态身份验证 (Token-Based Authentication)

无状态身份验证,也称为令牌认证,是一种不依赖服务端会话的认证方式。在无状态认证中,服务端不需要记录用户的会话信息。用户通过首次认证后,服务端会生成一个令牌(通常使用JSON Web Token,简称JWT),并将其传递给客户端。客户端在后续请求中携带该令牌进行身份验证。

有状态和无状态身份验证各有优缺点,选择合适的认证方式取决于具体需求和应用场景。 有状态认证适用于需要个性化配置和复杂权限控制的Web应用,而无状态认证适用于对性能和扩展性要求较高的场景,如微服务架构、API网关等。此外,无状态认证也适用于跨域应用和单点登录的场景。

Vert.x auth使用概述

通用认证和授权(vertx-auth-common)组件提供了用于身份验证和授权的接口,是Vert.x auth的基础,要在项目中使用,必须先引入依赖:

<dependency>
	<groupId>io.vertx</groupId>
	<artifactId>vertx-auth-common</artifactId>
	<version>4.5.10</version>
</dependency>

要使用Vert.x auth我们需要实现的两个核心接口是AuthenticationProvider和User。AuthenticationProvider用于告诉系统如何进行身份认证,而User实例是用户对应在服务器中的权限的载体(authorisation of users),是AuthorizationProvider接口方法authenticate返回的(异步)结果。

归纳来说: AuthenticationProvider的authenticate对输入的信息进行身份认证,如果认证通过后,返回对应用户在服务器端的权限User(异步结果),如果不通过返回失败结果。先有个概念,后续将通过案例来具体说明。

HTTP基本认证(Http Basic Auth

HTTP基本认证(HTTP Basic Access Authentication )是一种用于网络协议的简单认证方式,这种方法通常用于控制对特定资源的访问。在HTTP基本认证中,服务器会向未经认证的请求返回一个401 Unauthorized状态码,并在响应头中包含一个’WWW-Authenticate’字段,提示客户端需要提供认证信息。客户端随后会在请求头中包含一个Authorization字段,其中包含了经过Base64编码的用户名和密码。

HTTP基本认证中的用户名和密码是以明文形式(经过Base64编码)传输的,因此不建议在不安全的网络中使用。为了保护认证信息的安全,应该在HTTPS/TLS的保护下使用HTTP基本认证。

HTTP基本认证不安全,目前很少使用。拿来讨论,是因为简单,便于理解认证与授权的编写。假设有3个页面:

- page1.html: 不需要身份认证既可以访问;
- page2.html: 所有认证用户都可以访问;
- page3.html: 仅admin角色可以访问;

下面通过Vert.x Auth实现上述需求。

public class BasicAccessAuth {
	private static final Logger LOGGER = Logger.getLogger(BasicAccessAuth.class.getName());

	public static void main(String[] args) {

		// 模拟服务器存储的用户密码,实际场景这些信息可以存储在数据库。
		HashMap<String, String> users = new HashMap<>();
		users.put("admin", "password");
		users.put("user", "password");

		Vertx vertx = Vertx.vertx();
		HttpServer server = vertx.createHttpServer();
		Router router = Router.router(vertx);

		// 步骤1: 创建一个authProvider实例,这里用了匿名类,实际编码时可以编写一个实现AuthenticationProvider接口的类,并实例化。
		AuthenticationProvider authProvider = new AuthenticationProvider() {
			// 认证处理器,异步方法,结果返回一个User结果。
			@Override
			public void authenticate(JsonObject credentials, Handler<AsyncResult<User>> resultHandler) {
				LOGGER.info("input credentials = " + credentials.encode()); // encodePrettily
				// 通过密码进行身份认证
				String username = credentials.getString("username");
				String password = credentials.getString("password");
				if (users.containsKey(username) && users.get(username).equals(password)) {
					// 通过了身份认证,根据用户在服务器中的权限创建一个User实例。
					// 我们模拟了一个简单的权限,角色。
					// 权限根据实际来设计,例如可以基于角色,也可以设计成基于权限,如: 某个路径(path)设计权限位(rwx) ...
					// 实际场景中,用户对应的权限通常存储在数据库中。
					// User实例是用户对应权限的载体。
					String role = username.equalsIgnoreCase("admin") ? "admin" : "user";
					JsonObject principal = new JsonObject();
					principal.put("username", username);

					// 属性信息
					JsonObject attributes = new JsonObject();
					attributes.put("role", role);
					// 步骤2: 根据用户对应权限实例化User做为认证结果。
					// 这里权限比较简单,使用了Vert.x自带的UserImpl,实际编码时可以编写一个实现User接口的类。
					User user = new UserImpl(principal, attributes);
					resultHandler.handle(Future.succeededFuture(user));
				} else {
					resultHandler.handle(Future.failedFuture("身份认证失败。"));
				}
			}
		};
		
		// '/hr/page1.html'直接返回静态页面,不使用基本认证。
		// 原理: 因为该路由比认证处理器的路由先加入router,所以优先级高,关于路由优先级与多路由,可以参考我之前写的文章。
		router.route("/hr/page1.html").handler(ctx -> {
			HttpServerResponse response = ctx.response();
			response.putHeader("Content-Type", "text/html");
			response.sendFile("webroot/page1.html");
		});

		// 步骤3: 创建认证处理器,与对应(需要认证的)路由关联。
		// 处理器可以自己写,也可使用Vertx自带的BasicAuthHandler
		// '/hr/*'路由与BasicAuthHandler绑定,实现访问'/hr/*'都需要进行Http Basic Auth认证。
		BasicAuthHandler basicAuthHandler = BasicAuthHandler.create(authProvider);
		router.route("/hr/*").handler(basicAuthHandler);
		
		router.route("/hr/page3.html").handler(ctx -> {
			// 经过身份认证路由后,认证成功会获取用户授权信息。
			User user = ctx.user();
			if (user != null) {
				// String role = user.attributes().getString("role");
				String role = user.get("role");
				if ("admin" != role) {
					HttpServerResponse response = ctx.response();
					response.setStatusCode(401).setStatusMessage("admin only");
					response.putHeader("Content-Type", "text/html; charset=utf-8");
					response.end("仅admin角色可以访问。");
				}
			}
			ctx.next();
		});
		
		router.route("/hr/*").handler(StaticHandler.create());

		server.requestHandler(router).listen(8080);
	}
}

访问http://127.0.0.1:8080/hr/page1.html,可以正常访问page1.html。
访问http://127.0.0.1:8080/hr/page2.html,会弹出浏览器原生的登录框提示密码登录。
在这里插入图片描述
当通过admin/password或者user/password登录后,可以正常访问page2.html内容。

访问http://127.0.0.1:8080/hr/page3.html,仅当通过admin/password登录时,才能看到page3.html内容,如果使用user用户登录,会提示"仅admin角色可以访问。"

测试时候注意,HTTP基本认证本地cookie会保存密码,无法通过(重启)服务器注销用户,最简单的方法是通过删除cookie方式实现用户注销(切换用户)。
在这里插入图片描述
完整的案例已上传在本文的资源中,感兴趣的可以下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896778.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大数据分析与挖掘模型】matlab实现——非线性回归预测模型

一、实验目的 掌握有关非线性回归的理论知识&#xff0c;通过变量代换把本来应该用非线性回归处理的问题近似转化为线性回归问题&#xff0c;并进行分析预测。 二、实验任务 对非线性回归实例进行编码计算&#xff0c;实例如下&#xff1a; 三、实验过程 1.运行非线性回归中…

【TFR-Net】基于transformer重建网络

abstract&#xff1a; 提高对数据缺失的鲁棒性已经成为多模态情感分析&#xff08;MSA&#xff09;的核心挑战之一&#xff0c;MSA旨在从语言、视觉和声学信号中判断说话者的情感。在目前的研究中&#xff0c;针对不完全模态特征的MSA&#xff0c;提出了基于平移的方法和张量正…

Unity-Editor扩展,引擎管理AudioClip,音乐音效快捷播放功能

目录 选择一个Audio 音频文件即会 关键在于三个快捷模式 播放&#xff0c; 自动播放 循环播放 根本不需要Editor扩展开发 没找到虚幻引擎的audio 的管理是怎么样的 参考&#xff1a; 本来&#xff0c;觉得没有快捷方式&#xff0c;播放很不爽 想自定义搞一个&#xff…

全面了解 NGINX 的负载均衡算法

NGINX 提供多种负载均衡方法&#xff0c;以应对不同的流量分发需求。常用的算法包括&#xff1a;最少连接、最短时间、通用哈希、随机算法和 IP 哈希。这些负载均衡算法都通过独立指令来定义&#xff0c;每种算法都有其独特的应用场景。 以下负载均衡方法&#xff08;IP 哈希除…

aws 把vpc残留删除干净

最近忘了把vpc 删干净导致又被收了冤大头钱 在删除vpc 的收发现又eni在使用&#xff0c;但是忘了是哪个资源在占用 先用命令行把占用的资源找出来停掉 使用 AWS 命令行界面&#xff08;CLI&#xff09;来查看 VPC 的使用情况 列出子网&#xff1a; aws ec2 describe-subnets …

【Java】常用方法合集

以 DemoVo 为实体 import lombok.Data; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;Data ExcelIgnoreUnannotated public class ExportPromoteUnitResult {private String id;ExcelProperty(value &qu…

数据结构6——树与二叉树

在本专栏的前五篇中&#xff0c;我们学习了顺序表、链表、栈和队列&#xff0c;他们本质上都是线性表。有线性表就存在非线性表&#xff0c;现在我们就来学习一下结构更复杂的非线性表——树。 1. 树的概念与结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&…

Go语言Gin框架的常规配置和查询数据返回json示例

文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案&#xff0c;这一篇文章…

Linux之远程连接服务器

远程连接服务器的类型 文字接口 明文传输&#xff1a;Telnet 23、RSH等&#xff0c;目前非常少用&#xff1b; 加密传输&#xff1a;SSH为主&#xff0c;已经取代明文传输 ssh提供两个服务器功能&#xff1a;1.类似于telnet&#xff1b;2.类似于ftp的sftp-serve…

特斯拉自动驾驶出租车计划变成泡影?联想与Meta合作,推出面向PC的个人AI智能体AI Now|AI日报

文章推荐 Swarms Corporation创始人Kye Gomez实锤OpenAI多智能体Swarm抄袭其成果&#xff01;&#xff5c;AI日报 今日热点 中国海油“海能”人工智能模型正式发布 近日&#xff0c;由中国海油与中国电信、科大讯飞等企业合作打造“海能”人工智能模型正式推出。 中国海油“…

Centos7搭建minio对象存储服务器

Centos7搭建minio对象存储服务器 安装二进制程序配置服务文件 安装二进制程序 参考&#xff1a;https://segmentfault.com/q/1010000042181876 minio中国版&#xff1a;https://www.minio.org.cn/download.shtml#/linux # 下载二进制程序 wget https://dl.min.io/server/min…

鸿蒙--应用首次启动

最终效果 前言 基于自定义弹框、首选项和页面路由实现一个模拟应用首次启动的案例。需要完成以下功能: 实现四个页面,启动页、隐私协议页、广告页和应用首页。实现自定义隐私协议弹窗,点击协议可查看隐私协议具体内容。页面间的路由跳转。相关概念 首选项:首选项为应用提供…

软件工程:图书管理系统甘特图

1 实验目的 熟悉GanttProject 软件环境&#xff0c;能够使用GanttProject绘制甘特图,进行项目管理与规划。 2 实验内容 为小型图书管理系统项目的实施计划绘制甘特图。 小型图书管理系统项目包含登录、浏览、管理读者、管理图书资料、管理书目、登记借书、登记还书、预定图书、…

Snort浅析

Snort简介 Snort是免费开源的IDS/IPS&#xff08;入侵检测/防御系统&#xff09;系统&#xff0c;于1998年开发&#xff0c;旨在检测和响应网络中的可疑活动。包含流量/协议分析、内容匹配等功能&#xff0c;并可用预定义规则检测和防止各种攻击。官方网站&#xff1a;https:/…

出口摩洛哥提示 | 燃气器具和设备,2024年12月20日起需要标识Cmim Mark

Cmim Mark 为了证明产品符合摩洛哥的技术法规及标准&#xff0c;指导消费者正确选购&#xff0c;并协助政府有效管理市场&#xff0c;所有依据第24-09号法律规定的产品&#xff0c;必须加贴清晰的Cmim Mark&#xff0c;方可顺利进入摩洛哥市场。 根据摩洛哥官方公报发布的关于…

K歌与露营最搭配,AISON爱畅K歌音箱让露营更有趣

据市场调研数据显示&#xff0c;中国露营经济核心市场规模和带动市场规模均呈现逐年上升趋势&#xff0c;预计到2025年&#xff0c;中国露营经济核心市场规模将达到2483.2亿元。同时&#xff0c;《2024小红书搜索推广白皮书》显示&#xff0c;城市出行、音乐、旅游和户外等娱乐…

redis的配置文件redis.conf解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件&#xff1a; 1.Redis的配置文件名称是&#xff1a;redis.conf 2.在vim这个配置文件的时候&#xff0c;默认是不显示行号的&#xff0c;可以编辑下面这个文件&#xff0c;末尾加上set nu&#xff0c;就会显示行号: 1.…

STM32应用详解(5)USART串口初始化

文章目录 一、USART初始化二、代码说明1.原理图2.main函数3.USART串口初始化函数4.代码整体结构 三、USART串口初始化总结 一、USART初始化 所谓的对USART进行初始化&#xff0c;就是对USART固件库函数的调用&#xff0c;来完成串口(USART)的设置&#xff0c;比如设置波特率、…

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

开放式耳机什么品牌最好?热门开放式蓝牙耳机推荐!

如今&#xff0c;开放式耳机如雨后春笋般涌现&#xff0c;丰富的产品类型确实让不少消费者陷入了选择的困境。很多人不知道哪个牌子的耳机好用&#xff0c;不过别担心&#xff0c;我精心搜罗了一批兼具时尚外观与卓越性能的开放式耳机。作为有着多年音频设备研究经验的专业人士…