1

使用记录在案的 RequiresAuthValidationRule 实现;

https://github.com/graphql-dotnet/graphql-dotnet/blob/master/docs/learn.md

有一个例子可以检查一个字段是否具有特定的权限,以及用户是否可以访问该字段。

_.Match(fieldAst =>{...})

看起来 GraphQL 引擎正在遍历树并在每个节点处调用 IValidationRule.Validate(...)。

了解该领域的完整路径是什么的最佳方法是什么。

星球大战的例子;
https://github.com/graphql-dotnet/graphql-dotnet/blob/master/docs/getting-started.md

即当我在“姓名”节点时,我想知道该字段是人类->朋友->姓名。

从我所见,我只能看到当前字段节点及其子节点,而不是它的父节点。

4

2 回答 2

0

为了提高效率,在 Joe McBride 的提示下,我选择基于 GraphQL-dotnet EnterLeaveListener 源创建自己的 MyEnterLeaveListener。

public class EnterLeaveListenerState
{
   public OperationType OperationType { get; private set; }
   public string CurrentFieldPath { get; private set; }
}

public class MyEnterLeaveListener : INodeVisitor, IEventSource<IEnterLeaveListenerEventSink>  
{
    ....
    public void Enter(INode node)
    {
        var isField = TypeHelper<Field>.IsType(node.GetType());
        var isOperation = TypeHelper<Operation>.IsType(node.GetType());

        if (isOperation)
        {
            var operation = node as Operation;
            OperationType = operation.OperationType;
            RunningPath.Clear();
            FireEnterLeaveListenerState(new EnterLeaveListenerState(OperationType, CurrentFieldPath));
        }
        if (isField)
        {
            var field = node as Field;
            var next = CurrentFieldPath + "/" + field.Name;
            RunningPath.Push(next);
            FireEnterLeaveListenerState(new EnterLeaveListenerState(OperationType, CurrentFieldPath));
        }
        _listeners
            .Where(l => l.Enter != null && l.Matches(node))
            .Apply(l => l.Enter(node));
    }

    public void Leave(INode node)
    {
        var isField = TypeHelper<Field>.IsType(node.GetType());
        if (isField)
        {
            var field = node as Field;
            RunningPath.Pop();
            FireEnterLeaveListenerState(new EnterLeaveListenerState(OperationType, CurrentFieldPath));
        }
        _listeners
            .Where(l => l.Leave != null && l.Matches(node))
            .Apply(l => l.Leave(node));
    }
    ....

}

我一边走一边构建操作和路径,并提出任何变化。

于 2017-03-24T15:12:17.530 回答
0

取决于你需要什么,ValidationContext.TypeInfo.GetLastType()和/或ValidationContext.TypeInfo.GetParentType()应该是你需要的。 ValidationContext.TypeInfo有很多关于你在图中的位置的上下文。

ScalarLeafs以下是验证规则的示例:

public class ScalarLeafs : IValidationRule
{
    public INodeVisitor Validate(ValidationContext context)
    {
        return new EnterLeaveListener(_ =>
        {
            _.Match<Field>(f => Field(context.TypeInfo.GetLastType(), f, context));
        });
    }

    private void Field(IGraphType type, Field field, ValidationContext context)
    {
      ...
    }
}
于 2017-03-21T18:17:15.237 回答