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());
关键调整说明
- 优先限制
/users/roles/**:将该路径的所有HTTP方法权限规则放在最前面,确保任何访问该路径的请求都会先匹配此规则,拦截非ADMIN角色的访问。 - 精确匹配用户接口路径:不再使用
/users/**这种宽泛的匹配,而是明确指定/users和/users/{id},避免意外覆盖/users/roles/**的规则。 - 覆盖所有HTTP方法:确保
/users/roles/**的规则对所有请求方法生效,而不仅仅是PUT。
额外检查点
如果调整后仍有问题,需确认角色前缀是否匹配:Spring Security的hasRole()方法会自动为角色名添加ROLE_前缀(例如hasRole("ADMIN")实际匹配的是ROLE_ADMIN权限)。若你的系统中角色存储未带ROLE_前缀,需改用hasAuthority()方法(例如hasAuthority("ADMIN"))。
内容的提问来源于stack exchange,提问作者NqanVo
相关产品推荐
相关产品推荐

