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

Spring Security权限配置异常:/users路径无法被ADMIN角色访问

解决Spring Security角色权限403禁止访问问题

看起来你遇到的核心问题是角色权限配置不生效,加上.hasRole()就返回403,而且当前的代码还存在几个明显的问题,我来一步步帮你搞定:

首先,修正你的核心配置

你的代码里现在有两个重复的configure(HttpSecurity)方法(一个被注释),而且生效的配置用了.antMatchers("/", "/**").permitAll(),这会让所有路径都允许匿名访问,后面的角色规则根本不会触发!先把配置改成符合你需求的版本:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UsersRepository usersRepository;

    // 密码编码器:Spring Security 5+必须配置,否则密码认证会直接失败
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        PasswordEncoder encoder = passwordEncoder();
        
        usersRepository.findAll().forEach(users -> {
            // 确定用户角色
            String userRole = (users.getIdRole() != null && users.getIdRole() == 1) ? "ADMIN" : "USER";
            
            UserDetails userDetails = User.withUsername(users.getUsername())
                    // 注意:如果数据库存的是明文密码,用encoder.encode()加密;如果已经是加密后的,直接写users.getPassword()
                    .password(encoder.encode(users.getPassword()))
                    // roles()方法会自动给角色添加ROLE_前缀,和hasRole()逻辑对应
                    .roles(userRole)
                    .build();
            
            manager.createUser(userDetails);
        });
        return manager;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                // 规则顺序很重要:更具体的路径必须放在前面
                .antMatchers("/entrysheet/**", "/datasheet/**").hasRole("USER")
                .antMatchers("/users/**").hasRole("ADMIN")
                // 其他所有路径需要认证后才能访问
                .anyRequest().authenticated()
            .and()
            // 开启表单登录(如果需要的话,否则没有用户认证入口)
            .formLogin()
            .and()
            // 开启退出登录功能
            .logout();
    }
}

为什么之前会出现403?主要有这几个原因:

  1. 路径规则被覆盖:你之前的生效配置用了"/**"的permitAll,直接跳过了所有角色校验,导致/users/**的权限规则根本没执行。
  2. 缺少密码编码器:Spring Security 5之后默认要求密码必须经过编码存储,如果你直接用明文密码或者没配置编码器,用户会认证失败,自然无法通过角色校验。
  3. 角色前缀匹配问题:.hasRole("ADMIN")实际会匹配ROLE_ADMIN权限,而.roles("ADMIN")方法会自动给角色加上ROLE_前缀,这两者是对应的。如果你不想用前缀,可以换成.hasAuthority("ADMIN")和.authorities("ADMIN")(后者不会添加前缀)。

额外调试建议

  • 可以在userDetailsService()里打印userDetails.getAuthorities(),确认用户的权限列表是否包含正确的角色(比如ROLE_ADMIN或ROLE_USER)。
  • 测试时先确保用户能正常登录,登录成功后再访问对应路径,避免因为认证失败导致的403混淆问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:38:16