Git Product home page Git Product logo

Comments (8)

pgutkowski avatar pgutkowski commented on August 19, 2024 1

Hi @StefanHUB and @AlphonseSantoro

You can use Context in resolvers of queries, extension properties and transformations (I have to update the documentation), see:

fun `client code can use context class in property resolver`(){

But if I understand correctly, you would like to declare "resolver" for Kotlin properties as well, with access to property and context?

DSL example (not implemented yet):

type<Actor> {
                property(Actor::name) {
                    resolver { actor : Actor, ctx: Context ->
                        if(ctx.get<UserData>()?.canAccessActorName){
                            actor.name
                        } else {
                            throw UnauthorizedAccessException()
                        }
                    }
                }
}

Would this solve your use case?

from kgraphql.

shamresh avatar shamresh commented on August 19, 2024

Can you give a use case of where this would be used? (I am new to GraphQL and Kotlin :))

from kgraphql.

StefanLiebig avatar StefanLiebig commented on August 19, 2024

The context could hold a security context which could be used to check permissions, e.g. restrict visibility of data.

from kgraphql.

AlphonseSantoro avatar AlphonseSantoro commented on August 19, 2024

You can access the context by using

type<Post>{
    property(Post::id){
        accessRule { post, ctx ->
            if(post.id == ctx.get<String>()) null else IllegalAccessException()
        }
    }
}

and

query("black_mamba") {
    resolver { -> Player("KOBE") }
    accessRule { ctx -> if (ctx.get<String>().equals("LAKERS")) null else IllegalAccessException() }
}

What I'm missing is that you can access the properties and context in the query itself.
e.g. I want a user to be able to read all posts but i dont want the user to edit posts of other users

from kgraphql.

StefanLiebig avatar StefanLiebig commented on August 19, 2024

Ah, ok - Thanks!

.. but i dont want the user to edit posts of other users

Is this about mutations?

from kgraphql.

AlphonseSantoro avatar AlphonseSantoro commented on August 19, 2024

Is this about mutations?

Both, it's about accessing properties in each query/mutation.
When using the first example I gave, the access rule applies to all queries/mutations to that type. As of now i can't see there is any property access on query/mutation level.

from kgraphql.

StefanLiebig avatar StefanLiebig commented on August 19, 2024

Ok, I got your point! I have not yet used mutations, so I did not stumble upon this problem.

This 'accessRule' looks nice, but it prevents my use case. I do not want to do the permission checking in the graphql layer but a little bit deeper in the 'data' layer because a parallel REST-API also uses this 'data' layer.

So I would like to have the possibility to pass the context (more precise: just the authorization part of it) to the 'data' layer. The suspendResolver/resolver function inside a query accepts a context object as parameter so that I can forward it:

    query("timeEntries") {
        suspendResolver { ctx: Context, year: Int?, month: Int?, userId: UserId?, topicFK: Int?, timeEntryTypeFK: Int? ->
            // forward "ctx" to the "data" layer.
        }
    }

Unfortunatlly, this is not possible with the property resolver.

from kgraphql.

NataliiaVallander avatar NataliiaVallander commented on August 19, 2024

UPDATE: Working from locally built version. Probably last release is too old
@pgutkowski This works, but still there is a problem -- schema became invalid. I am getting this in qraphiql:
Error: Invalid or incomplete schema, unknown type: null. Ensure that a full introspection query is used in order to build a client schema.
As I understand this is because Context become input type which is not defined.
If I am trying to define it as Input Type am getting an error that generic classes are not supported from handleInputValues method.
Do you have any suggestions how to fix this?

from kgraphql.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.