• 使用gateway对用户认证(用于确定用户是否登录)


    1. package com.atguigu.yygh.gateway.filter;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.atguigu.Result;
    4. import com.atguigu.ResultCodeEnum;
    5. import com.atguigu.helper.JwtHelper;
    6. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    7. import org.springframework.cloud.gateway.filter.GlobalFilter;
    8. import org.springframework.core.Ordered;
    9. import org.springframework.core.io.buffer.DataBuffer;
    10. import org.springframework.http.server.reactive.ServerHttpRequest;
    11. import org.springframework.http.server.reactive.ServerHttpResponse;
    12. import org.springframework.stereotype.Component;
    13. import org.springframework.util.AntPathMatcher;
    14. import org.springframework.util.StringUtils;
    15. import org.springframework.web.server.ServerWebExchange;
    16. import reactor.core.publisher.Mono;
    17. import java.nio.charset.StandardCharsets;
    18. import java.util.List;
    19. /**
    20. *

    21. * 全局Filter,统一处理会员登录与外部不允许访问的服务
    22. *

    23. *
    24. * @author qy
    25. * @since 2019-11-21
    26. */
    27. @Component
    28. public class AuthGlobalFilter implements GlobalFilter, Ordered {
    29. private AntPathMatcher antPathMatcher = new AntPathMatcher();
    30. @Override
    31. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    32. ServerHttpRequest request = exchange.getRequest();
    33. String path = request.getURI().getPath();
    34. System.out.println("==="+path);
    35. //内部服务接口,不允许外部访问
    36. if(antPathMatcher.match("/**/inner/**", path)) {
    37. ServerHttpResponse response = exchange.getResponse();
    38. return out(response, ResultCodeEnum.PERMISSION);
    39. }
    40. //api接口,异步请求,校验用户必须登录
    41. if(antPathMatcher.match("/api/**/auth/**", path)) {
    42. Long userId = this.getUserId(request);
    43. if(StringUtils.isEmpty(userId)) {
    44. ServerHttpResponse response = exchange.getResponse();
    45. return out(response, ResultCodeEnum.LOGIN_AUTH);
    46. }
    47. }
    48. return chain.filter(exchange);
    49. }
    50. @Override
    51. public int getOrder() {
    52. return 0;
    53. }
    54. /**
    55. * api接口鉴权失败返回数据
    56. * @param response
    57. * @return
    58. */
    59. private Mono<Void> out(ServerHttpResponse response, ResultCodeEnum resultCodeEnum) {
    60. Result result = Result.build(null, resultCodeEnum);
    61. byte[] bits = JSONObject.toJSONString(result).getBytes(StandardCharsets.UTF_8);
    62. DataBuffer buffer = response.bufferFactory().wrap(bits);
    63. //指定编码,否则在浏览器中会中文乱码
    64. response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
    65. return response.writeWith(Mono.just(buffer));
    66. }
    67. /**
    68. * 获取当前登录用户id
    69. * @param request
    70. * @return
    71. */
    72. private Long getUserId(ServerHttpRequest request) {
    73. String token = "";
    74. List<String> tokenList = request.getHeaders().get("token");
    75. if(null != tokenList) {
    76. token = tokenList.get(0);
    77. }
    78. if(!StringUtils.isEmpty(token)) {
    79. return JwtHelper.getUserId(token);
    80. }
    81. return null;
    82. }
    83. }

  • 相关阅读:
    高效代码静态测试工具Klocwork 2022.3版本快讯
    【JavaScript闭包】JavaScript何为闭包,浅谈闭包的形成和意义
    “undefined reference to XXX“问题总结
    SpringCloud 框架以及各组件总结
    【ccf-csp题解】第四次csp认证-第四题-网络延时-树的直径
    专访D-Wave CEO:量子计算的过去、现在和未来
    Vue状态管理--Pinia使用详解
    超强视频超分AI算法,从此只看高清视频
    Django: 事务 transaction.atomic
    【程序人生】上海城市开发者社区小聚有感
  • 原文地址:https://blog.csdn.net/weixin_62108279/article/details/128166428