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

Spring Resource Server角色权限配置:实现单角色与方法独立验证

解决方案

你的问题出在当前权限规则的逻辑缺陷上:原配置要求所有GET请求必须持有ONLY_READ角色,导致仅拥有WRITE角色的用户无法访问GET接口;同时anyRequest().authenticated()又放开了所有认证用户访问非GET接口,不符合「仅WRITE角色能调用所有接口」的需求。

不需要用OrRequestMatcher,直接借助Spring Security的表达式访问控制就能实现你的需求,调整authorizeHttpRequests部分的规则即可:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

    http
            .sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(authorize ->
                    authorize
                            .requestMatchers(NON_SECURED_PATTERNS).permitAll()
                            // GET请求允许ONLY_READ或WRITE角色访问
                            .requestMatchers(HttpMethod.GET).access("hasRole('ONLY_READ') or hasRole('WRITE')")
                            // 非GET请求仅允许WRITE角色访问
                            .anyRequest().access("hasRole('WRITE')"))
            .oauth2ResourceServer(oauth2 -> oauth2.jwt(t -> t.jwtAuthenticationConverter(converter)))
            .csrf(AbstractHttpConfigurer::disable)
            .cors(AbstractHttpConfigurer::disable)
            .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(
                    new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)
            ));

    return http.build();
}

规则说明

  • GET请求:通过hasRole('ONLY_READ') or hasRole('WRITE')表达式,同时允许两种角色的用户访问——既满足ONLY_READ角色仅能调用GET的限制,也让WRITE角色可以正常访问GET接口
  • 非GET请求:仅限制WRITE角色的用户能访问,确保只有拥有WRITE权限的客户端才能调用这类接口
  • 原有免认证路径、无状态会话、JWT资源服务器等配置保持不变,不影响其他功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:33:19