Skip to content

Commit 2eddd70

Browse files
authored
Merge pull request #388 from akomm/master
Fix for #387
2 parents 86f50c6 + 21a51d2 commit 2eddd70

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

src/Resolver/AccessResolver.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use GraphQL\Executor\Promise\Adapter\SyncPromise;
88
use GraphQL\Executor\Promise\Promise;
99
use GraphQL\Executor\Promise\PromiseAdapter;
10+
use GraphQL\Type\Definition\ListOfType;
11+
use GraphQL\Type\Definition\ResolveInfo;
1012
use Overblog\GraphQLBundle\Error\UserError;
1113
use Overblog\GraphQLBundle\Error\UserWarning;
1214
use Overblog\GraphQLBundle\Relay\Connection\Output\Connection;
@@ -59,7 +61,9 @@ function ($result) use ($accessChecker, $resolveArgs) {
5961

6062
private function processFilter($result, $accessChecker, $resolveArgs)
6163
{
62-
if (\is_array($result)) {
64+
/** @var ResolveInfo $resolveInfo */
65+
$resolveInfo = $resolveArgs[3];
66+
if (\is_array($result) && $resolveInfo->returnType instanceof ListOfType) {
6367
$result = \array_map(
6468
function ($object) use ($accessChecker, $resolveArgs) {
6569
return $this->hasAccess($accessChecker, $object, $resolveArgs) ? $object : null;

tests/Functional/App/config/access/mapping/access.types.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ RootQuery:
66
user:
77
type: User
88
resolve: '@=resolver("query")'
9+
youShallNotSeeThisUnauthenticated:
10+
type: SecureField
11+
access: '@=isFullyAuthenticated()'
12+
resolve: '@=[]'
913

1014
Mutation:
1115
type: object
@@ -48,6 +52,17 @@ User:
4852
interfaces: [Human]
4953
isTypeOf: true
5054

55+
SecureField:
56+
type: object
57+
config:
58+
fields:
59+
secretValue:
60+
type: String!
61+
resolve: 'top secret'
62+
youAreAuthenticated:
63+
type: Boolean!
64+
resolve: '@=isFullyAuthenticated()'
65+
5166
friendConnection:
5267
type: relay-connection
5368
config:

tests/Functional/Security/AccessTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,41 @@ public function testNotAuthenticatedUserAccessToUserName(): void
9191
$this->assertResponse($this->userNameQuery, $expected, static::ANONYMOUS_USER, 'access');
9292
}
9393

94+
public function testNonAuthenticatedUserAccessSecuredFieldWhichInitiallyResolvesToArray(): void
95+
{
96+
$expected = [
97+
'data' => [
98+
'youShallNotSeeThisUnauthenticated' => null,
99+
],
100+
'extensions' => [
101+
'warnings' => [
102+
[
103+
'message' => 'Access denied to this field.',
104+
'locations' => [
105+
[
106+
'line' => 2,
107+
'column' => 3,
108+
],
109+
],
110+
'path' => ['youShallNotSeeThisUnauthenticated'],
111+
'category' => 'user',
112+
],
113+
],
114+
],
115+
];
116+
117+
$query = <<<'EOF'
118+
{
119+
youShallNotSeeThisUnauthenticated {
120+
secretValue
121+
youAreAuthenticated
122+
}
123+
}
124+
EOF;
125+
126+
$this->assertResponse($query, $expected, static::ANONYMOUS_USER, 'access');
127+
}
128+
94129
public function testFullyAuthenticatedUserAccessToUserName(): void
95130
{
96131
$expected = [

0 commit comments

Comments
 (0)