Sentinel 授权规则详解与自定义异常处理

发布于:2025-06-27 ⋅ 阅读:(13) ⋅ 点赞:(0)

Sentinel 授权规则详解与自定义异常处理

在微服务系统中,权限控制和访问保护是至关重要的一环。本文将详细介绍如何通过 Sentinel 的 授权规则(AuthorityRule) 控制资源访问权限,并结合实际案例说明如何设置白名单与黑名单,以及如何实现 自定义异常返回,提升系统的稳定性与用户体验。


一、Sentinel 授权规则

授权规则用于对资源进行访问权限控制,其核心思想是:
给指定资源配置“流控应用”,然后通过 白名单黑名单 控制不同来源是否能访问。

  • 白名单(Whitelist):只有在白名单中的应用可以访问。
  • 黑名单(Blacklist):黑名单中的应用不能访问,其他应用可以正常访问。

如何设置请求来源(流控应用)?

Sentinel 默认不识别请求的来源,我们需要自定义 RequestOriginParser 接口来识别请求参数,从而指定来源。

自定义来源解析器
package com.southwind.configuration;

import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

public class RequestOriginParserDefinition implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        String name = request.getParameter("name");
        if (StringUtils.isEmpty(name)) {
            throw new RuntimeException("name is null");
        }
        return name;
    }
}
注入配置类使其生效
package com.southwind.configuration;

import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class SentinelConfiguration {

    @PostConstruct
    public void init() {
        WebCallbackManager.setRequestOriginParser(new RequestOriginParserDefinition());
    }
}

二、授权规则效果展示

示例:假设我们对接口 /test 添加授权规则,限制访问来源。

白名单效果

配置白名单为 aaa,那么只有 name=aaa 的请求能通过:

http://localhost:8080/test?name=aaa

其他任何非 aaa 的请求都将被拦截。

(示意图:白名单正常访问请求截图)


黑名单效果

配置黑名单为 tom,表示禁止 name=tom 的请求:

http://localhost:8080/test?name=tom

其它名称的请求如 name=jerry 可以正常访问。

(示意图:黑名单拦截请求截图)


三、自定义规则异常处理

当请求被 Sentinel 拦截(如限流、降级、授权失败等),可以通过 UrlBlockHandler 接口进行统一异常处理,返回更加友好的信息。

创建自定义异常处理器
package com.southwind.handler;

import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ExceptionHandler implements UrlBlockHandler {
    @Override
    public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException e) throws IOException {
        response.setContentType("text/html;charset=utf-8");
        String msg = "访问受限:";
        if (e instanceof FlowException) {
            msg += "触发限流";
        } else if (e instanceof DegradeException) {
            msg += "触发降级";
        }
        response.getWriter().write(msg);
    }
}
在配置类中注册异常处理器
@Configuration
public class SentinelConfiguration {

    @PostConstruct
    public void init() {
        WebCallbackManager.setUrlBlockHandler(new ExceptionHandler());
    }
}

四、总结

功能模块 说明
授权规则 通过白名单/黑名单控制来源访问权限
请求来源设置 实现 RequestOriginParser 指定来源参数
自定义异常 实现 UrlBlockHandler 提供更友好提示
配置生效 @Configuration 中注入配置

通过上述配置,我们不仅实现了资源访问控制,还优化了 Sentinel 异常返回信息,让系统既安全又具备良好的用户体验。


参考资料:

  • Sentinel 官网:https://github.com/alibaba/Sentinel
  • Spring Boot + Sentinel 实践示例

如觉得有帮助,欢迎点赞、收藏、评论支持!
更多后端开发实践内容持续更新中。


网站公告

今日签到

点亮在社区的每一天
去签到