Spring Security 基于角色的授权问题:403 Forbidden Error

问题描述 投票:0回答:1

问题:

我正在尝试创建一个基于 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
,但问题仍然存在。我的配置中缺少什么?

任何见解或建议将不胜感激。谢谢!

java spring authentication jwt user-roles
1个回答
0
投票

您在基于 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 错误的问题。通常,此类问题是由于角色/权限名称不匹配或安全规则配置不正确造成的。

© www.soinside.com 2019 - 2024. All rights reserved.