JWT令牌如何将令牌token转换为登录者的信息的?

简介: java项目的权限认证系统大家都熟悉,之前本人也用到过几种认证token的方式,其中JWT是我觉得最神秘的一种,因为我一直没搞明白,在认证完成后,访问业务接口时,接口是怎么把请求头中的token转换为接口中的用户信息的,直到HandlerMethodArgumentResolver这个接口进入我的视野。

一、HandlerMethodArgumentResolver的作用及其中的方法解释:

HandlerMethodArgumentResolver是个接口,这个接口中有两个方法:

publicinterfaceHandlerMethodArgumentResolver {
booleansupportsParameter(MethodParameterparameter);
@NullableObjectresolveArgument(MethodParameterparameter, @NullableModelAndViewContainermavContainer, NativeWebRequestwebRequest, @NullableWebDataBinderFactorybinderFactory) throwsException;
}

image.gif

看方法名应该大致能猜到:

supportsParameter这个方法返回值是boolean,它的作用是判断Controller层中的参数,是否满足条件,满足条件则执行resolveArgument方法,不满足则跳过。

resolveArgument方法,它只有在supportsParameter方法返回true的情况下才会被调用。用于处理一些业务,将返回值赋值给Controller层中的这个参数。

我们可以将HandlerMethodArgumentResolver理解为是一个参数解析器,我们可以通过写一个类实现HandlerMethodArgumentResolver接口来实现对Controller层中方法参数的修改。

二、项目实现

1、比如,我们现在用JWT方式登陆后需要通过下面的接口获取当前登录人的信息和权限菜单等详细信息。

@GetMapping("/routes")
@ApiOperationSupport(order=7)
@ApiOperation(value="前端菜单数据", notes="前端菜单数据")
publicR<List<MenuVO>>routes(HttpServletRequestrequest) {
Claimsclaims=getClaims(request);
if (claims==null) {
returnnull;
    } else {
LonguserId=claims.get("user_id");
StringroleId=claims.get("role_id");
StringdeptId=claims.get("dept_id");
Stringaccount=claims.get("account");
StringroleName=claims.get("role_name");
StringuserName=claims.get("user_name");
Useruser=newUser();
user.setUserId(userId);
user.setTenantId(tenantId);
user.setAccount(account);
user.setRoleId(roleId);
user.setDeptId(deptId);
user.setRoleName(roleName);
user.setUserName(userName);
    }
List<MenuVO>list=menuService.routes((user==null||user.getUserId() ==0L) ?null : user.getRoleId());
returnR.data(list);
}

image.gif

但是,在项目中肯定每个接口需要这样获取参数,这样的话代码太臃肿了。我们可以稍微改造一下,用HandlerMethodArgumentResolver这个接口:

2、首先写个实现类实现这个接口中的方法:

publicclassTokenArgumentResolverimplementsHandlerMethodArgumentResolver {
privatestaticfinalLoggerlog=LoggerFactory.getLogger(TokenArgumentResolver.class);
publicTokenArgumentResolver() {
    }
publicbooleansupportsParameter(MethodParametermethodParameter) {
returnmethodParameter.getParameterType().equals(User.class);
    }
publicObjectresolveArgument(MethodParametermethodParameter, ModelAndViewContainermodelAndViewContainer, NativeWebRequestnativeWebRequest, WebDataBinderFactorywebDataBinderFactory) {
returnSecureUtil.getUser();
    }
}

image.gif

然后将这个实现类添加到项目的拦截其中:

@Configuration(
proxyBeanMethods=false)
@EnableCaching@Order(-2147483648)
publicclassMyWebMvcConfigurationimplementsWebMvcConfigurer {
privatestaticfinalLoggerlog=LoggerFactory.getLogger(BladeWebMvcConfiguration.class);
publicMyWebMvcConfiguration() {
    }
publicvoidaddArgumentResolvers(List<HandlerMethodArgumentResolver>argumentResolvers) {
argumentResolvers.add(newTokenArgumentResolver());
    }
}

image.gif

这样在项目接口请求时会进入到我们自定义的TokenArgumentResolver类中进行解析接口类和参数信息。

然后,我们的接口就可以这样写啦:

@GetMapping("/routes")
@ApiOperationSupport(order=7)
@ApiOperation(value="前端菜单数据", notes="前端菜单数据")
publicR<List<MenuVO>>routes(Useruser) {
List<MenuVO>list=menuService.routes((user==null||user.getUserId() ==0L) ?null : user.getRoleId());
returnR.data(list);
}

image.gif

这样就不用每个接口都解析请求头中的token了,可以拿到token对应的用户信息

目录
相关文章
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
261 0
|
23天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
90 1
|
3月前
|
存储 中间件 API
ThinkPHP 集成 jwt 技术 token 验证
本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。
ThinkPHP 集成 jwt 技术 token 验证
|
2月前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
114 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
2月前
|
JavaScript
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(二)
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
38 0
|
2月前
|
存储 JSON JavaScript
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
100 0
|
3月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
175 3
|
4月前
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
|
4月前
|
API
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
|
4月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
102 0

热门文章

最新文章