服務提供者過濾器
import java.util.Map;
import java.util.Objects;/*** @title ProviderTokenFilter* @description 服務提供者 token 驗證* author zzw* version 1.0.0* create 2025/5/7 22:17**/
@Activate(group = CommonConstants.PROVIDER)
public class ProviderTokenFilter implements Filter {/*** token 字段名*/private static final String TOKEN_KEY = "TOKEN";/*** token 驗證是否開啟 字段名*/public static final String KEY_AUTH_ENABLED = "auth.enable";/*** token 值 字段名*/private static final String KEY_AUTH_TOKEN = "auth.token";@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 未開啟 token 驗證時,直接調用方法if (!authEnable(invoker, invocation)) {return invoker.invoke(invocation);}// 獲取請求參數中的 tokenString receiveToken = getTokenFromRequest(invocation);if (Objects.isNull(receiveToken)) {throw new RuntimeException("Receive token is null or empty, path: " +String.join(".", invoker.getInterface().getName(), invocation.getMethodName()));}// 獲取服務提供方配置的 tokenString authToken = getTokenConfig(invoker, invocation);// 判斷入參token和服務提供者配置是否一致if (!receiveToken.equals(authToken)) {throw new RuntimeException("Receive token is invalid, path: " +String.join(".", invoker.getInterface().getName(), invocation.getMethodName()));}// 驗證通過后執行下一個過濾器或者執行最終方法return invoker.invoke(invocation);}/*** 獲取服務提供方配置的token*/private String getTokenConfig(Invoker<?> invoker, Invocation invocation) {return invoker.getUrl().getParameter(KEY_AUTH_TOKEN);}/*** 獲取請求參數中的 token*/private String getTokenFromRequest(Invocation invocation) {Map<String, Object> attachments = invocation.getObjectAttachments();if (null == attachments || Objects.isNull(attachments.get(TOKEN_KEY))) {return null;}return attachments.get(TOKEN_KEY).toString();}/*** 判斷 TOKEN 開關是否開啟** @return true:開啟;false:未開啟*/private boolean authEnable(Invoker<?> invoker, Invocation invocation) {return invoker.getUrl().getParameter(KEY_AUTH_ENABLED, false);}}
服務提供者服務配置
@DubboService(validation = "true", parameters = {"auth.enable:true", "auth.token:123456"})
public class UserServiceImpl implements UserService {@Overridepublic BaseResult<String> registerUser(UserDTO userDTO) {return BaseResult.success("用戶注冊成功:" + userDTO.getUsername());}
}
服務提供者過濾器配置
META-INF/dubbo/org.apache.dubbo.rpc.Filter
providerToken=com.doudou.filter.ProviderTokenFilter
服務消費者過濾器
@Activate(group = CommonConstants.CONSUMER)
public class ConsumerTokeFilter implements Filter {/*** token 字段名*/private static final String TOKEN_KEY = "TOKEN";/*** token 值 字段名*/private static final String KEY_AUTH_TOKEN = "auth.token";@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 獲取服務消費者配置的tokenString authToken = getTokenConfig(invoker, invocation);if (Objects.nonNull(authToken)) {// 如果配置了token,放入到請求對象中invocation.setAttachment(TOKEN_KEY, authToken);}// 執行后續操作return invoker.invoke(invocation);}/*** 獲取消費者提供方配置的token*/private String getTokenConfig(Invoker<?> invoker, Invocation invocation) {return invoker.getUrl().getParameter(KEY_AUTH_TOKEN);}
}
服務消費者配置
@RestController
public class UserServiceController {@DubboReference(validation = "false", parameters = {"auth.token:123456"})private UserService userService;@PostMapping("/test")public BaseResult<String> test(@RequestBody UserDTO userDTO) {return userService.registerUser(userDTO);}
}
服務消費者過濾器配置
META-INF/dubbo/org.apache.dubbo.rpc.Filter
providerToken=com.doudou.filter.ProviderTokenFilter