说明
- 本文将展示自定义插件流程
- 该自定义插件只为描述自定义插件流程,插件及其简单,不涉及具体插件功能。
plugin数据插入
由上文得知,plugin的元数据都放在 plugin表中,而在shenyu-admin上没有新增插件的api,所以我们要新增插件,首先需要在 plugin表中手动插入自定义插件信息,我新加的 pulgin信息为
INSERT INTO `plugin` (`id`, `name`, `role`, `enabled`, `date_created`, `date_updated`) VALUES ('15','diywaf','1', '0', '2021-01-25 19:17:35', '2021-01-25 19:17:35');
然后我们就可以在shenyu-admin里去开启我们的插件咯。
自定义插件开发
当前,我们在数据库里加了对应数据后,还得开发我们的插件项目。在上篇文章分析了插件接入模式,现在我们来自定义插件。
首先创建我们的自定义plugin类,并继承 shenyu插件的抽象类 AbstractShenyuPlugin,所有插件都继承自它。当下自定义插件仅演示自定义插件流程,默认拦截所以请求。
public class DiyWafPlugin extends AbstractShenyuPlugin {
@Override
protected Mono<Void> doExecute(ServerWebExchange exchange, ShenyuPluginChain chain, SelectorData selector, RuleData rule) {
//简单演示,默认直接拒绝
Object error = ShenyuResultWrap.error(-101, Constants.REJECT_MSG, null);
return WebFluxResultUtils.result(exchange, error);
}
@Override
public int getOrder() {
return 1;
}
@Override
public String named() {
return PluginEnum.DIYWAF.getName();
}
}
我们的shenyu插件都是以 spring boot start 方式注入的,通过starter解偶。创建一个 shenyu-spring-boot-start-diywaf 项目,并创建DiyWayPluginConfiguration配置类装配我们自定义的DiyWafPlugin,将该配置类配到 spring.factories
@Configuration
public class DiyWayPluginConfiguration {
@Bean
public ShenyuPlugin diyWebPlugin() {
return new DiyWafPlugin();
}
……
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.apache.shenyu.shenyu.spring.boot.plugin.diywaf.DiyWayPluginConfiguration
然后在 shenyu-bootstrap 类中引入该starter
<!-- shenyu diywaf plugin starter-->
<dependency>
<groupId>org.apache.shenyu</groupId>
<artifactId>shenyu-spring-boot-starter-plugin-diywaf</artifactId>
<version>${project.version}</version>
</dependency>
<!-- shenyu diywaf plugin end-->
最后再重启 shenyu-bootstrap项目,并在 shenyu-admin里,配置该插件相关规则。我配置的符合 /http/** uri的都匹配上我们自定义的插件给直接拒绝,返回错误码 -101。
curl http://localhost:9195/http/order/findById?id=11
{
"code": -101,
"message": " You are forbidden to visit",
"data": null
}
选择器相关配置
规则配置
匹配到自定义插件的日志