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 实践示例
如觉得有帮助,欢迎点赞、收藏、评论支持!
更多后端开发实践内容持续更新中。