问题:
我正在尝试创建一个基于 Spring 且具有基于角色的身份验证的 Web 服务器,但我始终收到 403 Forbidden 错误。我已经实现了自定义
UserDetails
类,我怀疑我的配置可能存在问题。
代码:
定制
UserDetails
:
public class CustomUserDetails implements UserDetails {
private static final long serialVersionUID = 1L;
private final User user;
public CustomUserDetails(User user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getRoles().stream().map(r -> new SimpleGrantedAuthority("ROLE_" + r.getName())).toList();
}
// ... other UserDetails methods
}
SecurityFilterChain
实施:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(csrf -> csrf.disable())
.sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(requests -> requests
.requestMatchers("/api/**").permitAll()
.requestMatchers("/secret/**").hasAuthority("USER")
.anyRequest().authenticated())
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()))
.addFilterBefore(authorizeFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
我实现了一个自定义
UserDetails
类并配置了 Spring Security 以进行基于角色的身份验证。但是,即使我相信角色已正确分配,我仍然遇到 403 Forbidden 错误。我尝试同时使用 hasRole
和 hasAuthority
,但问题仍然存在。我的配置中缺少什么?
任何见解或建议将不胜感激。谢谢!
您在基于 Spring 的 Web 服务器中遇到的 403 Forbidden 错误问题可能是由于安全设置中的一些潜在配置错误造成的。让我们看一下可能导致此问题的一些常见点:
角色和权限前缀:在Spring Security中,角色和权限是有区别的。角色通常具有像 ROLE_ 这样的前缀,您可以将其正确附加到 getAuthorities() 方法中。但是,在配置中使用 hasAuthority("USER") 时,请确保“USER”是您定义的权限的确切名称。如果“USER”是角色,则应该是 hasAuthority("ROLE_USER")。
匹配权限:确保 CustomUserDetails 中的 getAuthorities() 方法返回的权限(角色)与您在安全配置中检查的权限完全匹配。名称区分大小写并且必须准确。
URL 模式匹配:检查您尝试保护的 URL 模式(/api/、/secret/)是否已正确定义并与您发出的请求相匹配。如果您的实际请求 URL 与这些模式不匹配,安全配置将不会按预期应用。
安全规则的顺序:Spring Security 按照定义的顺序评估规则。您可能希望确保更具体的规则位于顶部,更一般的规则位于底部。例如,您的 /secret/** 规则应位于 .anyRequest().authenticated() 规则之前。
OAuth2 资源服务器:由于您使用的是 OAuth2 资源服务器配置,请确保您使用的 JWT 令牌包含正确的权限(角色),并且它们在安全上下文中被正确解析。
调试日志记录:为 Spring Security 启用调试日志记录,以获取有关请求处理期间所做的安全决策的更多详细信息。这可以深入了解访问被拒绝的原因。
UserDetails Service:确保正确设置 UserDetailsService 实现以从用户存储(例如数据库)加载用户及其角色。如果角色未正确加载,这将影响安全上下文中可用的权限。
通过解决这些问题,您应该能够查明导致 403 Forbidden 错误的问题。通常,此类问题是由于角色/权限名称不匹配或安全规则配置不正确造成的。