Avant de déployer Lighthouse sur un serveur de production, je vérifie la sécurité (https://www.howtographql.com/advanced/4-security/). J'ai donc décidé de vérifier la profondeur et la complexité des requêtes.
Dans la documentation du phare, ils mentionnent config/lighthouse.php
.
/* |------------------------------------------------- ----------------------- Sécurité | |------------------------------------------------- ----------------------- | | Control Lighthouse pour gérer la vérification des requêtes liées à la sécurité. | Lecture détaillée : https://webonyx.github.io/graphql-php/security/ | */ 'sécurité' => 'max_query_complexity' => GraphQLValidatorRulesQueryComplexity::DISABLED, 'max_query_degree' => GraphQLValidatorRulesQueryDepth :: DISABLED, 'disable_introspection' => GraphQLValidatorRulesDisableIntrospection::DISABLED, ], ≪/pré>Et il est recommandé de lire https://webonyx.github.io/graphql-php/security/.
Dans ce lien, ils donnent quelques exemples :
utilisez GraphQLGraphQL; utilisez GraphQLValidatorRulesQueryComplexity ; utilisez GraphQLValidatorDocumentValidator ; $rule = new QueryComplexity($maxQueryComplexity = 100); DocumentValidator :: addRule ($ règle); GraphQL::executeQuery(/*...*/); ≪/pré>utilisez GraphQLGraphQL; utilisez GraphQLValidatorRulesQueryDepth ; utilisez GraphQLValidatorDocumentValidator ; $rule = new QueryDepth($maxDepth = 10); DocumentValidator :: addRule ($ règle); GraphQL::executeQuery(/*...*/); ≪/pré>Mais comment les appliquer dans un phare ?
Tout d'abord, j'ai écrit ce code dans
ExampleQuery.php(php artisan lighthouse:query SampleQuery)
.classe finale ExempleRequête { fonction publique __invoke(_, tableau $args) { $rule = nouveau QueryComplexity(2); DocumentValidator :: addRule ($ règle); $rule2 = nouveau QueryDepth(2); DocumentValidator::addRule($rule2); retour [ ... ]; } } ≪/pré>Mais cela ne posera aucun problème.
Je pense que Lighthouse est démarré dans
La directivevendor/nuwave/.../GraphQLController.php
donc je ne peux pas exécuterGraphQL::executeQuery(/*...* / );
@complexity
ne fonctionne pas non plus,@complexity(resolver: "App\Security\ComplexityAnalyzer@userPosts")
Fonction userPosts.class ComplexityAnalyzer { fonction publique userPosts (int $childrenComplexity, array $args) : int // non appelé { $postComplexity = $args['includeFullText'] ?3 : 2; Log::Debug($postComplexity); // non appelé return $childrenComplexity * $postComplexity; } } ≪/pré>Qu’est-ce que j’ai manqué ? S'il vous plaît, aidez-moi à bien dormir.
C'est déjà implémenté, il vous suffit de définir la valeur.
Le calcul du score de complexité peut être modifié pour chaque champ à l'aide de la directive@complexity.