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

Spring JWT环境下登录时触发403 Forbidden权限异常求助

Spring JWT环境下登录时触发403 Forbidden权限异常求助

兄弟,我仔仔细细看了你贴的代码片段,发现了几个大概率导致你登录403的坑,咱们一个个捋:

1. 你的SecurityConfig缺了关键的认证Bean

看你贴的SecurityConfig代码,居然没定义AuthenticationManager和PasswordEncoder的Bean!这俩是Spring Security认证的核心组件:

  • PasswordEncoder负责密码的加密和比对,注册时加密、登录时验证都靠它
  • AuthenticationManager是处理认证请求的核心管理器,没有它登录请求根本没法正常处理

赶紧把这俩Bean加上:

@Bean
public PasswordEncoder passwordEncoder() {
    // 用你代码里提到的BCrypt加密算法
    return new BCryptPasswordEncoder();
}

@Bean
public AuthenticationManager authenticationManager() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(passwordEncoder());
    return new ProviderManager(authProvider);
}

2. 检查JwtAuthFilter是否误拦截了登录请求

你把JwtAuthFilter加在了UsernamePasswordAuthenticationFilter前面,理论上permitAll()的请求会直接放行,但如果你的JwtAuthFilter逻辑里没做判断,直接对所有请求强制校验JWT token,那登录请求(本来就没token)会直接被打回403。

赶紧给JwtAuthFilter加个白名单判断,比如在doFilterInternal方法开头加:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String requestUri = request.getRequestURI();
    // 登录、注册接口直接放行,不用走JWT校验
    if (requestUri.startsWith("/api/auth/signup") || requestUri.equals("/api/auth/login")) {
        filterChain.doFilter(request, response);
        return;
    }
    // 下面再写你的JWT解析、校验逻辑
}

3. LoginUserDto里的role字段纯属多余,可能坑了你

正常登录只需要email和password就够了,你加个role字段干嘛?如果你的登录Controller里,误把这个前端传的role当成认证条件,而不是通过UserDetailsService从数据库加载用户真实角色,那肯定会导致认证失败。

建议直接把LoginUserDto里的private Role role;删掉,登录就传邮箱和密码就行,角色信息让UserDetailsService从数据库加载后返回。

4. 确认UserDetailsService是否正确加载了用户角色

再检查下你的UserDetailsService实现类,loadUserByUsername方法里有没有正确把用户的角色转换成GrantedAuthority对象?比如:

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    // 从数据库查询用户
    User user = userRepo.findByEmail(email)
            .orElseThrow(() -> new UsernameNotFoundException("用户不存在:" + email));
    // 这里要把角色封装成GrantedAuthority,注意Spring Security默认认带ROLE_前缀的权限
    return User.withUsername(user.getEmail())
            .password(user.getPassword())
            .authorities("ROLE_" + user.getRole().name()) // 比如你的Role枚举是ADMIN、MEDECIN的话
            .build();
}

最后再核对一个细节:注册时密码加密了吗?

如果注册用户的时候,你没调用passwordEncoder().encode(明文密码)就存到数据库了,那登录时Spring用BCrypt比对密码肯定失败,也会返回403(或者401,取决于配置)。

先把这些点一个个排查,应该能解决你的登录403问题!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:40:27