网站建设的意义,网站集约化建设解读,网站放到云服务器上怎么做,公司网站备案材料一#xff0c;实现思路 1#xff0c;基于JWT令牌登陆方式
JWT实现登录的#xff0c;登录信息就保存在请求头的token中。因此要获取当前登录用户#xff0c;只要获取请求头#xff0c;解析其中的token。
1#xff09;#xff0c;Gateway网关拦截#xff0c;解析用户信…一实现思路 1基于JWT令牌登陆方式
JWT实现登录的登录信息就保存在请求头的token中。因此要获取当前登录用户只要获取请求头解析其中的token。
1Gateway网关拦截解析用户信息
我们的把token解析的行为放到了网关中然后由网关把用户信息放入请求头传递给下游微服务。 在Gateway网关中创建一个Filter拦截并解析JWT将用户消息放入请求头中
Component
public class AccountAuthFilter implements GlobalFilter, Ordered {private final AuthUtil authUtil;private final AuthProperties authProperties;private final AntPathMatcher antPathMatcher new AntPathMatcher();public AccountAuthFilter(AuthUtil authUtil, AuthProperties authProperties) {this.authUtil authUtil;this.authProperties authProperties;}Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求request信息ServerHttpRequest request exchange.getRequest();String method request.getMethodValue();String path request.getPath().toString();String antPath method : path;// 2.判断是否是无需登录的路径if(isExcludePath(antPath)){// 直接放行return chain.filter(exchange);}// 3.尝试获取用户信息ListString authHeaders exchange.getRequest().getHeaders().get(AUTHORIZATION_HEADER);String token authHeaders null ? : authHeaders.get(0);RLoginUserDTO r authUtil.parseToken(token);// 4.如果用户是登录状态尝试更新请求头传递用户信息if(r.success()){exchange.mutate().request(builder - builder.header(自定义请求头名称, r.getData().getUserId().toString())).build();}// 6.放行return chain.filter(exchange);}private boolean isExcludePath(String antPath) {for (String pathPattern : authProperties.getExcludePath()) {if(antPathMatcher.match(pathPattern, antPath)){return true;}}return false;}Overridepublic int getOrder() {return 1000;}
}2微服务获取用户信息并将用户信息放入ThreadLocal中
每个微服务都定义一个Filter获取用户信息。并使用ThreadLocal 将用户信息放入ThreadLocal中每个微服务都定义很麻烦所以我们将Filter抽取出来。
Slf4j
public class UserInfoInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.尝试获取头信息中的用户信息String authorization request.getHeader(请求头名称);// 2.判断是否为空 因为很多微服务不需要获取用户信息我们不需要拦截if (authorization null) {return true;}// 3.转为用户id并保存try {Long userId Long.valueOf(authorization);UserContext.setUser(userId);return true;} catch (NumberFormatException e) {log.error(用户身份信息格式不正确{}, 原因{}, authorization, e.getMessage());return true;}}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 清理用户信息UserContext.removeUser();}
}