Spring Cloud Zuul PreFilter实现token校验

举报
林欣 发表于 2025/01/09 14:05:51 2025/01/09
【摘要】 在Spring Cloud Zuul中,PreFilter是用于在请求被路由到微服务之前执行一系列操作的过滤器类型。实现token校验是PreFilter的一个常见用途,它允许你在请求到达实际服务之前验证请求的合法性。以下是一个简单的示例,展示了如何在Spring Cloud Zuul中创建一个PreFilter来实现token校验:添加依赖:确保你的Spring Boot项目中已经包含了S...

在Spring Cloud Zuul中,PreFilter是用于在请求被路由到微服务之前执行一系列操作的过滤器类型。实现token校验是PreFilter的一个常见用途,它允许你在请求到达实际服务之前验证请求的合法性。

以下是一个简单的示例,展示了如何在Spring Cloud Zuul中创建一个PreFilter来实现token校验:

  1. 添加依赖
    确保你的Spring Boot项目中已经包含了Spring Cloud Zuul的依赖。

  2. 创建Token校验过滤器
    创建一个Java类,继承ZuulFilter,并实现preFilter逻辑。

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class TokenPreFilter extends ZuulFilter {

    private static final Logger logger = LoggerFactory.getLogger(TokenPreFilter.class);

    @Override
    public String filterType() {
        return "pre"; // 指定为前置过滤器
    }

    @Override
    public int filterOrder() {
        return 1; // 设置过滤器执行顺序,值越小越先执行
    }

    @Override
    public boolean shouldFilter() {
        return true; // 表示该过滤器总是需要执行
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        // 从请求头中获取token
        String token = request.getHeader("Authorization"); // 假设token通过Authorization头传递

        // 校验token的有效性(这里只是一个示例,实际应该调用认证服务)
        if (isValidToken(token)) {
            // token有效,继续处理请求
            logger.info("Token is valid.");
            ctx.setSendZuulResponse(true); // 允许请求继续路由
        } else {
            // token无效,拒绝请求
            logger.warn("Invalid token: {}", token);
            ctx.setSendZuulResponse(false); // 阻止请求继续路由
            ctx.setResponseStatusCode(401); // 设置响应状态码为401 Unauthorized
            ctx.setResponseBody("{\"error\":\"Unauthorized\"}"); // 设置响应体
        }

        return null;
    }

    // 这是一个模拟的token校验方法,实际应该调用你的认证服务
    private boolean isValidToken(String token) {
        // 这里应该添加实际的token校验逻辑,比如调用认证服务的API
        // 为了示例简单,这里直接返回true(表示token总是有效的)
        // 但在实际应用中,你需要替换成真实的校验逻辑
        return "valid-token".equals(token); // 示例用的固定token
    }
}
  1. 配置Zuul
    确保你的Spring Boot应用已经配置了Zuul作为API网关,并且已经注册到了Eureka(如果你使用的是Eureka作为服务发现)。

  2. 启动应用
    启动你的Spring Boot应用,Zuul网关将开始拦截并处理传入的请求。

  3. 测试
    使用工具(如Postman)向Zuul网关发送请求,并在请求头中包含Authorization字段。根据你的isValidToken方法的实现,如果token有效,请求将被路由到目标微服务;如果token无效,你将收到一个401 Unauthorized的响应。

请注意,上面的示例中isValidToken方法只是一个模拟实现,它总是返回true。在实际应用中,你需要替换成调用你的认证服务的真实逻辑来校验token的有效性。此外,为了安全起见,你应该确保token的传输和存储都是安全的,比如使用HTTPS来加密传输的token。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。