ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

spring集成jwt、权限从jwt拿还是从网关拿好

spring集成jwt、权限从jwt拿还是从网关拿好 文章目录引入依赖0.12(较新)0.7(过时)boot项目中应用配置文件中添加拦截器配置jwt拦截器LoginController权限从jwt直接拿还是从网关拿好?单应用为什么难做jwt?经过网关校验jwt为什么直接在header中添加jwt不生效?问题jwt是明文吗?那么还安全吗?引入依赖0.12(较新)dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.12.5/version/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdversion0.12.5/versionscoperuntime/scope/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactId!-- 用于 JSON 序列化 --version0.12.5/versionscoperuntime/scope/dependency0.7(过时)pom.xml添加dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.7.0/version/dependencydependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion3.2.0/version/dependencyboot项目中应用配置文件中添加jwt:secret:MySuperSecretKeyForJWTTokenGeneration2026VeryLongString# 至少32个字符expiration:86400000# 24小时毫秒拦截器配置ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{AutowiredprivateJwtInterceptorjwtInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(jwtInterceptor).addPathPatterns(/**).excludePathPatterns(/login/login);}}jwt拦截器ComponentpublicclassJwtInterceptorimplementsHandlerInterceptor{AutowiredprivateJwtUtiljwtUtil;OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){Stringtokenrequest.getHeader(Authorization);if(tokennull||!token.startsWith(Bearer )){thrownewRuntimeException(未登录);}// 截取 Bearer 后面的真实 Tokentokentoken.substring(7);if(!jwtUtil.validateToken(token)){thrownewRuntimeException(Token 已过期或无效);}// 解析并获取用户信息存入 request 供后续 Controller 使用LonguserIdjwtUtil.getUserId(token);request.setAttribute(userId,userId);returntrue;}}LoginControllerRestControllerSlf4jRequestMapping(/login)publicclassLoginController{AutowiredprivateJwtUtiljwtUtil;RequestMapping(/login)publicStringlogin(Stringusername){// 1. 查库校验用户名密码省略具体查询逻辑// 2. 生成 JWT TokenreturnjwtUtil.generateToken(111l,username,admin);}GetMapping(/profile)publicJsonResultgetProfile(HttpServletRequestrequest){LonguserId(Long)request.getAttribute(userId);log.info(userId{},userId);// 根据 userId 查询业务数据...returnJsonResult.ok(userId);}}用法1、postman先调用login接口 # 拿到jwt2、post调用profile接口header里添加AuthorizationBearer jwt值能够反向拿到userId即可。权限从jwt直接拿还是从网关拿好?公司用的是网关拿jwt然后提取信息放到header中对比维度从JWT直接拿胖JWT模式从网关拿瘦JWT网关鉴权模式核心机制JWT的Payload中直接携带用户的角色或权限列表下游微服务自行解析并校验。JWT保持精简仅含核心标识API网关负责验签并将解析出的用户信息放入Header透传给下游。性能与扩展纯本地计算性能极高服务间无需通信验证水平扩展零成本。网关需承担签名验证和IO开销高并发下易成性能瓶颈网关宕机存在单点故障风险。开发与维护各微服务需独立引入并维护鉴权逻辑如SpringSecurity重复代码多。下游服务只需读取Header明文职责分离代码简洁维护成本低。权限实时性无法实时撤销权限变更或封号需等JWT自然过期才失效。支持动态实时权限网关可结合Redis黑名单等实现权限秒级生效和强制登出。网络与体积权限多时Token体积膨胀浪费带宽易超出HTTPHeader限制导致请求失败。Token保持轻量避免了携带庞大权限列表减少网络开销。安全与隐私Payload仅Base64编码完整的用户权限画像存在被解码泄露的风险。敏感权限数据无需暴露在公网传输的Token中相对更安全。单应用为什么难做jwt?其实并不是难做而是分布式不好做。jwt本身无状态但是可以jwt外挂状态这样网关只用维护一套机制。如果是微服务那会有分布式噩梦例如有10个微服务就要维护10套redis还要保持同步这成本就有点高。经过网关校验jwt为什么直接在header中添加jwt不生效?一开始也懵了后来才发现网关地址和直接项目地址不一样。网关的作用拦截并验签解析jwt并将用户信息传给下游。https://www.ttt.com # 非网关地址之前在这里面加的header没有经过网关当然也不会解析jwthttps://www.ttt.com/gateway # 网关地址把请求地址换成这个jwt就生效了。问题jwt是明文吗?那么还安全吗?是明文谁拿到后都可以解出信息。那么还安全吗?安全明文虽然可以看到但是如果密钥验证不通过可以拦下来通过权还是牢牢的掌控在自己手里。
返回列表