Maison >Java >Problème d'autorisation basée sur les rôles Spring Security : erreur 403 interdite

Problème d'autorisation basée sur les rôles Spring Security : erreur 403 interdite

PHPz
PHPzavant
2024-02-09 11:21:08720parcourir

Spring Security est un puissant cadre de sécurité pour protéger les applications contre les attaques malveillantes. Lors de l'utilisation de Spring Security, des problèmes d'autorisation de rôle peuvent provoquer des erreurs 403 Forbidden. L'éditeur PHP Banana vous présente ce problème en détail et propose une solution pour vous aider à résoudre avec succès le problème de l'autorisation de rôle. Que vous soyez un développeur débutant ou expérimenté, cet article vous aidera à comprendre en profondeur le mécanisme d'autorisation de rôle de Spring Security et à apprendre à gérer correctement les erreurs 403 interdites.

Contenu de la question

Question :

J'essaie de créer un serveur Web basé sur Spring avec une authentification basée sur les rôles, mais je reçois toujours une erreur 403 interdite. J'ai implémenté une classe userdetails personnalisée et je soupçonne qu'il pourrait y avoir un problème avec ma configuration.

Code :

Personnalisation 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 Mise en œuvre :

@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();
}

J'ai implémenté une classe userdetails 类并配置了 spring security 以进行基于角色的身份验证。但是,即使我相信角色已正确分配,我仍然遇到 403 forbidden 错误。我尝试同时使用 hasrolehasauthority personnalisée et configuré la sécurité Spring pour l'authentification basée sur les rôles. Cependant, même si je pense que les rôles sont correctement attribués, j'obtiens toujours une erreur 403 interdite. J'ai essayé d'utiliser à la fois hasrole et hasauthority mais le problème persiste. Qu'est-ce qui manque dans ma configuration ?

Toutes les idées ou suggestions seraient grandement appréciées. Merci!

Solution

Pour les serveurs de ressources avec JWT, les autorisations sont définies par le convertisseur d'authentification.

Le convertisseur d'authentification par défaut est le préfixe JwtAuthenticarionConverter,它将权限转换委托给可配置的权限转换器(默认使用 scope 声明中的条目添加 SCOPE_).

Vous pouvez en fournir un configuré avec un autre convertisseur d'autorisation JwtAuthenticationConverter (一个使用另一个声明作为权限源),或者切换到完全不同的 Converterd5f3c2e320864c54a83e1ef7cadf1add(oauth2-> oauth2.jwt(Jwt -> jwt.jwtAuthenticationConverter(...))

Vous pouvez également envisager ce démarreur supplémentaire Je le maintiens à l'aide d'une propriété d'application de convertisseur d'autorisation configurable (sauf si vous fournissez votre propre convertisseur d'autorisation ou d'authentification dans la conf)

Vous pouvez essayer d'ouvrir les journaux TRACE de Spring et découvrir où se trouve le problème se produit. Cette suggestion ne vous aidera peut-être pas directement, mais elle nous a aidé à trouver la raison pour laquelle l'API renvoie 403 lors de la migration vers Springboot3.0

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer