5 Star 51 Fork 0

Gitee Community / 码力传递:晒代码赢奖品

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
微服务全局登录用户id注解如配置.java 2.83 KB
一键复制 编辑 原始数据 按行查看 历史
//微服务全局登录用户id注解如配置.java
// 定义 登录用户id 注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginUserid {
boolean required() default true;
}
// springcloud-gateway
//实现GlobalFilter接口,在 filter 接口鉴权通过之后,
//将用户信息用 Base64 encode之后,置于ServerWebExchange中,方便微幅端接收.
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
HttpHeaders httpHeaders = request.getHeaders();
String token = httpHeaders.getFirst("usr-token");
if (!StringUtils.isEmpty(token)) {
String authHeaderUid = Base64.getEncoder().encodeToString(String.valueOf(userId).getBytes(StandardCharsets.UTF_8));
ServerHttpRequest shr = exchange.getRequest().mutate().
header("Authorized-UserId", new String[]{authHeaderUid}).build();
return chain.filter(exchange.mutate().request(shr).build());
}
return loginRequired(exchange.getResponse()); // 提示登录
}
/*
定义 userid 解析器,其做用是解析 来自 微服务网关中
预编码过的用户id字符串(请求头中),方便各个具体的微服务
模块中各个 action (controller) 直接使用 userId;
*/
public class LoginUserHandlerMethodArgumentResolver implements org.springframework.web.method.support.HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(LoginUserid.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
String encodedUserId = nativeWebRequest.getHeader("Authorized-UserId"); // passed from gateway
if (StringUtils.isEmpty(hashedUserId)) return null;
Long userId = Long.parseLong(new String(Base64.getDecoder().decode(encodedUserId)));
return userId;
}
}
// 例如
// 在 user-service 微服务中 进行如下配置
@Configuration
public class serWebMvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver());
}
}
@RestController
public class UserControllerStub {
@GetMapping("/echo")
public Map<String, Object> echo(@LoginUserid Long uid) {
System.out.println("echo() runs : " + uid);
return Map.of();
}
}
1
https://gitee.com/gitee-community/gitee-7th-event-3.git
git@gitee.com:gitee-community/gitee-7th-event-3.git
gitee-community
gitee-7th-event-3
码力传递:晒代码赢奖品
master

搜索帮助