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

Spring Security 6授权配置问题:USER角色越权访问ADMIN专属API

修复Spring Security 6配置问题

问题根源在于当前配置仅限制了PUT方法的/users/roles/**路径,且后续宽泛的/users/**规则会覆盖其他HTTP方法的/users/roles/**访问权限。同时,Spring Security的请求匹配遵循顺序优先原则,更具体的路径规则需要放在宽泛路径规则之前才能生效。

修复后的配置代码

http.authorizeHttpRequests(auth ->
        auth
                // 开放认证相关接口
                .requestMatchers("/auth/**").permitAll()
                // 优先限制/users/roles/**所有HTTP方法仅ADMIN可访问
                .requestMatchers("/users/roles/**").hasRole("ADMIN")
                // 配置/users列表的GET权限
                .requestMatchers(HttpMethod.GET, "/users").hasAnyRole("USER", "ADMIN")
                // 配置单个用户的GET权限
                .requestMatchers(HttpMethod.GET, "/users/{id}").hasAnyRole("USER", "ADMIN")
                // 配置单个用户的PUT修改权限
                .requestMatchers(HttpMethod.PUT, "/users/{id}").hasAnyRole("USER", "ADMIN")
                // 配置用户创建的POST权限
                .requestMatchers(HttpMethod.POST, "/users").hasAnyRole("USER", "ADMIN")
                // 配置单个用户的DELETE权限仅ADMIN可操作
                .requestMatchers(HttpMethod.DELETE, "/users/{id}").hasRole("ADMIN")
                // 其余所有请求需认证后访问
                .anyRequest().authenticated());

关键调整说明

  1. 优先限制/users/roles/**:将该路径的所有HTTP方法权限规则放在最前面,确保任何访问该路径的请求都会先匹配此规则,拦截非ADMIN角色的访问。
  2. 精确匹配用户接口路径:不再使用/users/**这种宽泛的匹配,而是明确指定/users和/users/{id},避免意外覆盖/users/roles/**的规则。
  3. 覆盖所有HTTP方法:确保/users/roles/**的规则对所有请求方法生效,而不仅仅是PUT。

额外检查点

如果调整后仍有问题,需确认角色前缀是否匹配:Spring Security的hasRole()方法会自动为角色名添加ROLE_前缀(例如hasRole("ADMIN")实际匹配的是ROLE_ADMIN权限)。若你的系统中角色存储未带ROLE_前缀,需改用hasAuthority()方法(例如hasAuthority("ADMIN"))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:33