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

