You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring及Spring Boot仪表盘过滤器能否使用AND/OR条件表达式?

Hey there! Let's tackle your two questions about Spring Boot Actuator filters with AND/OR logic one by one:

1. Implementing AND/OR Conditions in Spring Boot Actuator Filters

If you're building custom filters for Actuator endpoints, implementing AND/OR logic is straightforward—you just need to combine conditions in your filter's core logic. Here are practical, actionable examples:

AND Condition Example

Suppose you want to restrict access to Actuator endpoints only to requests coming from a specific IP AND with a valid auth token:

@Component
public class ActuatorAuthFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String clientIp = request.getRemoteAddr();
        String authToken = request.getHeader("X-Auth-Token");
        
        // AND logic: both conditions must be satisfied to allow access
        if ("192.168.1.100".equals(clientIp) && "secure-token-456".equals(authToken)) {
            filterChain.doFilter(request, response);
        } else {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access restricted to authorized clients only");
        }
    }

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
        // Apply filter only to Actuator endpoints
        return !request.getRequestURI().startsWith("/actuator/");
    }
}

OR Condition Example

If you want to allow access from either a trusted IP OR a request with a valid token:

// Inside the doFilterInternal method
if ("192.168.1.100".equals(clientIp) || "secure-token-456".equals(authToken)) {
    filterChain.doFilter(request, response);
} else {
    response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied");
}

Mixed AND/OR Logic

For more complex scenarios (e.g., (Trusted IP A OR Trusted IP B) AND valid token):

boolean isTrustedIp = "192.168.1.100".equals(clientIp) || "192.168.1.101".equals(clientIp);
boolean isValidToken = "secure-token-456".equals(authToken);

if (isTrustedIp && isValidToken) {
    filterChain.doFilter(request, response);
} else {
    response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access restricted");
}
2. Can You Write Expressions with AND/OR Logic in Spring Boot Actuator Filters?

Absolutely! If you're using Spring Security to secure Actuator endpoints, you can leverage Spring Expression Language (SpEL) to write concise, readable AND/OR expressions directly in your config or code. Here's how:

Using Properties File

Define authorization rules with SpEL expressions in application.properties or application.yml:

# Use parentheses to control expression priority
spring.security.authorization.manager.rule./actuator/**=(hasIpAddress('192.168.1.100') or hasIpAddress('192.168.1.101')) and hasAuthority('ACTUATOR_ADMIN')

This rule means: allow access only if the request comes from either of the two IPs AND the authenticated user has the ACTUATOR_ADMIN authority.

Using Java Configuration

If you prefer code-based config, embed SpEL expressions directly in your SecurityFilterChain:

@Configuration
public class ActuatorSecurityConfig {
    @Bean
    public SecurityFilterChain actuatorSecurityFilterChain(HttpSecurity http) throws Exception {
        http.securityMatcher("/actuator/**")
            .authorizeHttpRequests(auth -> auth
                .anyRequest().access("(hasIpAddress('192.168.1.100') or hasIpAddress('192.168.1.101')) and hasAuthority('ACTUATOR_ADMIN')")
            );
        return http.build();
    }
}

Dynamic Expression Parsing

For even more flexibility (like loading expressions from a database or external config), use SpEL's ExpressionParser to evaluate custom AND/OR expressions at runtime:

// Inside your custom filter
ExpressionParser parser = new SpelExpressionParser();
// Define your AND/OR expression as a string
String accessRule = "(ip == '192.168.1.100' or ip == '192.168.1.101') and token == 'secure-token-456'";

// Create a context with request data
Map<String, Object> context = new HashMap<>();
context.put("ip", request.getRemoteAddr());
context.put("token", request.getHeader("X-Auth-Token"));

// Evaluate the expression
boolean isAllowed = (boolean) parser.parseExpression(accessRule).getValue(context);

if (isAllowed) {
    filterChain.doFilter(request, response);
} else {
    response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied");
}

内容的提问来源于stack exchange,提问作者Dhruv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:13:58