Vert.x 4 Web JWT Token认证/鉴权入门

教程分享 > Java教程 > Vert.x (523) 2024-08-13 12:52:47

前言

前面已经学习了Vert.x web的基础接口,本文主要讲解引入jwt为接口认证/鉴权。引用之前创建的项目《Vert.x 4 Web应用初识》,加入jwt token相关依赖 io.vertx:vertx-auth-jwt,开始了Vert.x中的Jwt认证之旅。

 

引入jwt依赖

maven pom.xml 依赖节点引入jwt相关依赖

<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-auth-jwt</artifactId>
<version>4.5.9</version>
</dependency>

 

生成RSA密钥对备用

生成rsa密钥对参考 《OpenSSL 工具生成RSA密钥对》这里只需要最简单不加密的RSA密钥对就行。生成好以后复制到项目中,位置参考下面项目结构图

Vert.x 4 Web JWT Token认证/权限入门_图示-b364f46c4ed04a2c94725804ad4640e4.png
RSA密钥对

 

JWT TOKEN对接口认证/授权实现

创建jwt认证提供者(AuthenticationProvider)

在MainVerticle,start中创建jwt的认证提供者

代码聚焦

//采用RSA256非对称加密
Buffer privateKeyBuf = vertx.fileSystem().readFileBlocking("certs/rsa_private_2048.pem");//相对于resources目录
Buffer publicKeyBuf = vertx.fileSystem().readFileBlocking("certs/rsa_public_2048.pem");
JWTAuth jwtAuth = JWTAuth.create(vertx,
new JWTAuthOptions()
.addPubSecKey(
new PubSecKeyOptions()
.setAlgorithm("RS256")
.setBuffer(publicKeyBuf)
)
.addPubSecKey(
new PubSecKeyOptions()
.setAlgorithm("RS256")
.setBuffer(privateKeyBuf)
)
);

注意点:

  • 必须指定算法
  • 私钥,公钥都需要配置

 

模拟登录生成token

模拟用户输入用户名和密码登录,成功返回toen字符串

代码聚焦

router.post("/login").handler(ctx->{
String username = ctx.request().getParam("username");
String password = ctx.request().getParam("password");
if ("admin".equals(username) && "admin".equals(password)) {
//初始化几个权限和角色数据(实际应用这里应该调用数据库查询对应用户的角色权限)
List<String> roles = new ArrayList<>();
roles.add("admin");
roles.add("user");

List<String> permissions = new ArrayList<>();
permissions.add("list_products");

ctx.response()
.end(jwtAuth.generateToken(
new JsonObject()
.put("permissions", permissions)
.put("roles",roles)
.put("username", username)
.put("someKey", "someValue")
,
new JWTOptions()
.setIgnoreExpiration(false)
.setExpiresInMinutes(30)
.setAlgorithm("RS256") //默认值是HS256,所有必须指定算法RS256
)

);
}else {
ctx.fail(401);
}
});

以上代码实现了登录业务,包含

  • 鉴别用户是否合法
  • 用户合法后设置用户权限和角色编码
  • 生成jwt RS256加密的token
  • 用户不合法返回401 HTTP状态码

使用postman工具测试

Vert.x 4 Web JWT Token认证/权限入门_图示-4bf95e50896849a29a8023cf1f5e984a.png
错误密码返回 401
Vert.x 4 Web JWT Token认证/权限入门_图示-9f266e198e224b9f9bb735fe109e8dda.png
正确密码返回token值

以上操图作可以看到,与我们预期结果一致。

设定接口需要【认证/登录】才能访问

代码聚焦

//创建token后则访问 需要认证(登录)的资源
AuthenticationHandler authenticationHandler = JWTAuthHandler.create(jwtAuth);
router.route("/protected/*").handler(authenticationHandler);
router.route("/protected/info").handler(ctx ->{
ctx.response()
.putHeader("content-type", "text/plain")
.end("protected info !");
});
//token 请求时候放入头部 Authorization Bearer <token>

此处jwtAuth 就是上面创建的jwtAuth RSA

上方代码表示访问/protected/开头的接口都需要认证才行否则返回401

 

使用postman工具测试

 

首先是直接访问接口/protected/info

Vert.x 4 Web JWT Token认证/鉴权入门_图示-b938b782dd2542d1a03f056051585cff.png
直接访问需要认证的接口

直接访问需要认证的接口,可以看到上方返回401状态码并返回未认证/未登录,与预期结果一致。

 

接下来设置token,使用认证的token来访问接口。

首先调用登录生成token,然后复制到下图的token位置

Vert.x 4 Web JWT Token认证/权限入门_图示-d1d0f3ca9cf24ecb931b159d17ab02a5.png
设置接口访问token
Vert.x 4 Web JWT Token认证/权限入门_图示-4ffa830e0db24258a30bd39907ab106a.png
token header

再次请求

Vert.x 4 Web JWT Token认证/鉴权入门_图示-de36f7d0013d41af99c6ca2b927f1fe9.png
携带token正常访问

从上图可以看到携带token再次请求接口成功获得了响应内容,与预期结果一致。

 

设置接口需要指定【授权】才能访问

代码聚焦

//意思是从jwt token的obj中拿出permissions节点进行权限判断
AuthorizationProvider authorizationProvider = JWTAuthorization.create("permissions");

