Add a2a api auth resource parser. (#13826)

This commit is contained in:
杨翊 SionYang 2025-09-17 17:37:45 +08:00 committed by GitHub
parent 4ddbc4317c
commit f1af11a50f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 116 additions and 0 deletions

View File

@ -21,6 +21,7 @@ import com.alibaba.nacos.auth.annotation.Secured;
import com.alibaba.nacos.auth.config.NacosAuthConfig;
import com.alibaba.nacos.auth.context.GrpcIdentityContextBuilder;
import com.alibaba.nacos.auth.parser.grpc.AbstractGrpcResourceParser;
import com.alibaba.nacos.auth.parser.grpc.AiGrpcResourceParser;
import com.alibaba.nacos.auth.parser.grpc.ConfigGrpcResourceParser;
import com.alibaba.nacos.auth.parser.grpc.NamingGrpcResourceParser;
import com.alibaba.nacos.auth.serveridentity.ServerIdentity;
@ -57,6 +58,7 @@ public class GrpcProtocolAuthService extends AbstractProtocolAuthService<Request
super.initialize();
resourceParserMap.put(SignType.NAMING, new NamingGrpcResourceParser());
resourceParserMap.put(SignType.CONFIG, new ConfigGrpcResourceParser());
resourceParserMap.put(SignType.AI, new AiGrpcResourceParser());
}
@Override

View File

@ -0,0 +1,79 @@
/*
* Copyright 1999-2025 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.nacos.auth.parser.grpc;
import com.alibaba.nacos.api.ai.remote.request.AbstractAgentRequest;
import com.alibaba.nacos.api.ai.remote.request.AbstractMcpRequest;
import com.alibaba.nacos.api.ai.remote.request.ReleaseAgentCardRequest;
import com.alibaba.nacos.api.ai.remote.request.ReleaseMcpServerRequest;
import com.alibaba.nacos.api.remote.request.Request;
import com.alibaba.nacos.common.utils.StringUtils;
/**
* Ai Grpc resource parser.
*
* @author xiweng.yy
*/
public class AiGrpcResourceParser extends AbstractGrpcResourceParser {
@Override
protected String getNamespaceId(Request request) {
if (request instanceof AbstractMcpRequest) {
return ((AbstractMcpRequest) request).getNamespaceId();
} else if (request instanceof AbstractAgentRequest) {
return ((AbstractAgentRequest) request).getNamespaceId();
}
return StringUtils.EMPTY;
}
@Override
protected String getGroup(Request request) {
return StringUtils.EMPTY;
}
@Override
protected String getResourceName(Request request) {
if (request instanceof AbstractMcpRequest) {
return getMcpName((AbstractMcpRequest) request);
} else if (request instanceof AbstractAgentRequest) {
return getAgentName((AbstractAgentRequest) request);
}
return StringUtils.EMPTY;
}
private String getMcpName(AbstractMcpRequest request) {
String mcpName = request.getMcpName();
if (request instanceof ReleaseMcpServerRequest) {
ReleaseMcpServerRequest releaseMcpServerRequest = (ReleaseMcpServerRequest) request;
if (null != releaseMcpServerRequest.getServerSpecification()) {
mcpName = releaseMcpServerRequest.getServerSpecification().getName();
}
}
return StringUtils.isBlank(mcpName) ? StringUtils.EMPTY : mcpName;
}
private String getAgentName(AbstractAgentRequest request) {
String agentName = request.getAgentName();
if (request instanceof ReleaseAgentCardRequest) {
ReleaseAgentCardRequest releaseAgentCardRequest = (ReleaseAgentCardRequest) request;
if (null != releaseAgentCardRequest.getAgentCard()) {
agentName = releaseAgentCardRequest.getAgentCard().getName();
}
}
return StringUtils.isBlank(agentName) ? StringUtils.EMPTY : agentName;
}
}

View File

@ -17,7 +17,9 @@
package com.alibaba.nacos.auth.parser.http;
import com.alibaba.nacos.api.ai.constant.AiConstants;
import com.alibaba.nacos.api.ai.model.a2a.AgentCard;
import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import jakarta.servlet.http.HttpServletRequest;
@ -30,6 +32,12 @@ import java.util.Properties;
*/
public class AiHttpResourceParser extends AbstractHttpResourceParser {
public static final String MCP_PATH = "/ai/mcp";
public static final String A2A_PATH = "/ai/a2a";
private static final String AGENT_CARD_PARAM = "agentCard";
@Override
protected String getNamespaceId(HttpServletRequest request) {
String namespaceId = request.getParameter(Constants.NAMESPACE_ID);
@ -46,10 +54,37 @@ public class AiHttpResourceParser extends AbstractHttpResourceParser {
@Override
protected String getResourceName(HttpServletRequest request) {
String url = request.getRequestURI();
if (url.contains(MCP_PATH)) {
return getMcpName(request);
} else if (url.contains(A2A_PATH)) {
return getAgentName(request);
}
return StringUtils.EMPTY;
}
private String getMcpName(HttpServletRequest request) {
String mcpName = request.getParameter("mcpName");
return StringUtils.isBlank(mcpName) ? StringUtils.EMPTY : mcpName;
}
private String getAgentName(HttpServletRequest request) {
String agentName = request.getParameter("agentName");
if (request.getParameterMap().containsKey(AGENT_CARD_PARAM)) {
agentName = deserializeAndGetAgentName(request.getParameter(AGENT_CARD_PARAM));
}
return StringUtils.isBlank(agentName) ? StringUtils.EMPTY : agentName;
}
private String deserializeAndGetAgentName(String agentCardJson) {
try {
AgentCard agentCard = JacksonUtils.toObj(agentCardJson, AgentCard.class);
return agentCard.getName();
} catch (Exception ignored) {
return StringUtils.EMPTY;
}
}
@Override
protected Properties getProperties(HttpServletRequest request) {
return new Properties();