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

Spring Security中如何在RequestMatcher中实现OR(或)逻辑?

在Spring Security中实现RequestMatcher的OR逻辑

嘿,这个需求我之前做项目时刚好碰到过!Spring Security默认的authorizeRequests()链式调用是AND逻辑,所以你原来的写法会要求用户同时满足两个权限条件,这显然不是你想要的效果。下面给你两种简单直接的实现方式:

方法一:使用SpEL表达式(最简洁)

Spring Security支持通过SpEL(Spring表达式语言)在access()方法中编写复杂的权限逻辑,包括OR运算。直接把两个条件用or连接即可:

public class ApplicationWebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            // 对所有/api/**路径应用OR权限规则
            .antMatchers("/api/**").access("hasAuthority('READONLY') or hasRole('REAL_USER')")
            // 其他请求的认证规则(按需调整)
            .anyRequest().authenticated();
    }
}

注意细节:

  • hasRole('REAL_USER')会自动给角色名加上ROLE_前缀,也就是说实际检查的是ROLE_REAL_USER权限。如果你的系统中角色存储没有前缀(直接是REAL_USER),请改用hasAuthority('REAL_USER'),它不会添加前缀。
  • 这个规则会对所有/api/**路径生效,不管请求方法是GET、POST还是其他,只要用户满足其中一个条件就能访问。

方法二:利用规则匹配顺序(针对分场景的OR需求)

如果你的需求是GET请求只需要READONLY权限,非GET请求只需要REAL_USER角色(也就是两种场景二选一),那可以利用Spring Security规则的从上到下匹配、匹配即生效的特性来实现:

public class ApplicationWebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            // 先匹配GET请求,满足READONLY即可访问
            .antMatchers(HttpMethod.GET, "/api/**").hasAuthority("READONLY")
            // 再匹配其他/api/**请求,满足REAL_USER角色即可访问
            .antMatchers("/api/**").hasRole("REAL_USER")
            // 其他请求需认证
            .anyRequest().authenticated();
    }
}

这种方式下,GET请求会被第一个规则拦截检查,非GET请求会走到第二个规则,本质上也是一种“OR”逻辑的实现,适合分请求方法的场景。

为什么原来的写法不行?

你原来的代码中,两个antMatchers是链式的AND逻辑,意味着用户必须同时拥有READONLY权限和REAL_USER角色才能访问/api/**,这和你的需求完全相反,所以需要用上面的方法调整逻辑。

内容的提问来源于stack exchange,提问作者jarek.jpa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:44