//[/protected/list_products]开头的路径需要list_products权限才能访问,从authorizationProvider表示jwt中拿出permission节点进行和list_products对比
router.route("/protected/list_products*").handler(
AuthorizationHandler.create(PermissionBasedAuthorization.create("list_products"))
.addAuthorizationProvider(authorizationProvider)
);
router.route("/protected/list_products").handler(ctx->{
ctx.response()
.putHeader("content-type", "text/plain")
.end("list_products Go !");
});

//指定地址指定权限
router.route("/protected/list_products/one").handler(
AuthorizationHandler.create(PermissionBasedAuthorization.create("one_products"))
.addAuthorizationProvider(authorizationProvider)
).handler(ctx->{
ctx.response()
.putHeader("content-type", "text/plain")
.end("one_products Go !");
});

上方代码指定接口权限对应

  • /protected/list_products* 开头需要list_products权限
  • /protected/list_products 需要list_products权限
  • /protected/list_products/one 需要list_productsone_products权限

使用postman工具测试验证

注意:需要授权的接口是肯定需要认证的,所以以下接口测试都将默认携带上面生成的token

 

Vert.x 4 Web JWT Token认证/鉴权入门_图示-75c88d99fc9e47dabfd289cb6612e424.png
访问list_products接口

访问list_products接口成功,与预期结果一致 (token中包含list_products权限,有疑问可以返回查看上面的token生成部分)

Vert.x 4 Web JWT Token认证/鉴权入门_图示-a69a9535ea464b6e821e0df15379f1a6.png
访问one接口

访问one接口,从上图可以看到403了,与预期结果一致(token中没有包含one_products权限,有疑问可以返回查看上面的token生成部分)

 

指定角色代码访问

这里指定角色代码授权访问其实和权限相差不大,就是从token取值的节点变成了另外一个(同时节点名称也是可以自定义的)

代码聚焦

//意思是从jwt token的obj中拿出roles节点进行权限判断
AuthorizationProvider authorizationProviderRoles = JWTAuthorization.create("roles");
//指定路径需要admin role 才能访问
router.route("/protected/setting/get").handler(
AuthorizationHandler.create(PermissionBasedAuthorization.create("admin"))
.addAuthorizationProvider(authorizationProviderRoles)
).handler(ctx->{
ctx.response()
.putHeader("content-type", "text/plain")
.end("Get setting !");
});

以上代码表示需要admin的角色才能访问该接口,我们上面初始化的token是包含admin的所以可以直接访问,参考下方请求图

Vert.x 4 Web JWT Token认证/鉴权入门_图示-2ddd936f7ba148aa95a195b5d3101791.png
访问指定角色授权接口

 

完整代码

登录后查阅

此处内容已经隐藏,需要登录后刷新查阅

登录/注册

 

 

https://www.leftso.com/article/2408131134214153.html

相关文章
前言前面已经学习了Vert.x web的基础接口,本文主要讲解引入jwt为接口认证/鉴权。引用之前创建的项目《Vert.x 4 Web应用初识》,加入jwt t
前言项目由之前的第一个vert.x 4 项目改编而来,vert.x项目创建参考: vert.x 4 web应用编写修改MainVerticle文件,内容如下:p
Vert.x java 入门,Vert.x这个框架在常规的web业务开发中估计还不是很成熟。但是了解了他的一些原理我觉得可以有一番作为。今天主要简单讲解下eclipse Vert.x是什么有什么...
前言最新的Ver.x 4 从idea工具运行启动,并访问。项目创建通过vert.x官网生成器完成。Vert.x 4项目创建打开vert.x官网项目生成地址,ht
前言项目创建参考之前的《Vert.x 4 Web应用初识》。本文通过Vert.x实现了REST接口的CRUD操作。通过本教程你可以获得以下内容vert.x项目中
前言这里主要讲解Vert.x配置文件的读取和使用,引用之前的项目《Vert.x 4 Web应用初识》 引入必要依赖maven pom.xml&lt;dependenc
前言Vert.x Router路由中多个处理器之间通过RoutingContext共享数据实现。 Vert.x Router 上下文数据数据设置routingC
前言引用《Vert.x 4 Web REST CRUD接口应用》项目,加入日志依赖并编码实现类似Interceptor功能处理。vert.x日志集成参考《Ver
前言文件上传在web应用比较常见,本文以vert.x web实现文件上传功能。引用之前的项目《Vert.x 4 Web应用初识》作为基础,添加了日志。 Vert
前言接上一篇《Vert.x 4 Web应用初识》,在web应用中除了访问地址得到动态的信息还有静态的资源库访问,如 jQuery / bootstrap 等前端
前言创建一个常规的web项目肯定需要一个模板引擎来实现,引用之前的项目《Vert.x 4 Web应用初识》基础结构目前vert.x支持多款模板引擎,包括:MVE
前言Vert.x 中实现全局数据共享,如环境参数等。Vertx数据共享实现共享数据存入/更新SharedData sharedData = vertx.shar
前言本文主要讲解在Vert.x环境下与Mysql数据库连接和操作,实现基础的增删改查和事务,以及REST接口返回数据库中查询结果。项目引用之前的《Vert.x
前言Web项目开发一般接口入参都有校验需求,Vert.x 4 目前已有插件实现参数校验,引用之前的项目《Vert.x 4 Web应用初识》源码 引入验证插件ma
前言vert.x 默认是没有像spring的依赖注入的,需要自己结合vertx-service-proxy插件实现。本文引用项目为基础《Vert.x 4 Web