Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import cn.dev33.satoken.util.SaFoxUtil;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
* Sa-Token 配置类 Model
Expand Down Expand Up @@ -216,6 +218,9 @@ public class SaTokenConfig implements Serializable {
*/
private Boolean checkSameToken = false;

// 忽略
private List<String> ignoreSameTokenPaths = new ArrayList<>();

/**
* Cookie配置对象
*/
Expand Down Expand Up @@ -941,4 +946,11 @@ public SaTokenConfig setBasic(String basic) {
return this;
}

public List<String> getIgnoreSameTokenPaths() {
return ignoreSameTokenPaths;
}

public void setIgnoreSameTokenPaths(List<String> ignoreSameTokenPaths) {
this.ignoreSameTokenPaths = ignoreSameTokenPaths;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,19 @@
package cn.dev33.satoken.context.dubbo3.filter;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.same.SaSameUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaTokenConsts;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcContext;

import java.util.List;

/**
* Sa-Token 整合 Dubbo3 Provider端(被调用端)过滤器
Expand All @@ -34,21 +39,30 @@
@Activate(group = {CommonConstants.PROVIDER}, order = SaTokenConsts.RPC_PERMISSION_FILTER_ORDER)
public class SaTokenDubbo3ProviderFilter implements Filter {

@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) {

// RPC 调用鉴权
if(SaManager.getConfig().getCheckSameToken()) {
String idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN);
// dubbo部分协议会将参数变为小写,详细参考:https://gitee.com/dromara/sa-token/issues/I4WXQG
if(idToken == null) {
idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN.toLowerCase());
}
SaSameUtil.checkToken(idToken);
}

// 开始调用
return invoker.invoke(invocation);
}
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) {

// 新加白名单能力,对指定的 RPC 调用不进行 Same-Token 校验
List<String> ignoreSameTokenPaths = SaManager.getConfig().getIgnoreSameTokenPaths();
String interfaceName = invoker.getInterface().getName();
String methodName = invocation.getMethodName();
String rpcKey = interfaceName + ":" + methodName + ":*:*";
if (ignoreSameTokenPaths.contains(rpcKey)) {
return invoker.invoke(invocation);
}

// RPC 调用鉴权
if (SaManager.getConfig().getCheckSameToken()) {
String idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN);
// dubbo部分协议会将参数变为小写,详细参考:https://gitee.com/dromara/sa-token/issues/I4WXQG
if (idToken == null) {
idToken = invocation.getAttachment(SaSameUtil.SAME_TOKEN.toLowerCase());
}
SaSameUtil.checkToken(idToken);
}

// 开始调用
return invoker.invoke(invocation);
}

}