2026-06-25 a26b31cc9f3ee9b21b1a754e80fa7359e8a7a8f8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package cn.iocoder.yudao.module.ai.framework.security.config;
 
import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
 
/**
 * AI 模块的 Security 配置
 */
@Configuration(proxyBeanMethods = false, value = "aiSecurityConfiguration")
public class SecurityConfiguration {
 
    @Value("${spring.ai.mcp.server.sse-endpoint:/sse}")
    private String mcpSseEndpoint;
    @Value("${spring.ai.mcp.server.sse-message-endpoint:/mcp/message}")
    private String mcpSseMessageEndpoint;
    @Value("${spring.ai.mcp.server.streamable-http-endpoint:/mcp}")
    private String mcpStreamableHttpEndpoint;
 
    @Bean("aiAuthorizeRequestsCustomizer")
    public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
        return new AuthorizeRequestsCustomizer() {
 
            @Override
            public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry) {
                if (StrUtil.isNotBlank(mcpSseEndpoint)) {
                    registry.requestMatchers(mcpSseEndpoint).permitAll();
                }
                if (StrUtil.isNotBlank(mcpSseMessageEndpoint)) {
                    registry.requestMatchers(mcpSseMessageEndpoint).permitAll();
                }
                if (StrUtil.isNotBlank(mcpStreamableHttpEndpoint)) {
                    registry.requestMatchers(mcpStreamableHttpEndpoint).permitAll();
                }
            }
 
        };
    }
 
}